在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目标,它只被调用一次,我不知道为什么。
我有以下的选择,但我认为第一个是最好的
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, $@)
.PHONY : all clean common
all:
@echo $@ " enter"
$(MAKE) -f makefile common
clean:
@echo $@ " enter"
$(MAKE) -f makefile common
common:
@echo $@ " enter"
答案 0 :(得分:0)
这让我感到震惊,因为这里有两个问题,标题中的一个问题,另一个问题在详细解释时漏掉了。
回答标题中的问题:抓住导致变更的目标,使用remake。
例如,使用您提供的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>
上面我们碰巧从我们要检查的目标开始。如果情况并非如此,您可以使用&#34;断点&#34;命令设置断点,&#34;继续&#34;直到达到目标为止。