我有一个makefile,它从命令行获取一个变量并将其传递给编译器(对于C ++预处理器)。
以下是代码:
bar=0
file.o: foo.cpp
ifeq($(bar), 0)
g++ file.cpp -D foo=1 -o file.o
else
g++ file.cpp -D foo=0 -o file.o
endif
问题是跑完后
make bar=0
然后
make bar=1
它说foo.o是最新的(它是,但我希望它重建,因为在代码中更改了变量)。
答案 0 :(得分:2)
如果使用Make
进行强制重建或清理,则毫无意义。这里正确的方法是实现一个"可靠的变量",其行为类似于文件。如果bar
是一个变量,你可以说
file.o: foo.cpp bar
(your recipe here)
这意味着,如果"内容" (值{} bar
更改,重建。
有关如何实现可靠变量的详细信息,请参阅我的帖子
答案 1 :(得分:1)
您可以使用Phony目标强制编译器重建它。 好主意是定义清洁功能。然后使用:
重新编译项目make clean
make all
答案 2 :(得分:1)
如果你想保持简单并且不介意将额外的文件作为标记,你可以做到
bar = 0
MARKER = compiled_with_foo_
file.o: $(MARKER)_$(bar)
ifeq($(bar), 0)
rm -f $(MARKER)_1
else
rm -f $(MARKER)_0
endif
g++ -c file.cpp -D foo=$(bar) -o file.o
$(MARKER)_$(bar): file.cpp
touch $@
让clean
删除这两个标记。