我有这样的设置:
/Makefile
/foo/Makefile
/foo/bar/Makefile
/foo/baz/Makefile
顶级Makefile包含一个调用/foo/Makefile
的任务。此Makefile在子目录中创建一个makefile列表(示例中为bar
,baz
)。对于每个子目录,它调用Makefile:
$(SUB_DIRS):
$(MAKE) -C $@
对于all
任务来说,这很好。但如果我想做别的事,我就会陷入困境。 是否有可能将目标传递给子制作文件列表?例如:
$(SUB_DIRS):
$(MAKE) -C $@ <task>
clean: $(SUB_DIRS)-clean # or something?
或者我的整个概念是错的?
答案 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