我有以下makefile:
CCC = g++ CCFLAGS = -ansi driver: driver.o graph.o $(CCC) -o driver driver.o graph.o graph.o: graph.h driver.o: graph.h adjl: rm -f graph.h graph.cc ln -s adjl/graph.cc . ln -s adjl/graph.h . touch graph.cc graph.h adjm: rm -f graph.h graph.cc ln -s adjm/graph.cc . ln -s adjm/graph.h . touch graph.cc graph.h clean: rm -f *.o real_clean: clean rm -f graph.cc graph.h rm -f driver
我的想法是我尝试链接两个不同的.cc / .h文件,具体取决于我想要使用的实现。如果我make_clean,没有.cc / .h文件存在,我只有一个driver.cc文件和文件夹中的makefile。如果我打电话给make,它说它们是最新的。即使我在adjl / adjm中编辑文件以使它们成为“更新”版本,也会发生这种情况。
[95]% ls adjl/ adjm/ driver.cc makefile [96]% make adjl make: `adjl' is up to date. [97]% make adjm make: `adjm' is up to date.
我从我做过的另一个项目中获取了模板makefile,并且它们以相同的方式编写,但我可以重复生成相同的命令而没有“最新”问题。
我用谷歌搜索但没有发现类似于我的问题(它们通常似乎涉及在制作之前没有清洁的用户)。
感谢任何人阅读。
答案 0 :(得分:21)
问题是您的目录名称与Makefile中的目标相同。
当您发出make adjl
对其找到但未执行任何操作的文件adjl
进行检查时。
将目标重命名为其他内容并重试。
答案 1 :(得分:10)
adjl
和adjm
目标是真正的目标。由于它们没有依赖关系,并且存在文件(列表中的2个目录),因此make不会执行任何操作(因为它们存在)。
但是,您想要的是将adjl
和adjm
指定为伪目标(以便在指定命令时执行这些命令)。为此,
.PHONY: adjl adjm
阅读http://www.gnu.org/software/automake/manual/make/Phony-Targets.html了解详情。
修改强>
事实上,real_clean
和clean
规则也可能是虚假的。
答案 2 :(得分:3)
您的目录与目标同名。
由于您的目标不依赖于任何内容,因此它们始终被视为最新目标。
指定未链接到磁盘上文件的目标时,需要使用特殊目标.PHONY
:
.PHONY: adjl adjm
你也应该为clean和real_clean目标做同样的事情 - 否则如果有人创建了一个名为“clean”的文件,它们就会中断。