SOに関するいくつかの質問があります。qmake
の事前構築ステップを作成する方法について、これを.pro
ファイル:
versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else: versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET
PRE_TARGETDEPS += ../VersionData/versioning.h
QMAKE_EXTRA_TARGETS += versionTarget
さて、問題は、このアプローチ自体がビルドステップではなく、単なる別のビルドターゲットであることです。そのため、-j
フラグをmake
に設定すると、他のビルドジョブと共にparallelでスクリプトが実行されます。これは非常に悪いことです。スクリプトがヘッダーファイルを作成/更新するためです-コンパイル中に途中で変更することは受け入れられません。
それで、とにかくanyコンパイルが実行される前にこのスクリプトを実行させることができますか?別のスクリプトを作成してversion_getter.py
とqmake
はそれ以降のシーケンスですが、Qt Creator内からではなくコマンドラインからコンパイルする必要があるため、これは望ましくありません。
完全な.pri
ファイルは、私のサブプロジェクトのすべてに含まれています。
CONFIG += thread
QT += core \
gui
versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else: versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET
PRE_TARGETDEPS += ../VersionData/versioning.h
QMAKE_EXTRA_TARGETS += versionTarget
DEPENDPATH += ../VersionData
INCLUDEPATH += ../VersionData
HEADERS += ../VersionData/versioning.h
UI_HEADERS_DIR = $${_PRO_FILE_PWD_}/include/Qui
DESTDIR = $(SYREN_PATH)
!win32-msvc {
QMAKE_CXXFLAGS += -std=c++0x
}
しかし、これでも同じ並列動作になります。私がccache
を使用したことが原因であると考えましたが、オフにしても違いはありませんでした(もちろん、速度が大幅に低下する以外は)。
もう1つのオプションは、元の質問のプロジェクトファイルスニペットから開始し、_versioning.h
_がプロジェクトファイルの他のビルドターゲットの依存関係であることをqmakeが認識していることを確認することです—
versioning.h
_への完全パスをHEADERS
変数に追加します。versioning.h
_が存在するフォルダーをDEPENDPATH
変数に追加します。(警告:_versioning.h
_が存在しないときにqmakeを実行すると、「WARNING:Failure to find:versioning.h」— その警告の唯一の回避策はsystem()
コマンド 、他の回答で説明したように。)
以下を含む_test.pro
_を作成します。
_versionTarget.target = ../versioning.h
versionTarget.depends = FORCE
versionTarget.commands = sleep 5s ; touch ../versioning.h
PRE_TARGETDEPS += ../versioning.h
QMAKE_EXTRA_TARGETS += versionTarget
SOURCES = test.c
HEADERS = ../versioning.h
DEPENDPATH = ..
_
以下を含む_test.c
_を作成します。
_#include "../versioning.h"
_
qmake
を実行します。 _WARNING: Failure to find: ../versioning.h
_を出力します。
_make -j9
_を実行します。それは_versionTarget.commands
_(マルチプロセッシングの問題を誇張するために5秒間スリープ)を実行し、その後、コマンドを実行して_test.c
_をコンパイルします。
(そして、生成されたMakefile
を調べると、_test.o
_は_test.c
_と_../versioning.h
_の両方に依存していることがわかるので、Makeはそれができないことを正しく理解する必要があります_test.c
_を作成/更新するコマンドの前に、_../versioning.h
_をコンパイルするコマンドを実行します。)
system()
qmakeコマンドを使用します— qmake
を実行すると実行されます。これは、make
がビルドコマンドを実行する前に発生します。
win32: PYTHON=python.exe
else: PYTHON=python
system(cd $$PWD; $$PYTHON ./version_getter.py -p ../VersionData/versioning.h)
Qmakeによって作成されたMakefileを調べると、ビルドの指示を含む別のルールデバッグ(またはリリース)に依存する「first」という名前の最初のMakefileルールが常にあることに気付きました。 Id est、このようなもの:
...
MAKEFILE = Makefile
first: debug
...
ビルド前のステップを作成するには、そのルールをハッキングして、優先度の高い別のルールに依存させる必要があります。
何かのようなもの
...
MAKEFILE = Makefile
first: prebuild debug
prebuild:
do_your_instructions
...
これは実際には次のようなものと等しくなります。
...
MAKEFILE = Makefile
first: debug
...
first: prebuild
prebuild:
do_your_instructions
...
これは、qmakeプロジェクトで次のようにして簡単にハッキングできます。
# $$PWD/test_prebuild is a batch with the instructions to execute before every build
!build_pass:prebuild.commands = $$PWD/test_prebuild
!build_pass:first.depends = prebuild
QMAKE_EXTRA_TARGETS += prebuild first
「!build_pass:」を指定すると、このプリビルドルールがMakefileだけに(Makefile.DebugまたはMakefile.Releaseではなく)書き込まれ、test_prebuildが複数回実行されるのを防ぐことができます。 「最初の」は予約されていないため、ハッキングが可能であることに注意してください(ただし、名前は qmakeプリミティブ です)。
私の場合はうまくいきました。このトリックが他の人にも役立つことを願っています。