很久以前,我记得使用过一些Solaris make工具,它们有一个巧妙的选项,可以自动检测编译器选项是否已更改,并相应地重新构建所有规则。例如,假设我从以下选项切换:
g++ -O3
到
g++ -g
那么所有文件都应该重新编译。我正在使用GNU make,并没有发现类似这样的功能,想知道是否有人有办法使其工作。
g++ -O3
到
g++ -g
那么所有文件都应该重新编译。我正在使用GNU make,并没有发现类似这样的功能,想知道是否有人有办法使其工作。
gmake
实现这一点的简单方法是将gcc
选项写入文件。然后,在Makefile
中将这些选项读取到一个变量中,在gcc
命令行中使用此变量,再将所有对象文件的依赖关系添加到此选项文件中(可以在模式规则中完成)。CFLAGS
变量(或者对于 C++ 来说是 CXXFLAGS
)。 - Bart van Ingen SchenauCFLAGS
变量的问题在于你会覆盖同名的shell环境变量。 - Didier Trossetcat <.compile.txt
<br>if $(COMPILE) != $(LASTCOMPILE)
<br> echo $(COMPILE) >.compile.txt
这样行吗? - DovCFLAGS
变量将一些选项从命令行设置到Makefile中,那么你不能这样做,因为Makefile会覆盖它。 - Didier Trosset-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
,它将返回并使用默认值重新构建所有内容。您可以通过测试CFLAGS
的$(origin)
来解决此问题,但是,说实话,不行。我的职业道德不允许我容忍这种情况。
make
的目的是要简单。发行商已经足够困扰于理解打包工具的滥用(可悲的是,大部分对automake
的指责都是因为这个原因)。请拒绝使用克苏鲁式的构建系统。
此外,make clean all CFLAGS='-Whatever -foo'
同样有效。
只需让您的目标依赖于Makefile本身:
all: a.out
a.out: boo.c Makefile
cc -O3 -g boo.c
$^
,那么Makefile现在也会被包含在内。 - user663031