包含依赖于目标的文件
问题描述:
我有一个Makefile,其中包含来自子目录的makefile。 但是,我想要的是在选定的目标基础上包含这些“子”制作文件。包含依赖于目标的文件
背景是,子生成文件定义了不同的目标文件,并根据这些目标文件创建目标可执行文件。
假设子makefile1设置变量
OBJECTS := foo.o foo1.o
子makefile2设置
OBJECTS := bar.o bar1.o
和通用规则将是:
lib/%.so: $(OBJECTS) link $^ -o [email protected]
的目标是(例如) :
foo: lib/foo.so
bar: lib/bar.so
而目标foo应该包含foo makefile,目标栏bar-makefile。
任何想法如何处理这种情况?
感谢, 基督教
答
你问的具体的东西 - 条件包含 - 在做出艰难。它可以完成,但它不是优雅的。
有几种方法可以获得所需的效果。您可以在MAKECMDGOALS上使用条件。您可以让您的makefile调用第二个makefile,并将其传递给要使用的子目录的名称。但是,(不知道更多的情况),我觉得这种方式是最整洁:
include sub-makefile1
FOO_OBJECTS := $(OBJECTS)
include sub-makefile2
BAR_OBJECTS := $(OBJECTS)
lib/%.so:
link $^ -o [email protected]
lib/foo.so: $(FOO_OBJECTS)
lib/bar.so: $(BAR_OBJECTS)
foo bar : % : lib/%.so
(你可能是聪明的变量名状foo_OBJECTS
节省一两行,但我建议不要这一点。)
答
Beta版已经提到$(MAKECMDGOALS)
,但没有描述它:
ifeq ($(MAKECMDGOALS),foo)
include sub-makefile1
endif
ifeq ($(MAKECMDGOALS),bar)
include sub-makefile2
endif
# Rest of Makefile follows...
这不是个好主意,因为当make
被称为交互它只会工作。您可以为foo
和bar
解决这个黑客通过使规则递归调用make
:
ifeq ($(MAKECMDGOALS),foo)
include sub-makefile1
foo: # ...
# Normal commands to build foo
else
foo:
$(MAKE) $<
endif
ifeq ($(MAKECMDGOALS),bar)
include sub-makefile2
bar: # ...
# Normal commands to build bar
else
bar:
$(MAKE) $<
endif
谢谢您的回答!实际上,我并不知道我不需要lib /%。so:规则的先决条件,或者实际上它们是从lib/foo.so:规则转发的。静态模式规则的东西对我来说也是新的。你的例子正是我所寻找的。 – 2010-11-22 13:45:05