如何使makefile依赖于构建选项

时间:2010-10-22 13:32:12

标签: c++ makefile build-automation gnu-make

很久以前,我记得使用了一些Solaris make,他们有一个巧妙的选项可以自动检测编译器选项何时发生了变化,并适当地重建所有规则。例如,假设我从:

切换

g ++ -O3

g ++ -g

然后应重新编译所有文件。我正在使用gnu make,并没有找到这样的任何功能,并且想知道是否有人有办法让它工作。

3 个答案:

答案 0 :(得分:4)

使用gmake实现此目的的简单方法是将gcc选项写入文件。然后,在Makefile中,将这些选项读取到变量,在gcc命令行中使用此变量,并将所有目标文件的依赖项添加到此选项文件中(可以在模式规则中完成) )。

答案 1 :(得分:1)

只需让你的目标依赖于makefile本身:

all: a.out

a.out: boo.c Makefile
        cc -O3 -g boo.c

答案 2 :(得分:1)

这是执行此操作的基本方法(虽然我确信这是可怕的想法,请参阅下文):

-include CFLAGS.save

CFLAGS := -O2 -g

all: foo

CFLAGS.save:
    echo 'CFLAGS_SAVE := $(CFLAGS)' > $@
ifeq ($(CFLAGS),$(CFLAGS_SAVE))
%.o: %.c CFLAGS.save
    gcc $(CFLAGS_SAVE) -c -o $@ $<
else
.PHONY: CFLAGS.save
%.o: %.c CFLAGS.save
    $(MAKE) $@
endif

foo: foo.o
    gcc -o $@ $^

以下是发生的事情:在完成任何编译之前,当前CFLAGS将写入CFLAGS.save。如果CFLAGS不等于CFLAGS_SAVE,则用户必须已更改它们。如果是这样,我们声明CFLAGS.save是虚假的,因此make将重建它。另请注意,如果CFLAGS已更改,我们会更新它,但我们仍会在内存中保留旧值。因此,我们必须以递归方式为每个源文件调用make。在一个大项目上并不酷。

另一个问题是,如果您忽略在命令行上指定CFLAGS,它将返回并使用默认值重建所有内容。你可以通过测试$(origin)的{​​{1}}来解决这个问题,但严重的是,没有。我的职业道德不允许我代表这一点。

CFLAGS意味着简单。分销商已经在理解打包者滥用构建工具方面遇到了足够的麻烦(遗憾的是,make的大部分责任归咎于此)。请对Cthulhoid构建系统说“不”。

此外,automake也可以正常工作。