QMake 'subdirs' テンプレート - ターゲットを実行しますか?
質問
「subdirs」テンプレートを使用する qmake .pro ファイルを使用して、Qt アプリのビルド システムをまとめています。これはうまく機能し、各ターゲットがビルドされる順序を指定できるため、依存関係が適切に機能します。ただし、メイン アプリで使用されるバージョン番号 (ビルド日、SVN リビジョンなどを含む) を生成するツールをプロジェクトに追加しました。このバージョン ツールは最初にビルドできますが、ビルド時に必要になります。さらにターゲットがビルドされる前に実行します (メイン アプリに含まれるバージョン番号を含むヘッダー ファイルが生成されます)。
たとえば、私の単純な qmake ファイルは次のようになります。
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
lib \
tests \
mainapp
「version」がビルドされるとき、「lib」がビルドされる前に(コマンドラインでいくつかの引数を渡して)実行したいと考えています。
これが可能かどうか知っている人はいますか?qmake にはアプリを実行できる「system」コマンドがあるようですが、これをどのように利用できるかわかりません。
関連する質問は、私の単体テストに関するものです。これらは「test」プロジェクト内に存在し、QTest フレームワークを使用します。「mainapp」をビルドする前に、テストが失敗した場合(つまり、テスト実行ファイルはゼロを返しません) ビルドプロセスを終了したいです。
qmake が makefile を生成するように設計されていることは承知しています。そのため、ここでは少し多くを望みすぎているかもしれませんが、誰かが私にいくつかのヒントを提供してくれるなら、それは大歓迎です。
解決 2
私は「前のビルド」のステップについてはQtインタレストメーリングリストにメッセージを投稿し、それがPRE_TARGETDEPSとQMAKE_EXTRA_TARGETSの組み合わせを使用して行うことができます。ここで応答があります:
あなたは、カスタムビルドステップを指定することができ、 例えば。これはmakemyversion.sh呼ぶだろう 毎回myversion.cpp作成します それが何かを構築する前に:
versiontarget.target = myversion.cpp versiontarget.commands = ./makemyversion.sh versiontarget.depends = FORCE PRE_TARGETDEPS += myversion.cpp QMAKE_EXTRA_TARGETS += versiontarget
私は今、私のアプリのバージョン番号、それが構築されるたびに生成するために、これと同様のものを使用しています。
他のヒント
私は現在 qmake を使用して単体テストを 2 年間自動的に実行していますが、問題なく動作しています。
ここを見てください - そのためのミニハウツーを作成しました。
要約の要約:
構造
/myproject/
myproject.h
myproject.cpp
main.cpp
myproject.pro
/myproject/tests/
MyUnitTest.h
MyUnitTest.cpp
main.cpp
tests.pro
QMake を使用してビルド時に単体テストを自動的に実行する
QMake ターゲット QMAKE_POST_LINK は、リンク後にユーザー定義のコマンドを実行します。
testing.pri (共通ファイル)
TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe
testing.pro (プロジェクト固有のファイル)
TARGET = MyUnitTest
HEADERS += MyUnitTest.h
SOURCES += MyUnitTest.cpp main.cpp
include(tests.pri)
単一の main() で複数の単体テストを実行する
main.cpp
#include "MyUnitTest1.h"
#include "MyUnitTest2.h"
int main(int argc, char** argv) {
QApplication app(argc, argv);
int retval(0);
retval +=QTest::qExec(&MyTest1(), argc, argv);
retval +=QTest::qExec(&MyTest2(), argc, argv);
return (retval ? 1 : 0);
}
これにより、ビルドごとにテストが実行され、エラーが見つかった場合は中止されます。
注記
「LNK2005:」などのリンカー エラーが発生した場合:xxx はすでに定義されています...」というメッセージが表示された場合は、各テスト クラス ヘッダーに新しい .cpp ファイルを追加し、いくつかのテスト メソッド実装を移動します。
まさにそのメカニズムを使用して、コンパイル/ビルド後にバージョン管理ツールを実行できます - したがって、あなたの質問は解決されるはずです:-)
他にご質問がございましたら、お気軽にお問い合わせください。
追伸:ここでは、QMake に関するその他の (文書化されていない) トリックを見つけることができます。 文書化されていない QMake
私は長年にわたって構築システムとしてのqmakeで多くのものをやってみました。結局私はちょうど前のqmakeのステップを有することに頼っ。すなわち。 configureスクリプトます。
あなたはそこにあなたのバージョンのツールを構築し、その後のMakefileを生成するqmakeのを呼び出す前に、それを実行することができます。
私はあなたがあまりにも、.pro.incファイルを生成することであることを必要とメインプロからそれを含める場合、プロファイルにデータを取得する最も簡単な方法を見つけます。
は、含まれているあなたの.PROファイルで指定されたQMAKE_POST_LINK
のオプションあなたが実行したいもの。だからあなた例えば、私はversion.pro
ファイルを使用して、このような何かをするでしょう。
TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version
類似した何かがあなたのテストディレクトリで動作するはずです。