有没有办法指定,在.pro文件中,要添加到标准目标的额外命令Makefile that qmake
产生?例如,考虑distclean
,可能需要额外的命令来:
- Remove *~ files.
- 从源树中清除运行时生成的输出文件。
- Etc.
我想使用普通目标而不是自定义目标,因为我希望这在我的工作流程中完全透明。那就是(再次使用distclean
作为一个例子),我不想...
- ...需要一定的多项目设置知识生成文件使用自定义规则代替
distclean
.
- ... document custom rules, even for stand-alone projects, as
distclean
is already well-known http://www.gnu.org/software/make/manual/html_node/Standard-Targets.html and intuitive†.
I found 如何在 qmake 生成的 Makefile 中添加自定义目标? https://stackoverflow.com/questions/3776476,但这描述了添加自定义目标(即已经记录在案 http://doc.qt.io/qt-5/qmake-advanced-usage.html, even 回到4.6 http://doc.qt.digia.com/4.6/qmake-environment-reference.html#customizing-makefile-output)而不是向现有目标添加规则。虽然它确实包含一些提示,但所有这些提示都需要添加新的自定义目标,因为在一个文件中多次指定同一目标Makefile替换(不添加)来自先前目标的命令。
我唯一真正能想到尝试的就是添加target.commands += new commands
to the .pro文件作为一个疯狂的猜测(例如distclean.commands += rm \"*~\"
)。这没有效果。
如何透明地将自定义命令添加到现有目标qmake
?
† For the distclean
example: While maintainer-clean
is also on that "standard target" list, in practice I have found it to be rarely used, and in any case qmake
doesn't generate it by default; I consider it to be unsuitable.
有两种简单的方法可以实现此目的,具体取决于您希望解决方案的独立性/可移植性以及您希望对命令执行顺序的宽松程度。
Option 1
第一个选项是在中创建自定义目标.pro文件中包含新命令,然后将该目标作为先决条件添加到您正在修改的标准目标中。回到distclean
例如,假设您要添加一个命令来删除所有*~ files:
-
在您的中创建自定义目标.pro文件。请注意,您必须转义引号和斜杠.pro文件。例如,添加:
extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
-
将此目标添加为您正在修改的目标的依赖项:
distclean.depends = extraclean
这实际上不会修改distclean
规则还没有,因为此方法不能用于修改现有规则。然而...
-
将新目标和正在修改的目标添加为额外目标:
QMAKE_EXTRA_TARGETS += distclean extraclean
这将添加第二个规范distclean
to the Makefile
,但这可行,因为您可以将依赖项添加到现有目标中make在单独的规则中,即使您不能以这种方式添加命令 https://www.gnu.org/software/make/manual/html_node/Multiple-Rules.html#Multiple-Rules。如果您还指定distclean.commands
在你的.pro文件,你会破坏现有的distclean
通过替换其默认配方。
所以,把所有这些放在一起,在.pro file:
extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
distclean.depends = extraclean
QMAKE_EXTRA_TARGETS += distclean extraclean
Where extraclean
是一些自定义目标,其中包含您要添加的命令,以及distclean
是您要修改的现有目标。
Pros:
- 完全独立于一个.pro file.
- 尽可能便携,保留实际Makefile语法和生成高达
qmake
.
Cons:
- 您的新命令不是appended到现有的食谱。相反,它们发生在满足所有先决条件目标之后,但是before现有的食谱。在里面
distclean
例如,版本为qmake
我正在使用的,这将命令放置在源树干净之后但之前Makefile本身被删除(这是默认配方采取的唯一操作)。对于本示例来说这不是问题,但对您来说可能是个问题。
Option 2
第二个选项是更改名称Makefile that qmake
生成并创建您自己的自定义Makefile that defers到生成的,而不是包含 + 覆盖它。这也是一个简单的选择;虽然不像选项 1 那样独立,但它使您能够在默认生成的配方之前和之后执行命令。
您不想包含+覆盖现有的Makefile,因为您不想替换默认食谱。如果这样做,您必须重新实现默认值,但这可能是一个问题,因为默认值可能会更改(并且您必须跟上更改)。最好让qmake
尽可能多地完成工作,而不是重复工作。
去做这个:
-
首先,更改文件名qmake
生成。这可以通过在.pro file:
MAKEFILE = RealMakefile
这会导致qmake
输出真正的Makefile代替Makefile.
-
下一步是创建您自己的Makefile
使用您的自定义命令。然而,这里有一些警告。首先,一个完整的例子,再次使用distclean
。在一个名为Makefile
:
.DEFAULT_GOAL := all
%:
@$(MAKE) -f RealMakefile $@
distclean:
@$(MAKE) -f RealMakefile $@
@find . -name "*~" -exec rm -v {} \;
关于此的一些注意事项:
- We set
.DEFAULT_GOAL
因为否则distclean
将是默认值。如果您对此不满意,可以选择替代方案.DEFAULT_GOAL
, 是指定一个all
规则使用@$(MAKE) -f RealMakefile $@
作为食谱。
- The
%
目标匹配任何未在此定义的目标Makefile。它只是将处理委托给真正的Makefile.
- The
distclean
target 是我们添加命令的地方。我们仍然需要委托给真正的Makefile,但是可以在发生之前和之后添加其他命令。
Pros:
- 对命令顺序的更多控制。可以在默认配方之前和之后添加命令。
Cons:
- 不是独立的.pro.
- 不那么便携:它不会留下所有Makefile世代高达
qmake
,而且我实际上也不确定哪些部分是 GNU 特有的make
在这里(欢迎评论)。
因此,虽然这个答案可能有点长,但这两种方法都非常简单。我更喜欢选项 1,除非命令执行顺序有问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)