我有一个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。
知道如何处理这种情况吗?
谢谢, 基督教
答案 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
等变量名来保存一两行,但我建议不要这样做。)