【发布时间】:2010-07-02 17:00:09
【问题描述】:
我有一个从相同源文件构建多个目标的小项目。目标需要使用不同的编译标志构建源文件。这实际上是在 cygwin 上,所以我将使用它作为具体示例,尽管我认为这是一个通用问题。
所以这将是一个 Makefile 示例:
a: CFLAGS =
a: a.o c.o
b: CFLAGS = -mno-cygwin
b: b.o c.o
这在原则上是有效的,构建 a 将在未设置 CFLAGS 的情况下进行编译,而构建 b 将在 CFLAGS 设置为 -mno-cygwin 的情况下进行编译。但前提是 c.o 不存在。
这样做
> make a b
在原始目录中将首先使用空的 CFLAGS 编译 a.c 和 c.c。然后它将尝试使用 CFLAGS=-mno-cygwin 构建 b。但是由于 c.o 已经存在,它不会重新编译 c.c 导致链接器错误,因为目标文件需要具有相同的此标志设置。
同样,cygwin-flag 只是一个具体的例子,我正在寻找一个通用的解决方案。
我尝试的是引入一个额外的目标来检查当前的 CFLAGS,如果不匹配则删除所有目标文件:
ARCH = `echo $(CFLAGS)`
checkTarget:
-@if test "`cat .arch`" != "$(ARCH)"; then \
rm *.o; \
/bin/echo -n $(ARCH) > .arch; \
fi
将此目标作为两个目标的依赖项插入可确保在需要时重新编译所有目标文件。
a: CFLAGS =
a: checkTarget a.o c.o
b: CFLAGS = -mno-cygwin
b: checkTarget b.o c.o
然而,这会重新编译 每个 目标文件,这是不必要的,并且在更大的项目中会成为问题。
有没有更好的方法来做到这一点?
编辑: 在单个答案的 cmets 中包含一个提示,您可以使目标文件依赖于 CFLAGS 的内容。我不知道该怎么做,除了将它们放到一个临时文件中并与以前的文件进行比较,然后将其复制到一个依赖文件上。有没有更好的办法?
【问题讨论】:
标签: makefile