我在教自己GNU Make,并想看看Redis Makefile会教我一两个关于这个工具的东西。
将源文件编译为目标文件的规则是here:
%.o: %.c .make-prerequisites
$(REDIS_CC) -c $<
请注意,后缀规则只是提到C源文件(带有%.c)作为先决条件。
但如果我在中间添加一个回声并运行make:
%.o: %.c .make-prerequisites
echo $^
$(REDIS_CC) -c $<
然后make的输出的前几行如下所示:
cd src && make all
make[1]: Entering directory `/home/cltpadmin/code/redis/src'
echo adlist.c .make-prerequisites adlist.h zmalloc.h
adlist.c .make-prerequisites adlist.h zmalloc.h
CC adlist.o
make
如何知道adlist.c
取决于adlist.h
和zmalloc.h
?
答案 0 :(得分:2)
有问题的先决条件来自Makefile.dep
包含的makefile第一行(包含在第134行)。
第136行的dep
目标生成该文件。
使用编译器生成必要的头文件包含这是一个相当普遍(尽管完全可以避免)的步骤。我认为这种静态方法也存在条件头问题。
为了澄清,“可避免”部分是它根本不需要是一个单独的步骤和一个静态依赖文件。有关此想法的详细信息,请参阅Advanced Auto-Dependency Generation。