2012-10-12 90 views
1

我有以下hypthetical生成文件变量扩展:混乱在生成文件

all: SOURCE = $(wildcard src/*.cpp) 
unity: SOURCE = $(wildcard unity/*.cpp) 

OBJECTS = $(SOURCE:.cpp=.o) 

all: prog 

unity: prog 

prog: $(OBJECTS) 
    $(CXX) $(OBJECTS) -o prog 

我需要与基于初始目标不同的源文件/对象进行编译。在我看来,变量扩展在依赖关系上比在目标机构中发生得早得多,因为上面的编译器命令被称为正确的文件名,但prog依赖项中的$ OBJECTS仍然是空的,因此没有任何对象建成。

统一文件夹包含一个组合的源文件,其中包含所有其他源文件以进行统一构建。这个统一文件是由makefile生成的,但是这被遗漏了,实际上可能是多个统一目标文件。

我的设计是失败的原因吗?我将不得不求助于递归制作来实现这一点?

+0

我很确定你想要的是不可能的,但是我已经生成了动态头依赖关系覆盖与make文件集成,并且从来没有想过这也是可能的。看一看[gnu make](http://www.gnu.org/software/make/manual/)文档。你不可能像你喜欢的那样扩展,但也许可以为你自己创建其他目标。它需要变得非常狡猾,但几乎任何事情都可能发生在make文件中。 – WhozCraig

+0

关于“统一文件夹”的段落很不清楚。如果你澄清它,我敢打赌我们可以找到解决方案。 – Beta

回答

1

你不能那样做。因为一般来说,可能有多个目标需要建立。在命令行上,或作为中间目标。 因此设置该变量将会很困难。因此,目标特定变量的值“仅在目标的命令脚本(以及其他特定于目标的赋值)的上下文中可用。” (参见文件:make.info,节点:目标特定)

但是你可以检查MAKECMDGOALS变量。

0

根据执行的目标,您不能使用$ SOURCE来表示不同的内容。 你可以得到的makefile有很好的理解这里解析: http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles

对于你的问题,你必须定义不同的变量,每种类型的源文件。 例如:

all: SOURCE_ALL = $(wildcard src/*.cpp) 
unity: SOURCE_UNITY = $(wildcard unity/*.cpp) 

OBJECTS_ALL = $(SOURCE_ALL:.cpp=.o) 
OBJECTS_UNITY = $(SOURCE_UNITY:.cpp=.o) 
etc ... 
1

你正在运行到的问题是,在规则中的变量以上(目标和相关性列表)时,makefile文件被读出,被扩展而变量指标(如您的$(来源设置) )只有当触发器被触发时才被设置。这意味着特定于目标的变量仅在ACTIONS中有用,因为这是设置后唯一发生的事情。

这一切都表示,可以通过递归调用使得到你想要的效果:

all: 
     $(MAKE) SOURCE="$(wildcard src/*.cpp)" prog 
unity: 
     $(MAKE) SOURCE="$(wildcard unity/*.cpp)" prog 

OBJECTS = $(SOURCE:.cpp=.o) 

prog: $(OBJECTS) 
     $(CXX) $(OBJECTS) -o prog 

.PHONY: all unity 

,但是这不是我一般会建议。