GNU Make获取父目标名称

时间:2015-05-19 18:50:18

标签: makefile 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"

1 个答案:

答案 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;直到达到目标为止。