17

我们有一个相当大的代码库。绝大多数代码是使用 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

然后我必须让批处理文件像这样生成 placeholder.cpp:

# do the real work here
# ...
# create placeholder.cpp so qmake and nmake are happy
echo // dummy >> placeholder.cpp

这似乎工作正常。问题是它有点做作。如果我不指定batch_runner.target(即我将其留空)或不将placeholder.cpp 放在SOURCES 中,那么批处理文件永远不会运行。这是因为 qmake 没有使 batch_runner.commands 成为 Makefile 中任何其他依赖项的操作。

有没有更好的方法让 QMake 构建 Makefile 以便在 Makefile 执行时运行脚本?

4

4 回答 4

16

看起来 QMAKE_POST_LINK 很适合这种事情。

这似乎完成了工作。my_batch_file.bat 在 nmake 运行时运行(而不是在 qmake 运行时),我不需要对占位符目标或文件做任何有趣的事情。

我很可能不需要“配置”中列出的所有项目。

TEMPLATE = lib
TARGET   = 
CONFIG  += no_link target_predeps staticlib

QMAKE_POST_LINK  = my_batch_file.bat
QMAKE_CLEAN     += batch_output.obj
于 2010-09-02T12:16:48.043 回答
9

试试system() 命令。例如:

system(pwd)
于 2010-08-31T22:46:00.597 回答
6

这是另一个解决方案:

TEMPLATE = aux
OBJECTS_DIR = ./
DESTDIR = ./

first.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS += first
QMAKE_CLEAN += batch_output.obj

该模板aux基本上会生成一个生成文件,它在不指定目标的情况下运行时什么都不做。OBJECTS_DIRandDESTDIR变量设置为当前目录,以防止 qmake 创建anddebug目录release(将它们设置为./而不仅仅是.; 至少在 Windows 上很重要)。然后,使用QMAKE_EXTRA_TARGETS,我们重新定义目标first以在没有目标的情况下调用 makefile 时运行自定义命令。

这有点hacky,但它完成了工作。

补充: 如果要防止生成三个makefile(Makefile, Makefile.Debug, Makefile.Release),可以添加

CONFIG -= debug_and_release

但是,如果您使用它并且取决于如何调用 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 [...]
于 2013-04-24T09:47:35.220 回答
1

您可以使用 SUBDIRS 配置来运行多个不同的目标,即使是来自同一个 makefile。这可能对您的额外目标特别有效,因为子目录配置可以指定要运行的 makefile 中的特定目标(有关详细信息,请参阅未记录的 qmake)。在这种情况下,我会将所有“常规”构建命令放在一个 .pro 文件中,将外部构建命令放在另一个文件中,并使用一个子目录 .pro 文件来构建所有这些命令。我还没有测试过类似的东西,但它应该可以工作。

常规.pro:

SOURCES += main.cpp
TARGET = regular.exe

外部.pro:

batch_runner.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS   += batch_runner

other_runner.commands = other_batch_file.bat
QMAKE_EXTRA_TARGETS   += other_runner

do_it_all.pro:

TEMPLATE = subdirs
CONFIG += ordered

regular.file = regular.pro
SUBDIRS += regular

batch.file = external.pro
batch.target = batch_runner
SUBDIRS += batch

other.file = external.pro
other.target = other_runner
SUBDIRS += other
于 2010-09-01T18:52:00.357 回答