17

かなり大きなコードベースがあります。コードの大部分は、qmake を使用してコンパイルされ、makefile が生成されます。ただし、バッチ ファイルの実行または他のプログラムの実行によって生成されるサブプロジェクトがいくつかあります。

qmake を使用してすべてをコンパイルできるようにしたいのですが、qmake で単純にスクリプトを実行する方法がわかりません。

私が試したことの 1 つは、pro ファイルで次のように 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 を指定しない (つまり、空白のままにする) か、SOURCES に placeholder.cpp を配置しない場合、バッチ ファイルは実行されません。これは、qmake が batch_runner.commands を Makefile 内の他の依存関係のアクションにしないためです。

Makefile の実行時にスクリプトが実行されるように、QMake に Makefile を作成させるより良い方法はありますか?

4

4 に答える 4

16

QMAKE_POST_LINKはこの種のものにうまく機能するようです。

これで仕事は終わりのようです。my_batch_file.batは、(qmakeが実行されるときではなく)nmakeが実行されるときに実行され、プレースホルダーターゲットまたはファイルに対して面白いことをする必要はありません。

「CONFIG」にリストされているすべてのアイテムが必要なわけではない可能性があります。

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は基本的に、ターゲットを指定せずに実行すると何もしないメイクファイルを生成します。qmake がandディレクトリを作成するのを防ぐために、 OBJECTS_DIRandDESTDIR変数が現在のディレクトリに設定されます (少なくとも Windows では、だけでなく;に設定することが重要です)。次に、 を使用して、makefile がターゲットなしで呼び出されたときにカスタム コマンドを実行するようにターゲットを再定義します。debugrelease./.QMAKE_EXTRA_TARGETSfirst

少しハックですが、仕事は完了です。

追加:Makefile 3 つの makefile ( 、Makefile.Debug、 ) の生成を防ぎたい場合はMakefile.Release、追加できます。

CONFIG -= debug_and_release

ただし、これを使用する場合、makefile の呼び出し方法 (常に手動で呼び出す、親ディレクトリの「サブディレクトリ」*.pro ファイルから呼び出すなど) によっては、「ルールなし」を回避するために偽物debugreleaseターゲットを作成する必要がある場合があります。 to make target...」エラー。例えば:

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 構成を使用して複数の異なるターゲットを実行できます。これは、サブディレクトリ構成が実行するメイクファイル内の特定のターゲットを指定できるため、追加のターゲットで特にうまく機能する可能性があります (詳細については、文書化されていない qmakeを参照してください)。この場合、すべての「通常の」ビルド コマンドを 1 つの .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 に答える