【问题标题】:How to add custom targets in a qmake generated Makefile?如何在 qmake 生成的 Makefile 中添加自定义目标?
【发布时间】:2010-09-23 08:15:37
【问题描述】:
我使用 qmake 生成 Makefile,效果很好。但是,有时我想在生成的 Makefile 中添加更多内容,而无需编辑生成的 Makefile。
假设我们在源代码旁边有一个 Doxygen 目录,我需要在其中运行一些 doxygen 命令来生成文档。因此,将它作为主 Makefile 中的目标会很好。但是作为默认的 qmake 不理解这种额外的东西。
那么我可以添加一些内容来告诉 qmake 在“doxygen”目录中包含辅助 Makefile,或者直接在 qmake 配置中添加“额外目标”吗?
可能是这样的:
【问题讨论】:
标签:
makefile
gnu-make
qmake
【解决方案1】:
我正在处理同样的问题,到目前为止,我使用 QMAKE_EXTRA_TARGETS 变量来构建 docs 目标的成功有限,如下所示:
docs.depends = $(SOURCES)
docs.commands = (cat Doxyfile; echo "INPUT = $?") | doxygen -
QMAKE_EXTRA_TARGETS += docs
其中 Doxyfile 具有基本的 doxygen 配置设置减去我通过 'echo' 附加的 INPUT 符号,以仅包含 $(SOURCES) 中未满足的 Makefile 依赖项。
这种方法似乎有效,因为它只为已更改的源文件重新创建文档,这很好,但我遇到了另一个问题,即我的 qmake 项目文件是使用 debug_and_release CONFIG 选项构建的,因此它会生成 Makefile、Makefile。调试和 Makefile.Release 但 SOURCES 仅在调试和发布 Makefile 中定义,这迫使我明确地执行 make -f Makefile.Debug docs 而不是更简单直观的 make docs 来构建文档。
以前有人从 QMAKE_EXTRA_TARGETS 的角度解决过这个问题吗?
【解决方案2】:
这是一个老问题,但无论如何我都会添加一个答案。
虽然在 qmake 中似乎没有对自定义规则的一般支持,但有一个简单的方法可以做到这一点,假设 GNU make。只需创建一个名为 makefile 的文件(全部小写):
include Makefile
re: clean
$(MAKE) all
最后两行是我的自定义规则。
GNU make 将使用 makefile,而不是 Makefile,如果两者都存在的话。
顺便说一句,re 规则解决了“make -j8 clean all”的问题。此命令将在完成清理之前开始执行所有操作。 re 规则保证了顺序性。
【解决方案3】:
这里提到的未记录选项怎么样http://paulf.free.fr/undocumented_qmake.html
在添加 doxygen 目标下可以找到以下内容:
# custom target 'doc' in *.pro file
dox.target = doc
dox.commands = doxygen Doxyfile; \
test -d doxydoc/html/images || mkdir doxydoc/html/images; \
cp documentation/images/* doxydoc/html/images
dox.depends =
...
# somewhere else in the *.pro file
QMAKE_EXTRA_UNIX_TARGETS += dox
这是一个解决方案吗?
【解决方案4】:
This Qt blog post 非常明确地回答了 QMAKE_EXTRA_COMPILERS 和 QMAKE_EXTRA_TARGETS 的问题。
很快我们就会被介绍给QBS.. 来自 Digia 和 Qt 社区的新 Qt Build Suite.. 希望它经过深思熟虑(就此而言,有据可查)。