我已经浏览了许多关于递归makefile的帖子。无论是我做错了什么还是我想要的缺失功能。使用典型的makefile,我可以检查它是否与-q
过时,例如:
make -q || echo "out of date"
但是,设置强制make来处理依赖的makefile的机制会导致根makefile始终过时。这是一个有效的例子:
#./Makefile
all: myfile
myfile: dir
cp dir/myfile .
.PHONY: dir
dir:
$(MAKE) -C dir/
#./dir/Makefile
all: myfile
myfile:
touch myfile
#testing...
>>> make
make -C dir/
make[1]: Entering directory `dir'
touch myfile
make[1]: Leaving directory `dir'
cp dir/myfile .
>>> make
make -C dir/
make[1]: Entering directory `dir'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `dir'
cp dir/myfile . #<-- this shouldn't be necessary
>>> make -q || echo "out of date"
make -C dir/
out of date
是否有一种机制允许递归调用返回并说“实际上所有内容都是最新的,无需继续&#34;
答案 0 :(得分:2)
有一种黑客的做法,也许吧。
您可以从makefile中调用$(MAKE) -q ... && touch something
,并将something
文件作为外部makefile中某些规则的必备条件。
答案 1 :(得分:1)
不,没有办法做到这一点。 make的递归调用只是在shell中调用的另一个命令:该命令可用的唯一结果是退出代码。如果我们总能确保调用的命令是make命令,并且我们使用-q
标志,那么我们可以假设如果它以0退出,那么什么也没做。但是,make并没有假设那些东西。
您需要将您的makefile重写为非递归才能获得所需的行为。
答案 2 :(得分:0)
@Dacav给了我明确调用make的想法。虽然不使用临时文件,但可以使用shell填充变量动态设置目标依赖项。我不确定以下是一个好的解决方案,因为即使在没有make
的情况下调用-q
,它也会递归调用make -q
来填充OLD_CHILDREN
。此外,对于子makefile也会不必要地再次发生这种情况(假设有多级递归)。
#./Makefile
CHILDREN=dir/
OLD_CHILDREN=$(foreach c, $(CHILDREN), $(shell make -q -C $(c) || echo $(c)))
all: myfile
myfile: $(OLD_CHILDREN)
cp dir/myfile .
.PHONY: $(CHILDREN)
$(CHILDREN):
$(MAKE) -C $@
...测试
>>> make -q || echo out of date
make -C dir/
make: *** [dir/] Error 1 #huh??? whatever. still works, returning out of date
out of date
>>> make
make -C dir/
make[1]: Entering directory `dir'
touch myfile
make[1]: Leaving directory `dir'
cp dir/myfile .
>>> make
make: Nothing to be done for `all'.
>>> make -q || echo out of date
>>> #nothing. success :D