Running a program/script from QMake

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)


Arn*_*nce 8

尝试使用system()命令.例如:

system(pwd)
Run Code Online (Sandbox Code Playgroud)

  • 有趣。那行得通,但是命令在运行'qmake'时而不是在运行'nmake'时运行。它也恰好运行了三次,而不是真正应该运行一次。 (2认同)

Ign*_*tor 5

这是另一个解决方案:

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_DIRDESTDIR变量设置为当前目录,以防止QMAKE创建debugrelease目录(其将它们设置为很重要./,而不仅仅是.;至少在Windows上).然后,使用QMAKE_EXTRA_TARGETS,我们重新定义目标,first以便在没有目标的情况下调用makefile时运行自定义命令.

它有点hacky但它​​完成了工作.

另外: 如果你要防止三种生成文件(生成Makefile,Makefile.Debug,Makefile.Release),你可以添加

CONFIG -= debug_and_release
Run Code Online (Sandbox Code Playgroud)

但是,如果你使用它并且取决于如何调用makefile(总是手动调用,由父目录的"子目录"*.pro文件调用,...),可能需要创建假debugrelease目标以避免"没有规则"制造目标......"错误.例如:

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)