GNU Make获取父目标名称
在GNU make中,是否有办法获得启动整个链条并引导执行到当前配方的原始目标?
.PHONY : all clean common
all: common
clean: common
common:
@echo $@
@echo $(MAKECMDGOALS)
@for a in $$(ls); do
if [ -d $$a ]; then
echo -C $$a $(MAKECMDGOALS);
#$(MAKE) -C $$a $(MAKECMDGOALS);
fi;
done;
@echo "Done!"
就像在上面的例子中,当我运行'make all'或'make clean'时,我可以使用$(MAKECMDGOALS)来告诉从命令行传递给哪个目标。 但是,如果有人称之为'全部清理',那么'普通'会被调用一次,我们会'做':没有什么可以做'干净'的。
那么,是否有一种方法可以在每次被引用为目标的先决条件时调用“通用”,并计算出源目标名称,以便将其传递到下一个make中? 尽管'普通'是PHONY的目标,但它只被调用一次,我不知道为什么。
我有以下选择,但我认为第一个是最好的
makefile 1
just_a_func = @echo "just_a_func from " $(1)
.PHONY : all clean
all:
@echo $@ " enter"
$(call just_a_func, $@)
clean:
@echo $@ " enter"
$(call just_a_func, $@)
makefile 2
.PHONY : all clean common
all:
@echo $@ " enter"
$(MAKE) -f makefile common
clean:
@echo $@ " enter"
$(MAKE) -f makefile common
common:
@echo $@ " enter"
它让我感到震惊,因为这里有两个问题,一个是标题中的问题,另一个问题是在阐述问题时溜进来的。
回答标题中的问题:获取导致更改的目标,请使用重拍。
例如,使用您提供的Makefile:
$ remake -X -f Makefile
GNU Make 4.1+dbg0.91
...
Reading makefiles...
Updating makefiles....
Updating goal targets....
File 'PHONY' does not exist.
File 'all' does not exist.
-> (/tmp/Makefile:5)
common:
remake<0> T
=>#0 common at /tmp/Makefile:5
#1 all at /tmp/Makefile:2
#2 PHONY at /tmp/Makefile:1
remake<1> quit
$ remake -X -f Makefile clean
GNU Make 4.1+dbg0.91
...
Reading makefiles...
Updating makefiles....
Updating goal targets....
File 'clean' does not exist.
-> (/tmp/Makefile:5)
common:
remake<0> T
=>#0 common at /tmp/Makefile:5
#1 clean at /tmp/Makefile:3
remake<1>
上面我们碰巧从我们想要检查的目标开始。 如果不是这种情况,可以使用“断点”命令来设置断点,然后“继续”运行,直到达到目标。
链接地址: http://www.djcxy.com/p/64123.html