如果makefile更改,如何强制make运行干净的目标

如果makefile更改,如何强制make运行干净的目标,makefile,Makefile,如果makefile发生更改,make将重建所有目标,对吗 但是如何告诉make如果makefile更改后,它将运行makeclean,然后运行make 或者如何指示make在这种情况下运行其他命令?我必须写一种特殊的目标吗?您可以尝试以下方法: all: Makefile.uptodate yourMainTarget Makefile.uptodate: Makefile make clean touch Makefile.uptodate 我不是make专家,所以我不知

如果makefile发生更改,make将重建所有目标,对吗

但是如何告诉make如果makefile更改后,它将运行
makeclean
,然后运行
make

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

您可以尝试以下方法:

all: Makefile.uptodate yourMainTarget

Makefile.uptodate: Makefile
    make clean
    touch Makefile.uptodate
我不是
make
专家,所以我不知道这是否是一个可怕的黑客行为,但它在我有限的测试中起了作用;-)

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


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

FORCE:
请看

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

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

您是仅使用GNU make,还是使用另一个make程序?make文件更改后进行重建不是真的-请看,这将中断并行生成(使用
-j
),因为它可能会在为
您的MainTarget
生成的同时运行
make clean
“这将中断并行生成”对的要修复此问题,请向
yourMainTarget
添加一个依赖项,如下所示:
yourMainTarget:Makefile.uptodate
。然后以类似的方式将其添加到所有其他目标中,例如编译C/C++代码或其他东西的
.o
文件。这将迫使它在开始构建
yourMainTarget
或其任何依赖项之前解析
Makefile.Update
target下的命令,从而允许在编译任何东西或运行任何东西之前完成清理。我认为最后不需要
$(MAKE)
;这应该由Makefile的初始条目来处理。对吗?聪明地使用
包括
%.o : %.cpp FORCE
    $(CXX) -c $(CXXFLAGS) $< -o $@