2015-04-26 65 views
1

我正在编译一些项目与依赖关系,所以我不必每次重新编译,但是当我将-Dsome_flags添加到我的CFLAGS时,它不会重新编译。如何在更改Makefile标志时强制重新编译?

dep: $(CPPS) 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

我加入到我的CFLAS -DDEBUG_FLAG中,它迫使我做出干净的,而不是make。

+0

您修改生成文件,它不重新编译? –

+0

您可能根本不需要依赖关系生成器规则。 http://stackoverflow.com/a/7358961/412080 –

回答

1

最简单的,在我看来,将做一个make clean,然后make。这当然假设您希望由于编译器标志更改而重新编译所有源文件。但你似乎不喜欢这种方法。

如果你想修改Makefile,您可以在生成文件的名称添加到每个规则编译源文件,例如:

somefile.o : somefile.cpp <makefile_name> 
      $(CC) -c $(CFLAGS) somefile.cpp -o somefile.o 

%.o : %.c <makefile_name> 
      $(CC) -c $(CFLAGS) somefile.cpp -o somefile.o 

鉴于大小该项目和涉及的规则数量,做make clean; make可能是最简单和最快的方法。然而,一如既往,你的里程我变化。

只是我的$ 0.02的价值,希望它有助于 T.

+0

这几乎是我在实践中看到的方法。 –

+0

如果标志因命令行更改而更改,则这不起作用。例如'make CFLAGS = -DDEBUG'不会重新编译任何东西。 –

+0

@KevinCox是的,你是对的。但请回顾一下如何进行工作,它将每个目标的上次修改时间戳与所有目标相关性的上次修改时间戳进行比较。如果其中一个依赖关系在上次构建目标后进行了修改,则目标将被重建。如果您在命令行上修改了一个标志(如您所建议的那样),则文件系统不会发生变化,并且您无法获得所需的重新编译。在这种情况下,使用'make clean''使CFLAGS = -DDEBUG'应该可以做到这一点 – thurizas

3

它不会重新编译,因为您没有将makefile本身列为依赖项。

dep: $(CPPS) Makefile 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

也就是说,如果你在化妆的标志命令行(例如CFLAGS=-O3 make all)喂养,make无法检测,你已经改变了这些,迫使一个完整的构建方式。

+0

你有办法克服命令行问题吗? – shd

+0

您提到的方法不起作用。 – shd

+0

无法克服命令行问题。 'make'无法记住它上次运行的方式。此外,您必须将'Makefile'更改为makefile所在的位置。 –

1

Makefile中查找基于它具有数据的变化。您的Makefile状态下的唯一依赖项定义在$(CPPS)

dep: $(CPPS) 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

因此,make只跟踪给定列表中的变化,即$(CPPS)。所以分辨率是:

dep: $(CPPS) Makefile 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

有关完整,但不复杂的例子,这是我的Makefile一个HelloWorld程序:

OBJS = helloworld.o 
default: hw 

%.o: %.c Makefile 
    gcc -c $< -o [email protected] 

hw: $(OBJS) 
    gcc $(OBJS) -o [email protected] 

clean: 
    -rm -f $(OBJS) hw 

每次我改变我的makefile它得到重新编译! :)

相关问题