我正在调查same question here,但我不清楚我在问什么,即使对我自己也是如此。对于那些花时间回答我不明确问题的人抱歉。
让我们再尝试一个更现实的例子。我们考虑这个结构:
.
├── Makefile
└── src/
├── bar
├── foo
└── Makefile
主Makefile是:
all: src/foobar
src/foobar:
make -C $(dir $@)
子makefile是:
foobar: foo bar
join $^ > $@
如果我是第一次运行make(来自./
),一切都按预期工作,生成foobar
。
$ make
make -C src/
make[1]: Entering directory '/project/src'
join foo bar > foobar
make[1]: Leaving directory '/project/src'
$ make
make: Nothing to be done for 'all'.
但是,如果我触摸任何foobar
依赖项。父Makefile
将不会重新生成目标。在这里,我完全理解Make的行为,但我想告诉它要注意foobar
'依赖。
$ touch src/foo
$ make
make: Nothing to be done for 'all'.
我目前的解决方案不是很整洁,就是要求依赖。所以src/Makefile
变为:
src=foo bar
foobar: $(src)
@echo "Joining"
join $^ > $@
files: $(src)
@echo $^
./Makefile
:
all: src/foobar
src=$(addprefix src/,$(shell make --no-print-directory -C src files | tr '\n' ' '))
src/foobar: $(src)
make -C $(dir $@)
我还必须说,仅使用单个Makefile
可以简化此特定示例。我的真实例子相当复杂。 src/Makefile
生成可执行文件,而父Makefile
执行许多其他操作(以特定格式打包,生成文档,构建其他子makefile等)。因此,我希望将这些任务分开,我需要不同的Makefiles
。
答案 0 :(得分:1)
在主Makefile
中为始终需要构建的子目标或目录创建依赖项,然后让子项Make进行实际工作。
这里有一个很好的例子:http://owen.sj.ca.us/~rk/howto/slides/make/slides/makerecurs.html。
要翻译您的案例,请将您的主Makefile
更改为:
all: src/foobar
src/foobar: force
$(MAKE) $(MFLAGS) -C src
force:
true
我还添加了$(MFLAGS)
,它会将相同的标记从父级传递给子级make
。