gpt4 book ai didi

makefile - 如何告诉 make 观察子 make 目标的依赖关系?

转载 作者:行者123 更新时间:2023-12-02 03:24:13 24 4
gpt4 key购买 nike

我正在调查 same question here ,但我不是很清楚我在问什么,即使是对我自己。对于那些花时间回答我不清楚的问题的人,我们深表歉意。

那么让我们用一个更现实的例子再试一次。我们考虑这种结构:

.
├── Makefile
└── src/
├── bar
├── foo
└── Makefile

主要的 Makefile 在哪里:

all: src/foobar    
src/foobar:
make -C $(dir $@)

子生成文件是:

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

最佳答案

在主 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

关于makefile - 如何告诉 make 观察子 make 目标的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31293557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com