テスト関数

テスト関数はスコープの条件部分でテストできるブール値を返します。テスト関数は組み込み関数と関数ライブラリに分けられます。

置換関数も参照してください。

組み込みテスト関数

基本的なテスト関数は、組み込み関数として実装されています。

cache(variablename, [set|add|sub] [transient] [super|stash], [ソース変数名])

これは内部関数で、通常は必要ありません。

この関数は Qt 5.0 で導入されました。

CONFIG(config)

この関数は、CONFIG変数に入れられた変数をテストするために使うことができます。これはscopesと同じですが、アクティブなconfigをテストするために2番目のパラメータを渡すことができるという利点があります。CONFIG 変数では値の順番が重要なので(つまり、互いに排他的な値の場合、最後に設定されたものがアクティブなコンフィグとみなされます)、2番目のパラメータを使用して、考慮する値のセットを指定することができます。例えば

CONFIG = debug
CONFIG += release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!) #no print

releaseは(機能解析のための)アクティブな設定とみなされるため、ビルドファイルの生成に使用されるCONFIGになります。一般的なケースでは2番目のパラメータは必要ありませんが、特定の相互排他的テストでは非常に有用です。

contains(変数名, 値)

変数variablename が値value を含んでいれば成功、そうでなければ失敗。パラメータ値に正規表現を指定することができる。

スコープを使ってこの関数の戻り値をチェックできる。

例えば

contains( drivers, network ) {
    # drivers contains 'network'
    message( "Configuring for network build..." )
    HEADERS += network.h
    SOURCES += network.cpp
}

スコープの内容は、変数drivers に値network が含まれている場合のみ処理されます。この場合、適切なファイルがSOURCES変数とHEADERS変数に追加されます。

count(variablename, number)

変数variablename に指定された値のリストnumber が含まれていれば成功、そうでなければ失敗する。

この関数は、スコープ内の宣言が、変数に正しい数の値が含まれている場合にのみ処理されるようにするために使われる。例えば

options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
count(options, 2) {
    message(Both release and debug specified.)
}

debug(level, message)

qmake が指定されたデバッグレベルで実行されるかどうかをチェックします。yesの場合、trueを返し、デバッグメッセージを表示します。

defined(name[, type])

関数または変数name が定義されているかどうかをテストする。type が省略された場合は、すべての関数をチェックします。変数または特定の型の関数のみをチェックするには、type を指定します。以下の値を指定できます:

  • test テスト関数のみをチェックする
  • replace replace 関数のみをチェックする
  • var 変数のみをチェック

equals(変数名, 値)

variablename が文字列value と等しいかどうかを調べます。

例えば

TARGET = helloworld
equals(TARGET, "helloworld") {
    message("The target assignment was successful.")
}

error(string)

この関数は値を返しません。qmakeはstring をエラーメッセージとしてユーザーに表示し、終了します。この関数は回復不可能なエラーにのみ使用されるべきである。

例えば

error(An error has occurred in the configuration process.)

eval(string)

qmakeの構文規則を使用して文字列の内容を評価し、trueを返します。既存の変数の値を変更したり、新しい定義を作成したりするために、定義や代入を文字列の中で使用することができます。

例えば

eval(TARGET = myapp) {
    message($$TARGET)
}

注意: 文字列の区切りには引用符を使用することができ、戻り値は必要なければ破棄することができます。

exists(filename)

与えられたfilename のファイルが存在するかどうかをテストする。ファイルが存在すれば関数は成功し、そうでなければ失敗する。

引数filename はワイルドカードを含むことができる。その場合、一致するファイルがあれば、この関数は成功する。

例えば

exists( $(QTDIR)/lib/libqt-mt* ) {
      message( "Configuring for multi-threaded Qt..." )
      CONFIG += thread
}

注意: 使用しているプラットフォームに関係なく、"/" はディレクトリの区切り文字として使用されるべきです。

export(variablename)

関数のローカルコンテキストからグローバルコンテキストにvariablename の現在値をエクスポートします。

for(iterate, リスト)

list のすべての値を繰り返し、iterate を順番に各値に設定するループを開始する。便宜上、list が 1 から 10 の場合、iterate は 1 から 10 までの値を繰り返し処理します。

例えば

LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)

