很久以前,我记得使用了一些Solaris make,他们有一个巧妙的选项可以自动检测编译器选项何时发生了变化,并适当地重建所有规则。例如,假设我从:
切换g ++ -O3
到
g ++ -g
然后应重新编译所有文件。我正在使用gnu make,并没有找到这样的任何功能,并且想知道是否有人有办法让它工作。
答案 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
也可以正常工作。