包含依赖于目标的文件

问题描述:

我有一个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节省一两行,但我建议不要这一点。)

+0

谢谢您的回答!实际上,我并不知道我不需要lib /%。so:规则的先决条件,或者实际上它们是从lib/foo.so:规则转发的。静态模式规则的东西对我来说也是新的。你的例子正是我所寻找的。 – 2010-11-22 13:45:05

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

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

# Rest of Makefile follows... 

这不是个好主意,因为当make被称为交互它只会工作。您可以为foobar解决这个黑客通过使规则递归调用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