【问题标题】:How to force make to run clean target if makefile changed如果makefile更改,如何强制make运行干净的目标
【发布时间】:2011-08-24 11:23:07
【问题描述】:

如果 makefile 发生变化,make 会重新构建所有目标,对吗?

但是如何告诉 ma​​ke 如果在 makefile 改变之后,它应该运行make clean 然后make

或者在这种情况下如何指示 make 运行其他命令?我必须写一种特殊的目标吗?

【问题讨论】:

标签: makefile


【解决方案1】:

可以试试这个:

all: Makefile.uptodate yourMainTarget

Makefile.uptodate: Makefile
    make clean
    touch Makefile.uptodate

我不是 make 专家,所以我不知道这是否是一个可怕的 hack,但它在我有限的测试中有效;-)

【讨论】:

  • 这将中断并行构建(使用-j),因为它可能在为yourMainTarget 构建的同时运行make clean
  • ^ "这将中断并行构建" 正确。要修复,请将依赖项添加到 yourMainTarget,如下所示:yourMainTarget: Makefile.uptodate <the rest of your dependencies>。然后也以类似的方式将其添加到所有其他目标,例如.o 用于编译 C/C++ 代码之类的文件。这将强制它在开始构建yourMainTarget 或其任何依赖项之前解析Makefile.uptodate 目标下的命令,这允许清理在例如之前完成。编译任何东西或运行任何东西。
【解决方案2】:

粗鲁但有效(我想不出比这更优雅的了):

include marker

marker: Makefile
    @touch $@
    $(MAKE) clean
    $(MAKE)

【讨论】:

  • 我认为你最后不需要$(MAKE);这应该由 Makefile 的初始条目处理。正确的?聪明地使用include
【解决方案3】:

我相信您希望自动运行 clean,因为您希望在调用 make 时重新构建某些目标。这可以通过将名为FORCE 的依赖项添加到您要始终构建其目标的规则中来实现,然后像这样定义FORCE:即没有规则也没有依赖项。

FORCE:

请看http://www.gnu.org/software/make/manual/make.html#Force-Targets

如果要重新编译所有文件,请将以下内容添加到 makefile:

%.o : %.cpp FORCE
    $(CXX) -c $(CXXFLAGS) $< -o $@

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多