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

上一篇: GNU Make get parent target name

下一篇: Examples for "How make file is read"