如何将目标名称传递给子makefile文件列表?

时间:2014-05-16 17:58:26

标签: makefile gnu-make

我有这样的设置:

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

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

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

对于all任务来说,这很好。但如果我想做别的事,我就会陷入困境。 是否有可能将目标传递给子制作文件列表?例如:

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

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

或者我的整个概念是错的?

3 个答案:

答案 0 :(得分:7)

您只需使用$(MAKECMDGOALS)变量。

  

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

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

您也可以使用$(foreach )这样的功能:

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

答案 1 :(得分:3)

我终于明白了。方法是:

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/

答案 2 :(得分:0)

是的,你只是按照规定进行操作,当你想要做某事并且可能再次进行递归时,乐趣会在下一级处理。

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

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