在工作中,我们使用其他makefile包含的通用makefile(通过include语句),它有一个通用的"干净"目标,可以杀死一些常见文件.我想在我的新makefile中添加到该目标,这样我就可以删除一些特定的文件,但是如果我在makefile中添加一个干净的目标,它只会覆盖旧的目标.
我知道我可以用一个新的名字制作一个新的目标并让它调用干净,然后做其他的东西,但为了保持一致性,我希望能够调用make clean并让它做所有事情.
那可能吗?
Eri*_*ski 65
我在几家商店见过这件事.最常见的方法是使用双冒号规则,假设您正在使用类似GNU make的东西.在你的常见makefile中你会有这样的东西:
clean::
# standard cleanup, like remove all .o's:
rm -f *.o
Run Code Online (Sandbox Code Playgroud)
请注意,有两个冒号clean,而不只是一个!
在您的其他makefile中,您只需clean再次声明,作为双冒号规则:
clean::
# custom cleanup, like remove my special generated files:
rm -f *.h.gen
Run Code Online (Sandbox Code Playgroud)
当你调用时make clean,GNU make将自动运行干净规则的这两个"分支":
% make clean
rm -f *.o
rm -f *.h.gen
Run Code Online (Sandbox Code Playgroud)
设置起来很简单,我认为它的构图非常整齐.请注意,特别是因为它是双冒号规则,当您为同一目标定义两个规则时,通常不会遇到"覆盖命令"错误.这就是双冒号规则的重点.
Bet*_*eta 34
你可以写自己的清洁,并使其成为普通清洁的前提.
clean: myclean
myclean:
rm whatever
你的先跑.如果出于某种原因,您希望首先运行公共清理,那么解决方案将更加复杂.
使用隐式规则:
existing-target: my-extention
my-extention:
echo running command 1
echo running command 2
Run Code Online (Sandbox Code Playgroud)
使用:: 时,您可能会遇到问题,因为在混合单冒号:和双冒号::规则时 make 会抱怨:
a:
echo a
a::
echo aa
Run Code Online (Sandbox Code Playgroud)
将导致:
. . .
*** target file `a' has both : and :: entries. Stop.
Run Code Online (Sandbox Code Playgroud)
看起来普通的makefile规则应该被称为类似的东西common-clean.然后每个主makefile都将其清理规则声明为
clean: common-clean
Run Code Online (Sandbox Code Playgroud)
而且你已经定下来了.
如果这不是一个选项,你可以看看双冒号规则,但那些引入了另外一组要考虑的问题.