我们有一个相当大的代码库。绝大多数代码是使用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执行时运行脚本?
答案 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_DIR
和DESTDIR
变量设置为当前目录,以防止qmake创建debug
和release
目录(将它们设置为./
非常重要不只是.
;至少在Windows上)。然后,使用QMAKE_EXTRA_TARGETS
,我们重新定义目标first
,以便在没有目标的情况下调用makefile时运行自定义命令。
有点hacky但它完成了工作。
<强>增加:强>
如果您想阻止生成三个makefile(Makefile
,Makefile.Debug
,Makefile.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