包含依赖于目标的文件

时间:2010-11-19 13:38:16

标签: makefile

我有一个Makefile,其中包含子目录中的makefile。 但是,我想要的是在选定目标的基础上包含这些“sub”-makefiles。

背景是,子makefile定义了不同的目标文件,并且根据这些目标文件,应该创建目标可执行文件。

假设sub-makefile1设置变量

OBJECTS := foo.o foo1.o

sub-makefile2 sets

OBJECTS := bar.o bar1.o

通用规则是:

lib/%.so: $(OBJECTS)
    link $^ -o $@

目标是(例如):

foo: lib/foo.so
bar: lib/bar.so

而target foo应包含foo makefile,target bar为bar-makefile。

知道如何处理这种情况吗?

谢谢, 基督教

2 个答案:

答案 0 :(得分:3)

Beta提到$(MAKECMDGOALS),但没有描述它:

ifeq ($(MAKECMDGOALS),foo)
include sub-makefile1
endif
ifeq ($(MAKECMDGOALS),bar)
include sub-makefile2
endif

# Rest of Makefile follows...

这不是一个好主意,因为只有在交互式调用make时它才会起作用。您可以通过为递归调用foo的{​​{1}}和bar制定规则来解决此问题:

make

答案 1 :(得分:2)

你要求的具体事情 - 条件包含 - 在Make中很难。它可以做到,但它并不优雅。

有几种方法可以达到你想要的效果。您可以在MAKECMDGOALS上使用条件。您可以让makefile调用第二个makefile,并将其传递给要使用的子目录的名称。但是(不知道更多情况)我认为这种方式是最整洁的:

include sub-makefile1
FOO_OBJECTS := $(OBJECTS)

include sub-makefile2
BAR_OBJECTS := $(OBJECTS)

lib/%.so:
    link $^ -o $@

lib/foo.so: $(FOO_OBJECTS)

lib/bar.so: $(BAR_OBJECTS)

foo bar : % : lib/%.so

(你可以聪明地使用foo_OBJECTS等变量名来保存一两行,但我建议不要这样做。)