覆盖makefile中的目标以添加更多命令?

Pau*_* D. 41 makefile

在工作中,我们使用其他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)

设置起来很简单,我认为它的构图非常整齐.请注意,特别是因为它是双冒号规则,当您为同一目标定义两个规则时,通常不会遇到"覆盖命令"错误.这就是双冒号规则的重点.

  • 我只是在寻找这个,就我而言,双冒号是完美的解决方案。非常感谢! (2认同)

Bet*_*eta 34

你可以写自己的清洁,并使其成为普通清洁的前提.

clean: myclean

myclean:
    rm whatever

你的先跑.如果出于某种原因,您希望首先运行公共清理,那么解决方案将更加复杂.

  • @Dave Rawks,你误解了,我写的内容会进入*local*makefile,而不是普通的makefile.此外,有两个目标名称是OP说他不想要的.双冒号的想法很聪明,虽然它涉及修改公共makefile(并且不允许本地makefile覆盖通用规则). (4认同)

Boh*_*dan 6

使用隐式规则:

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)


jam*_*san 5

看起来普通的makefile规则应该被称为类似的东西common-clean.然后每个主makefile都将其清理规则声明为

clean: common-clean
Run Code Online (Sandbox Code Playgroud)

而且你已经定下来了.

如果这不是一个选项,你可以看看双冒号规则,但那些引入了另外一组要考虑的问题.