有没有一种方法可以在.pro文件中指定要添加到生成的Makefile中的标准目标的其他命令qmake
?例如,考虑distclean
,可能需要其他命令来:
我想使用普通目标而不是自定义目标,因为我希望它在我的工作流程中是完全透明的。那是(再次distclean
用作示例),我不想...
distclean
。distclean
已经众所周知并且很直观†。我发现了如何在qmake生成的Makefile中添加自定义目标?,但这种描述添加自定义的目标(这是已经记录在案,甚至早在4.6),而不是将规则添加到现有的目标。尽管确实包含一些提示,但所有提示都需要添加新的自定义目标,因为在Makefile中多次指定同一目标会替换(而非添加)来自先前目标的命令。
我唯一想到的就是尝试target.commands += new commands
将.pro文件添加为一个疯狂的猜测(例如distclean.commands += rm \"*~\"
)。这没有作用。
如何使用透明地向现有目标添加自定义命令qmake
?
† 对于distclean
例如:虽然maintainer-clean
也是“标准的目标”清单上,在实践中我发现它很少使用,并且在任何情况下,qmake
默认情况下不产生它; 我认为这不合适。
有两种简单的方法可以完成此任务,具体取决于您希望解决方案的独立性/可移植性以及对命令执行顺序的宽容度。
第一种选择是在.pro文件中为新命令创建一个自定义目标,然后将该目标作为前提条件添加到要修改的标准目标中。回到distclean
示例,假设您要添加一条命令以删除所有*〜文件:
在您的.pro文件中创建一个自定义目标。请注意,您必须在.pro文件中转义引号和斜杠。例如,添加:
extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
将此目标添加为要修改的目标的依赖项:
distclean.depends = extraclean
实际上,这实际上还不会修改distclean
规则,因为该方法不能用于修改现有规则。然而...
将新目标和要修改的目标都添加为额外目标:
QMAKE_EXTRA_TARGETS += distclean extraclean
这将添加第二个规范distclean
的Makefile
,但是这个作品,因为你可以添加依赖于现有的指标make
在不同的规则,即使你不能添加命令那样。如果还要distclean.commands
在.pro文件中指定,则可以distclean
通过替换其默认配方来破坏现有文件。
因此,将所有内容放到.pro文件中:
extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
distclean.depends = extraclean
QMAKE_EXTRA_TARGETS += distclean extraclean
extraclean
您要添加命令的一些自定义目标在哪里,并且distclean
是您想要修改的现有目标。
优点:
qmake
。缺点:
distclean
示例中,使用的qmake
是我使用的版本,这会将命令放置在源代码树干净之后但删除Makefile本身之前(这是默认配方所采取的唯一操作)。对于此示例,这不是问题,但可能对您来说是一个问题。第二个选项是改变名称的Makefile是qmake
生成,并创建自己的自定义的Makefile是推迟到生成的一个,而不是包括+覆盖它。这也是一个简单的选择。虽然不像选项1那样独立,但它使您能够在默认生成的配方之前和之后执行命令。
您不想包括+覆盖现有的Makefile,因为您不想替换默认配方。如果这样做,则必须重新实施默认设置,但这可能是一个问题,因为该默认设置可能会更改(并且您必须跟上所做的更改)。最好让qmake
我们尽可能多地工作,而不要重复工作。
去做这个:
首先,更改qmake
生成的文件的名称。这可以通过在.pro文件中添加如下一行来实现:
MAKEFILE = RealMakefile
这将导致qmake
输出RealMakefile而不是Makefile。
下一步是Makefile
使用自定义命令创建自己的命令。但是,这里有一些警告。首先,是一个完整的示例,再次使用distclean
。在名为的文件中Makefile
:
.DEFAULT_GOAL := all
%:
@$(MAKE) -f RealMakefile $@
distclean:
@$(MAKE) -f RealMakefile $@
@find . -name "*~" -exec rm -v {} \;
关于此的一些注意事项:
.DEFAULT_GOAL
是因为否则distclean
将是默认设置。如果您不满意,则另一种选择.DEFAULT_GOAL
是指定一条all
规则@$(MAKE) -f RealMakefile $@
作为配方。%
目标匹配是不是否则在此定义的任何目标的Makefile。它只是将处理委托给RealMakefile。distclean
目标是我们添加我们的命令。我们仍然需要委托给RealMakefile,但是可以在发生这种情况之前和之后添加其他命令。优点:
缺点:
qmake
,并且我实际上也不确定make
在这里哪些部分特定于GNU (欢迎发表评论)。因此,虽然这个答案可能有点长,但是这两种方法都非常简单。除非命令执行顺序有问题,否则我希望使用选项1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句