1. 从SDK到Vitis:一个让无数开发者“踩坑”的路径问题
大家好,我是小梅哥。搞过Zynq或者MPSoC开发的朋友,估计都经历过从Xilinx SDK到Vitis IDE的“阵痛期”。在SDK时代,日子过得还算安稳,我们创建自定义IP,Vivado工具链会自动帮我们生成一个“能用”的Makefile,放在IP驱动目录里。这个Makefile虽然简陋,但至少能保证编译通过,把我们的驱动代码打包成静态库。
但自从切换到Vitis之后,很多朋友就遇到了一个让人头疼的编译错误,提示找不到文件路径,编译直接中断。我第一次遇到的时候也懵了,心想:“我路径明明是对的,文件也在,怎么就找不到了?” 后来深入研究才发现,这其实是Vitis在“偷懒”,或者说,它对开发者的要求更高了。它不再像SDK那样提供一个“保姆级”的、能应付所有情况的Makefile,而是给了一个非常基础的、静态的模板。这个模板在IP驱动源文件(.c和.h)发生变化时,比如你新增了一个驱动函数文件,或者删除了一个旧文件,它就会立刻“罢工”。
问题的根源,就藏在这个默认生成的Makefile里。它用了最原始的静态通配符,比如 INCLUDEFILES=*.h 和 LIBSOURCES=*.c。这种写法在Makefile执行的那一刻,就会把当前目录下所有匹配的.h和.c文件立即展开成一个固定的列表。之后无论你怎么增删文件,这个列表都不会变。当Vitis尝试根据这个过时的列表去查找依赖、编译对象时,自然就报“No rule to make target”之类的错了。
这其实是一个典型的静态路径管理与动态开发需求之间的矛盾。我们的开发过程是动态的,文件会变,而Makefile却是静态的,这就导致了脱节。所以,我们需要亲手改造这个Makefile,把它从一个“死”的模板,变成一个能“感知”文件系统变化的智能构建脚本。接下来,我就带你一步步深入这个Makefile的内部,看看怎么给它动手术。
2. 解剖“问题”Makefile:三大致命缺陷
要解决问题,首先得看清问题。我们打开Vitis为自定义IP生成的默认Makefile文件,路径通常位于 你的IP核目录/ip_repo/你的IP核名/drivers/你的IP核名_v1_0/src/Makefile。乍一看代码不多,但坑都埋在里面。
2.1 缺陷一:静态通配符的“刻舟求剑”
这是最核心的问题。原文件里通常有这样的语句:
INCLUDEFILES = *.h
LIBSOURCES = *.c
对于不熟悉Makefile的朋友,我打个比方。这就好比你去超市前写了个购物清单,上面写着“买水果”。到了超市,你严格按照清单,只拿了苹果、香蕉(因为写清单时你只想到了这些)。结果回家后发现,其实你还想吃新上市的草莓和芒果,但清单上没有,你就“认为”自己不需要买。Makefile里的 *.h 和 *.c 就是这个“买水果”。在执行 make 命令的瞬间,它会把当前目录下当时存在的所有 .h、.c 文件名展开,替换掉通配符。之后你新增一个 new_feature.c,Makefile根本不知道,它的“记忆”还停留在过去。
2.2 缺陷二:对象文件路径的“混乱不堪”
第二个问题在对象文件(.o文件)的生成路径上。
OUTS = *.o
这行代码意图是收集所有对象文件,但它没有指定这些 .o 文件应该放在哪里。默认情况下,它们会被生成在和源文件相同的 src 目录下。这会导致几个麻烦:
- 污染源目录:编译生成的中间文件(
.o文件)和你的源代码混在一起,不便于管理。 - 清理困难:当你执行
make clean时,如果clean规则写得不好,可能会误删源文件。 - 潜在的打包错误:在最终将
.o文件打包成静态库(libxil.a)时,可能会把其他目录残留的、不相关的.


937

被折叠的 条评论
为什么被折叠?



