Makefile并不总是重建

时间:2014-10-30 11:47:43

标签: c++ makefile

我有一个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是最新的(它是,但我希望它重建,因为在代码中更改了变量)。

3 个答案:

答案 0 :(得分:2)

如果使用Make进行强制重建或清理,则毫无意义。这里正确的方法是实现一个"可靠的变量",其行为类似于文件。如果bar是一个变量,你可以说

file.o: foo.cpp bar
    (your recipe here)

这意味着,如果"内容" (值{} bar更改,重建。

有关如何实现可靠变量的详细信息,请参阅我的帖子

How do I add a debug option to Makefile

答案 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删除这两个标记。