如何在Makefile更改后强制让make运行clean目标

12

如果 makefile 文件更改,那么 make 命令会重新构建所有目标,对吧?

但是如何告诉 make 命令,在 makefile 文件更改后运行 make clean 命令,然后再运行 make 命令呢?

或者如何指示 make 在这种情况下运行其他命令?我是否需要编写一种特殊的目标?


你是只使用GNU make,还是使用其他的make程序? - Jonathan Leffler
2
重新构建(rebuild)并不会在修改 makefile 后自动进行 - 参见 https://dev59.com/YW865IYBdhLWcg3wUs_z - reinierpost
3个回答

4

您可以尝试这样做:

all: Makefile.uptodate yourMainTarget

Makefile.uptodate: Makefile
    make clean
    touch Makefile.uptodate

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


3
еҰӮжһңдҪҝз”Ё-jиҝӣиЎҢ并иЎҢзј–иҜ‘пјҢиҝҷдјҡеҜјиҮҙй”ҷиҜҜпјҢеӣ дёәеҸҜиғҪеҗҢж—¶иҝҗиЎҢmake cleanе’ҢyourMainTargetзҡ„жһ„е»әгҖӮ - C0deH4cker
“这将会在并行构建中出现问题”是正确的。为了解决这个问题,需要像这样向yourMainTarget添加一个依赖项:yourMainTarget: Makefile.uptodate <the rest of your dependencies>。然后以类似的方式将其添加到所有其他目标中,例如编译C/C++代码的.o文件等。这将强制在开始构建yourMainTarget或其任何依赖项之前解析Makefile.uptodate目标下的命令,从而允许清理在编译或运行任何内容之前完成。 - Keith M

4

简单却有效(我想不到更优雅的词语):

include marker

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

我认为你不需要在结尾处使用 $(MAKE);这应该由 Makefile 的初始条目处理。对吧?使用 include 很聪明! - Keith M

2

我相信你想自动运行clean,因为每次调用make时都希望重新构建特定的目标。可以通过向要始终构建其目标的规则添加名为FORCE的依赖项来实现此目的,然后像这样定义FORCE:即无规则和依赖项。

FORCE:

请参考http://www.gnu.org/software/make/manual/make.html#Force-Targets。 如果您想重新编译所有文件,请将以下内容添加到makefile中:
%.o : %.cpp FORCE
    $(CXX) -c $(CXXFLAGS) $< -o $@

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接