【问题标题】:How to pass target name to list of sub-makefiles?如何将目标名称传递给子生成文件列表?
【发布时间】:2014-05-16 17:58:25
【问题描述】:

我有这样的设置:

/Makefile
/foo/Makefile
/foo/bar/Makefile
/foo/baz/Makefile

顶层 Makefile 包含一个调用 /foo/Makefile 的任务。此 Makefiles 在子目录(示例中为barbaz)中创建一个makefile 列表。对于每个子目录,它调用 Makefile:

$(SUB_DIRS):
    $(MAKE) -C $@

这对于all 任务来说很好。但是如果我想做别的事情,我就会卡住。 是否有可能将目标传递给子 makefile 列表? 例如:

$(SUB_DIRS):
    $(MAKE) -C $@ <task>

clean: $(SUB_DIRS)-clean # or something?

还是我的整个概念错了?

【问题讨论】:

  • 我做过这样的事情,但我也对这个问题的其他解决方案感兴趣
  • 你不可能“做这样的事情”,因为没有解决方案。我的例子根本不起作用。
  • 你用的是什么版本的make,我就是这样做的

标签: makefile gnu-make


【解决方案1】:

您可以简单地使用MAKECMDGOALS 变量:

Make 会将特殊变量 MAKECMDGOALS 设置为您在命令行中指定的目标列表。如果命令行中没有给出目标,则该变量为空。

$(SUB_DIRS):
    +$(MAKE) -C $@ $(MAKECMDGOALS)

+ 符号很重要,因此底层 job server 还可以使用适当数量的线程/内核处理递归调用。


你也可以像这样使用$(foreach )函数:

clean:
    $(foreach DIR, $(SUB_DIRS), $(MAKE) -C $(DIR) $@;)

请注意 @musicmatze 在 cmets 中提到的 Make 标志(如 -j)不会在此处正确传递给子制作过程。

【讨论】:

  • 备案:这(MAKECMDGOALS 之一)是最干净的解决方案。我的解决方案也有效。 foreach 方法确实有效,但如果你想做make -j 4(例如)foreach 方法无法扩展,我猜。
【解决方案2】:

我终于搞定了。方法是:

SUB_DIRS        = $(wildcard */.)
SUB_DIRS_ALL    = $(SUB_DIRS:%=all-%)
SUB_DIRS_TEST   = $(SUB_DIRS:%=test-%)
SUB_DIRS_CLEAN  = $(SUB_DIRS:%=clean-%)

#
# Standard task
#
all: $(SUB_DIRS_ALL)

test_uml: $(SUB_DIRS_TEST)

clean: $(SUB_DIRS_CLEAN)

$(SUB_DIRS_ALL):
        @$(MAKE) $(MAKE_FLAGS) -C $(@:all-%=%)

$(SUB_DIRS_TEST):
        @$(MAKE) $(MAKE_FLAGS) -C $(@:test-%=%) test

$(SUB_DIRS_CLEAN):
        @$(MAKE) $(MAKE_FLAGS) -C $(@:clean-%=%) clean

我在这里找到了这个解决方案:http://lackof.org/taggart/hacking/make-example/

【讨论】:

  • 这与我发布的内容基本相同,只是在您无法使用目录名称本身时进一步推断。 (您需要为其添加前缀/后缀,然后在执行时去除前缀/后缀)。我经常几乎完全按照您的描述进行操作,并且不想逐字发布,因为我希望有人会提出我尚未发现的东西,例如 MAKECMDGOALS 来真正解决问题,而我个人并没有看到其中的价值它超出了我已经描述的范围。
【解决方案3】:

是的,您只需按照指定的方式进行操作,当您可能想要做某事并可能再次递归时,在下一级处理时会很有趣。

例如,我有一个这样的递归安装:

$(INSTALL_DIRS):
    $(MAKE) -C $@ install

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 2023-03-28
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多