在工作中,我们使用其他makefile包含的通用makefile(通过include语句),它有一个通用的“干净”目标,可以杀死一些常见文件。我想在我的新makefile中添加到该目标,这样我就可以删除一些特定的文件,但如果我在makefile中添加一个干净的目标,它就会覆盖旧的。
我知道我可以用一个新名字制作一个新目标并让它调用干净,然后做其他的东西,但为了保持一致性,我希望能够调用make clean并让它做所有事情
这可能吗?
答案 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