ループはbreak() で中断できる。next() 文は、ループ本体の残りをスキップし、次の反復で実行を継続する。

greaterThan(variablename, value)

variablename valueまず、この関数は数値比較を試みます。オペランドの少なくとも1つが変換に失敗した場合、この関数は文字列比較を行います。

例えば

ANSWER = 42
greaterThan(ANSWER, 1) {
    message("The answer might be correct.")
}

2つの数値を文字列として直接比較することは不可能です。回避策として、数値以外の接頭辞を持つ一時的な値を作成し、これらを比較します。

例えば

VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")

lessThan() も参照。

if(condition)

condition を評価します。ブーリアン式をグループ化するために使用します。

例えば

if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
    message("We are on Linux or Mac OS, and we are in debug mode.")
}

include(filename)

filename で指定されたファイルの内容を、現在のプロジェクトにインクルードします。この関数は、filename がインクルードされていれば成功し、そうでなければ失敗します。インクルードされたファイルは直ちに処理されます。

ファイルがインクルードされたかどうかは、この関数をスコープの条件として使うことで確認できます。例えば

include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
    message( "No custom build options specified" )
OPTIONS -= custom
}

infile(filename, var, val)

ファイルfilename が(qmake自身によってパースされたときに)変数var の値val を含んでいれば成功し、そうでなければ失敗する。val を指定しない場合、この関数はvar がファイルに代入されているかどうかをテストします。

isActiveConfig

これはCONFIG 関数のエイリアスである。

isEmpty(variablename)

変数variablename が空であれば成功し、そうでなければ失敗する。これはcount( variablename, 0 ) と同等である。

例えば

isEmpty( CONFIG ) {
CONFIG += warn_on debug
}

isEqual

これはequals 関数のエイリアスです。

lessThan(variablename, value)

variablename の値がvalue より小さいことをテストします。greaterThan() と同様に動作します。

例えば

ANSWER = 42
lessThan(ANSWER, 1) {
    message("The answer might be wrong.")
}

load(feature)

feature で指定された特徴ファイル (.prf) をロードします。

log(message)

コンソールにメッセージを表示します。message 関数とは異なり、テキストを先頭に追加することも、改行を追加することもありません。

この関数は Qt 5.0 で導入されました。

message() も参照してください。

message(文字列)

常に成功し、ユーザーへの一般的なメッセージとしてstring を表示します。error() 関数とは異なり、この関数は処理を続行できます。

message( "This is a message" )

上の行では、"This is a message "がコンソールに書き込まれる。引用符の使用は任意ですが、推奨します。

注意: デフォルトでは、qmake が生成したプロジェクト用の Makefile 毎にメッセージが書き出されます。メッセージがプロジェクトごとに一度だけ表示されるようにしたい場合は、build_pass 変数をスコープと組み合わせてテストし、ビルド中にメッセージをフィルタリングしてください。例えば

!build_pass:message( "This is a message" )

mkpath(dirPath)

ディレクトリパスdirPath を作成します。この関数はQDir::mkpath 関数のラッパーです。

この関数は Qt 5.0 で導入されました。

requires(condition)

condition を評価します。条件がfalseの場合、qmakeはビルド時にこのプロジェクト(とそのSUBDIRS)をスキップします。

注意: この目的のためにREQUIRES変数を使うこともできます。しかし、代わりにこの関数を使用することをお勧めします。

システム(コマンド)

与えられたcommand をセカンダリシェルで実行します。コマンドの終了ステータスがゼロであれば成功し、そうでなければ失敗する。この関数の戻り値は、スコープを使って確認できます。

例えば

system("ls /bin"): HAS_BIN = TRUE

system()のreplaceも参照のこと。

touch(filename, reference_filename)

reference_filename のタイムスタンプに合うようにfilename のタイムスタンプを更新します。

この関数は Qt 5.0 で導入されました。

unset(variablename)

現在のコンテキストからvariablename を削除する。

例えば

NARF = zort
unset(NARF)
!defined(NARF, var) {
    message("NARF is not defined.")
}

versionAtLeast(variablename, versionNumber)

variablename からのバージョン番号がversionNumber 以上であることをテストします。 バージョン番号は '.' で区切られた非負の10進数のシーケンスであるとみなされます。比較は、左から右に分割して行われます。一方のバージョンが他方のバージョンの接頭辞である場合、そのバージョンが小さいとみなされます。

