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

时间:2009-10-29 16:24:14

标签: makefile

在工作中,我们使用其他makefile包含的通用makefile(通过include语句),它有一个通用的“干净”目标,可以杀死一些常见文件。我想在我的新makefile中添加到该目标,这样我就可以删除一些特定的文件,但如果我在makefile中添加一个干净的目标,它就会覆盖旧的。

我知道我可以用一个新名字制作一个新目标并让它调用干净,然后做其他的东西,但为了保持一致性,我希望能够调用make clean并让它做所有事情

这可能吗?

6 个答案:

答案 0 :(得分:61)

我在几家商店看到过这种情况。最常见的方法是使用双冒号规则,假设您正在使用类似GNU make的东西。在你的常见makefile中你会有这样的东西:

clean::
        # standard cleanup, like remove all .o's:
        rm -f *.o

请注意,clean后面有两个冒号,而不只是一个!

在你的其他makefile中,你只需再次声明clean,作为双冒号规则:

clean::
        # custom cleanup, like remove my special generated files:
        rm -f *.h.gen

当您调用make clean时,GNU make将自动运行干净规则的这两个“分支”:

% make clean
rm -f *.o
rm -f *.h.gen

设置起来很简单,我觉得它很合理。请注意,特别是因为它是双冒号规则,当您为同一目标定义两个规则时,通常不会遇到“覆盖命令”错误。这就是双冒号规则的重点。

答案 1 :(得分:31)

您可以自己编写清洁并使其成为普通清洁的前提。

clean: myclean

myclean:
    rm whatever

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

答案 2 :(得分:5)

似乎应该将常见的makefile规则称为common-clean。然后每个主makefile都将其清理规则声明为

clean: common-clean

然后你就定了。

如果这不是一个选项,你可以看看double colon rules,但那些引入了另外一组问题。

答案 3 :(得分:4)

使用隐式规则:

existing-target: my-extention

my-extention:
    echo running command 1
    echo running command 2

Very simple make tutorial to ramp up.

使用 :: 时,您可能会遇到问题,因为当您混合使用单冒号和双冒号 :: 规则时会发出抱怨:< / p>

a:
    echo a

a::
    echo aa

将导致:

. . .
*** target file `a' has both : and :: entries.  Stop.

答案 4 :(得分:1)

对于我们的,我们定义一个变量EXTRAFILESTOCLEAN,然后当干净规则运行时,它有一个步骤来删除EXTRAFILESTOCLEAN变量中指定的任何内容

clean:
    rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
    rm -f $(EXTRAFILESTOCLEAN)
endif

如果将该变量设置为奇怪的值,可能会导致意外问题,但您可以通过添加前缀或其他测试来防范这些问题。

答案 5 :(得分:1)

添加另一个我见过的后代可能的解决方案......我知道OP对改变常见的makefile很谨慎,但这样的事情很有效,并且涉及的变化很小。

本地makefile 1:

CLEAN=MyExe1 MyExe2
....
include /my/common/makefile

本地makefile 2:

CLEAN=MyExe3 MyExe4
....
include /my/common/makefile

常见的makefile:

clean:
     rm -f *.dep *.o *.a $(CLEAN)

基本上,我们的想法是在每个本地makefile中定义一些变量(在本例中为CLEAN),其中包含您要删除的所有特定项。然后,公共makefile在要删除的所有常见文件类型上运行rm -f,以及通过CLEAN变量在每个本地makefile中专门标记为删除的内容。如果没有特定要删除的内容,只需省略变量声明或将其留空(CLEAN=

现在,如果我们为本地makefile 1运行make clean,它就会执行

rm -f *.dep *.o *.a MyExe1 MyExe2

如果我们为本地makefile 2运行make clean,它就会执行

rm -f *.dep *.o *.a MyExe3 MyExe4