2010-08-31 88 views
13

我们有一个相当大的代码库。绝大多数代码是使用qmake编译生成makefile的。但是,有一些通过运行批处理文件或运行其他程序生成的子项目。从QMake运行程序/脚本

我希望能够使用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没有在Makefile中为batch_runner.commands做任何其他依赖的操作。

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

回答

14

它看起来像QMAKE_POST_LINK很适合这样的事情。

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

这很可能是我不需要'CONFIG'中列出的所有项目。

TEMPLATE = lib 
TARGET = 
CONFIG += no_link target_predeps staticlib 

QMAKE_POST_LINK = my_batch_file.bat 
QMAKE_CLEAN  += batch_output.obj 
6

尝试system() command。例如:

system(pwd) 
+1

有趣。这是有效的,但是当运行'qmake'而不是'nmake'运行时,命令会运行。它也恰好运行三次,而不是一次运行。 – 2010-09-01 12:38:18

+1

您可能需要添加一些范围以确保它只运行一次。 – 2010-09-01 12:41:39

+0

我只是将范围添加到示例中,以便在运行qmake时该命令仅运行一次。 – pixelgrease 2017-03-31 23:53:50

1

即使使用相同的生成文件,您也可以使用SUBDIRS配置运行多个不同的目标。这可能对您的额外目标特别有效,因为子目录配置可以指定makefile中的特定目标运行(有关详细信息,请参阅undocumented qmake)。在这种情况下,我会将所有“常规”构建命令放在一个.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 
+0

这与我在原始问题中列出的问题相同。额外的目标将不会运行,除非指定了.target(您似乎只是指定了这些命令),并且.target实际上需要Makefile的其他部分,否则它将不会运行。 – 2010-09-02 12:12:16

5

下面是另一种解决方案:

TEMPLATE = aux 
OBJECTS_DIR = ./ 
DESTDIR = ./ 

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

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

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

增加: 如果要防止三种生成文件(MakefileMakefile.DebugMakefile.Release)的产生,可以添加

CONFIG -= debug_and_release 

但是,如果您使用此,并根据生成文件是如何调用(总是手动调用,由父目录的“子目录”* .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 [...]