调用其他makefile的Makefile总是过时的

时间:2014-08-26 11:07:30

标签: makefile

我已经浏览了许多关于递归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;

3 个答案:

答案 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