从QMake运行程序/脚本

时间:2010-08-31 19:02:14

标签: qt makefile qmake nmake

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

答案 0 :(得分:14)

看起来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

答案 1 :(得分:6)

试试system() command。例如:

system(pwd)

答案 2 :(得分:5)

这是另一种解决方案:

TEMPLATE = aux
OBJECTS_DIR = ./
DESTDIR = ./

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

模板aux基本上生成一个makefile,在没有指定目标的情况下运行时不执行任何操作。 OBJECTS_DIRDESTDIR变量设置为当前目录,以防止qmake创建debugrelease目录(将它们设置为./非常重要不只是.;至少在Windows上)。然后,使用QMAKE_EXTRA_TARGETS,我们重新定义目标first,以便在没有目标的情况下调用makefile时运行自定义命令。

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

<强>增加: 如果您想阻止生成三个makefile(MakefileMakefile.DebugMakefile.Release),可以添加

CONFIG -= debug_and_release

但是,如果你使用它并且取决于如何调用makefile(总是手动调用,由父目录的“subdirs”* .pro文件调用,...),可能需要创建假的{{1} }和debug目标是为了避免“没有规则来制作目标...”错误。例如:

release

答案 3 :(得分:1)

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

regular.pro:

SOURCES += main.cpp
TARGET = regular.exe

external.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