Makefile GNU使获取父目标名称

Makefile GNU使获取父目标名称,makefile,gnu-make,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); \

在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!"
在上面的示例中,当我运行“makeall”或“makeclean”时,我可以使用$(MAKECMDGOALS)来判断从命令行传递给make的是哪个目标。然而,如果有人将其称为“makeclean all”,那么只需调用一次“common”,我们就可以得到“make:nothindtomfor‘clean’”

那么,是否有一种方法可以在每次引用“common”作为目标的先决条件时调用它,并计算出原始目标名称,以便将其传递到下一个make?尽管“common”是一个虚假的目标,但它只被调用一次,我不知道为什么

我有以下几种选择,但我认为第一种是最整洁的

生成文件1 生成文件2
这让我感到震惊,因为这里有两个问题,一个在标题中,另一个在详细阐述问题时滑入

在回答如何解决标题中的问题:抓住导致改变的目标时,请使用

例如,使用您提供的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>
$remake-X-f Makefile
GNU Make 4.1+dbg0.91
...
正在读取生成文件。。。
正在更新生成文件。。。。
更新目标。。。。
文件“虚假”不存在。
文件“all”不存在。
->(/tmp/Makefile:5)
常见的:
翻拍
=>#0常见于/tmp/Makefile:5
#1全部位于/tmp/Makefile:2
#2假冒at/tmp/Makefile:1
翻拍退出
$remake-X-f使文件干净
GNU Make 4.1+dbg0.91
...
正在读取生成文件。。。
正在更新生成文件。。。。
更新目标。。。。
文件“clean”不存在。
->(/tmp/Makefile:5)
常见的:
翻拍
=>#0常见于/tmp/Makefile:5
#1在/tmp/Makefile处清理:3
翻拍

在上面,我们碰巧从我们想要检查的目标开始。如果不是这样,您可以使用“breakpoint”命令设置一个断点,然后“continue”运行直到达到目标。

这是某个顶级“驱动程序”生成文件的全部,只需将其委托给子目录生成文件即可?但这不应该运行两次
common
配方。将
touch$@
添加到配方中是否可以解决该问题?如果有人调用
makeclean all
,则。。。你想做什么?@EtanReisner,你是对的,这只运行了一次“公共”测试,这是我的一个实际问题,但miss在原始问题中表达了这一点。现在更正了。我不相信你可以多次运行给定的目标。在这里使用a可能是最好的主意。(基本上就是makefile 1中的内容。)(在make调用中要小心逗号周围的空格。它并不总是去掉逗号。)至于原始目标,你能得到的最接近的是。
.PHONY : all clean common
all:
    @echo $@ " enter"
    $(MAKE) -f makefile common

clean:
    @echo $@ " enter"
    $(MAKE) -f makefile common

common:
    @echo $@ " enter"
$ 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>