如何告诉make观看子制作目标的依赖关系?

时间:2015-07-08 13:02:53

标签: makefile

我正在调查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

1 个答案:

答案 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