11

'subdirs'テンプレートを使用するqmake.proファイルを使用して、Qtアプリのビルドシステムをまとめています。これは正常に機能し、各ターゲットがビルドされる順序を指定できるため、依存関係が適切に機能します。ただし、メインアプリで使用されるバージョン番号(ビルド日、SVNリビジョンなどを含む)を生成するツールをプロジェクトに追加しました-このバージョンツールを最初にビルドできますが、ビルド時に必要ですターゲットが構築される前に実行します(メインアプリに含まれるバージョン番号を含むヘッダーファイルを生成します)。

たとえば、私の単純なqmakeファイルは次のようになります。

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
          lib \
          tests \
          mainapp

'version'がビルドされたら、'lib'がビルドされる前に実行します(コマンドラインでいくつかの引数を渡します)。

これが可能かどうか誰かが知っていますか?qmakeにはアプリを実行できる「system」コマンドがあるようですが、これをどのように活用できるかわかりません。

関連する質問は、私の単体テストに関するものです。これらは「テスト」プロジェクトに存在し、QTestフレームワークを使用します。'mainapp'をビルドする前にtestsexeを実行したいのですが、テストが失敗した場合(つまり、tests exeがゼロを返さない場合)、ビルドプロセスを終了したいと思います。

qmakeはmakefileを生成するように設計されていることを理解しているので、ここで少し多すぎることを望んでいるかもしれませんが、誰かが私にいくつかのポインターを与えることができれば、それは大歓迎です。

4

4 に答える 4

10

現在、qmake を使用してユニット テストを 2 年間自動的に実行していますが、問題なく動作しています。

ここを見てください-私はそのためのミニハウツーを作成しました:

Qt: QMAKE による自動ユニット テスト

要約:


構造

/myproject/
    myproject.h
    myproject.cpp
    main.cpp
    myproject.pro
/myproject/tests/
    MyUnitTest.h
    MyUnitTest.cpp
    main.cpp
    tests.pro

QMake を使用してビルド時に単体テストを自動的に実行する

QMake ターゲット QMAKE_POST_LINK は、リンク後にユーザー定義コマンドを実行します。

tests.pri (共通ファイル)

TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe

tests.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 ファイルを追加し、いくつかのテスト メソッドの実装を移動します。


まさにそのメカニズムを使用して、コンパイル/ビルド後にバージョン管理ツールを実行できます-したがって、質問は解決されるはずです:-)

さらに質問がある場合は、遠慮なく私に尋ねてください。

PS: ここでは、QMake に関するその他の (文書化されていない) トリックを見つけることができます: 文書化されていない QMake

于 2009-07-22T20:39:24.637 に答える
3

Qt Interest メーリング リストに「ビルド前」ステップに関するメッセージを投稿しましたが、これは 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

私は現在、これに似たものを使用して、ビルドされるたびにアプリのバージョン番号を生成しています。

于 2009-07-30T20:22:10.137 に答える
0

私は何年にもわたってビルドシステムとしてqmakeを使って多くのことをやろうとしました。最終的に、qmake前のステップに頼ることにしました。すなわち。構成スクリプト。

そこにバージョン ツールをビルドし、qmake を呼び出して Makefile を生成する前に実行できます。

プロ ファイルにデータを取得する最も簡単な方法を見つけました。それも必要な場合は、.pro.inc ファイルを生成し、メインのプロからインクルードすることです。

于 2009-07-23T01:44:32.563 に答える
0

3DHが述べたように、実行したいQMAKE_POST_LINKものを含む .pro ファイルで指定されたオプションが必要です。あなたの例では、ファイルで次のようなことをしversion.proます:

TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version

同様のものがテストディレクトリで機能するはずです。

于 2009-07-23T03:27:24.520 に答える