この関数は Qt 5.10 で導入されました。

versionAtMost(variablename, versionNumber)

variablename からのバージョン番号がversionNumber 以下であることをテストします。versionAtLeast() と同様に動作します。

この関数は Qt 5.10 で導入されました。

warning(文字列)

常に成功し、ユーザーに警告メッセージとしてstring を表示します。

write_file(filename, [variablename, [mode]])

filename という名前のファイルにvariablename の値を書き込む。variablename が指定されていない場合は、空のファイルを作成する。modeappend で、ファイルが既に存在する場合、ファイルを置き換える代わりに、そのファイルに追加します。

この関数はQt 5.0で導入されました。

テスト関数ライブラリ

複雑なテスト関数は、.prfファイルのライブラリに実装されています。

packagesExist(packages)

PKGCONFIG メカニズムを使用して、プロジェクトの解析時に指定されたパッケージが存在するかどうかを判断します。

これは、オプションで機能を有効にしたり無効にしたりするのに便利です。例えば

packagesExist(sqlite3 QtNetwork QtDeclarative) {
    DEFINES += USE_FANCY_UI
}

そして、コードの中で

#ifdef USE_FANCY_UI
    // Use the fancy UI, as we have extra packages available
#endif

prepareRecursiveTarget(ターゲット)

すべてのサブディレクトリを反復するターゲットを準備することで、install ターゲットに似たプロジェクト全体のターゲットの作成を容易にします。例えば

TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)

.CONFIG にhave_no_default またはno_<target>_target が指定されているサブディレクトリは、このターゲットから除外されます:

two.CONFIG += no_check_target

準備したターゲットをQMAKE_EXTRA_TARGETSに手動で追加する必要があります:

QMAKE_EXTRA_TARGETS += check

ターゲットをグローバルにするには、上記のコードをすべてのサブディレクトリのサブプロジェクトに含める必要があります。さらに、これらのターゲットに何かをさせるには、サブディレクトリ以外のサブプロジェクトにもそれぞれのコードを含める必要があります。これを実現する最も簡単な方法は、カスタムフィーチャーファイルを作成することです。例えば

# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
    prepareRecursiveTarget(check)
} else {
    check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check

この機能ファイルは、.qmake.confなどで各サブプロジェクトに注入する必要があります:

# <project root>/.qmake.conf
CONFIG += mycheck

この関数は Qt 5.0 で導入されました。

qtCompileTest(test)

テストプロジェクトをビルドします。テストに合格するとtrueが返され、config_<test>CONFIG変数に追加されます。そうでない場合はfalseが返されます。

この関数を使用できるようにするには、それぞれの機能ファイルをロードする必要があります:

# <project root>/project.pro
load(configure)

また、QMAKE_CONFIG_TESTS_DIR 変数をプロジェクトの親ディレクトリのconfig.tests サブディレクトリに設定します。機能ファイルをロードした後で、この値を上書きすることも可能です。

tests ディレクトリの中には、単純な qmake プロジェクトを含む test ごとにひとつのサブディレクトリが必要です。次のコード・スニペットは、プロジェクトの .pro ファイルを示しています:

# <project root>/config.tests/test/test.pro
SOURCES = main.cpp
LIBS += -ltheFeature
# Note that the test project is built without Qt by default.

次のコード・スニペットは、プロジェクトのメインの .cpp ファイルを示しています:

// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() { return featureFunction(); }

次のコード・スニペットは、テストの起動を示しています:

# <project root>/project.pro
qtCompileTest(test)

テストプロジェクトが正常にビルドされると、テストはパスします。

テスト結果は自動的にキャッシュされ、すべてのサブプロジェクトで利用できるようになります。したがって、すべての設定テストをトップレベルのプロジェクトファイルで実行することを推奨します。

キャッシュされた結果の再利用を抑制するには、CONFIG+=recheck を qmake に渡します。

load() も参照してください。

この関数は Qt 5.0 で導入されました。

qtHaveModule(name)

name で指定された Qt モジュールが存在するかどうかをチェックします。指定可能な値のリストについては、QTを参照してください。

この関数は Qt 5.0.1 で導入されました。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。