Tom*_*nen 16 qt qmake nmake makefile
我们有一个相当大的代码库.绝大多数代码是使用qmake编译来生成makefile的.但是,有一些子项目可以通过运行批处理文件或运行其他程序来生成.
我希望能够使用qmake编译所有内容,但我无法弄清楚如何让qmake简单地运行脚本.
我尝试过的一件事是在我的专业文件中使用QMAKE_EXTRA_TARGETS,如下所示:
TEMPLATE = lib
SOURCES = placeholder.cpp
CONFIG += no_link staticlib
batch_runner.target = placeholder.cpp
batch_runner.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS = batch_runner
Run Code Online (Sandbox Code Playgroud)
然后我必须让批处理文件生成placeholder.cpp,如下所示:
# do the real work here
# ...
# create placeholder.cpp so qmake and nmake are happy
echo // dummy >> placeholder.cpp
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.麻烦的是它有些笨拙.如果我没有指定batch_runner.target(即我将其留空)或者没有将placeholder.cpp放在SOURCES中,则批处理文件永远不会运行.这是因为qmake没有使batch_runner.commands成为Makefile中任何其他依赖项的操作.
有没有更好的方法让QMake构造一个Makefile,以便在Makefile执行时运行脚本?
Tom*_*nen 15
看起来QMAKE_POST_LINK适用于此类事情.
这似乎完成了工作.mymaatch_file.bat在nmake运行时运行(而不是在qmake运行时运行)并且我不需要对占位符目标或文件做任何有趣的事情.
我很可能不需要'CONFIG'中列出的所有项目.
TEMPLATE = lib
TARGET =
CONFIG += no_link target_predeps staticlib
QMAKE_POST_LINK = my_batch_file.bat
QMAKE_CLEAN += batch_output.obj
Run Code Online (Sandbox Code Playgroud)
尝试使用system()命令.例如:
system(pwd)
Run Code Online (Sandbox Code Playgroud)
这是另一个解决方案:
TEMPLATE = aux
OBJECTS_DIR = ./
DESTDIR = ./
first.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS += first
QMAKE_CLEAN += batch_output.obj
Run Code Online (Sandbox Code Playgroud)
该模板aux基本上生成一个makefile,在运行时不执行任何操作而不指定目标.在OBJECTS_DIR与DESTDIR变量设置为当前目录,以防止QMAKE创建debug和release目录(其将它们设置为很重要./,而不仅仅是.;至少在Windows上).然后,使用QMAKE_EXTRA_TARGETS,我们重新定义目标,first以便在没有目标的情况下调用makefile时运行自定义命令.
它有点hacky但它完成了工作.
另外:
如果你要防止三种生成文件(生成Makefile,Makefile.Debug,Makefile.Release),你可以添加
CONFIG -= debug_and_release
Run Code Online (Sandbox Code Playgroud)
但是,如果你使用它并且取决于如何调用makefile(总是手动调用,由父目录的"子目录"*.pro文件调用,...),可能需要创建假debug和release目标以避免"没有规则"制造目标......"错误.例如:
release.target = release
release-clean.target = release-clean
release-install.target = release-install
[...]
debug.target = debug
debug-clean.target = debug-clean
debug-install.target = debug-install
[...]
QMAKE_EXTRA_TARGETS += release release-clean release-install [...]
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...]
Run Code Online (Sandbox Code Playgroud)