このページでは

テスト関数

テスト関数はブール値を返し、スコープ内の条件分岐部分でその値を判定することができます。テスト関数は、組み込み関数と関数ライブラリに分類されます。

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

組み込みのテスト関数

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

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

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

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

CONFIG(config)

この関数は、CONFIG変数に格納された変数をテストするために使用できます。 これは scopes と同じですが、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` が含まれている場合は成功し、そうでない場合は失敗します。パラメータ `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が指定されたデバッグレベルで実行されているかどうかを確認します。実行されている場合、trueを返し、デバッグメッセージを出力します。

defined(name[, type])

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

  • test test関数のみをチェックします
  • replace replace関数のみを検査
  • var 変数のみをチェック

equals(variablename, value)

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 の現在の値をエクスポートします。

for(iterate, list)

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 より大きいかどうかを判定します。まず、この関数は数値比較を試みます。オペランドのうち少なくとも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 自身によって解析された場合)に、値がval の変数var が含まれている場合は成功し、そうでない場合は失敗します。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)

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

message( "This is a message" )

上記の行により、「This is a message」がコンソールに出力されます。引用符の使用は任意ですが、使用することをお勧めします。

注:デフォルトでは 、qmake によって特定のプロジェクト用に生成された各 Makefile に対してメッセージが出力されます。プロジェクトごとにメッセージが 1 回だけ表示されるようにしたい場合は、build_pass 変数をスコープと組み合わせて使用し、ビルド中にメッセージをフィルタリングしてください。例:

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

mkpath(dirPath)

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

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

requires(condition)

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

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

system(command)

指定されたcommand をセカンダリシェルで実行します。コマンドが終了ステータス0で戻った場合は成功、それ以外は失敗となります。スコープを使用して、この関数の戻り値を確認できます。

例:

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

system()のreplaceバリアントも参照してください。

touch(filename, reference_filename)

filename のタイムスタンプを、reference_filename のタイムスタンプと一致するように更新します。

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

unset(変数名)

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)

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

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

variablename の値を、filename という名前のファイルに、各値を 1 行ずつ書き込みます。variablename が指定されていない場合は、空のファイルを作成します。mode がappend であり、ファイルがすでに存在する場合、上書きするのではなく、そのファイルに追加します。

この関数は 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(target)

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変数にconfig_<test> が追加されます。そうでない場合は、falseが返されます。

この関数を利用可能にするには、対応するフィーチャーファイルをロードする必要があります:

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

これにより、変数 QMAKE_CONFIG_TESTS_DIR が、プロジェクトの親ディレクトリ内のconfig.tests サブディレクトリに設定されます。フィーチャーファイルの読み込み後に、この値を上書きすることも可能です。

tests ディレクトリ内には、テストごとに1つのサブディレクトリがあり、その中に単純な qmake プロジェクトが含まれている必要があります。以下のコードスニペットは、プロジェクトの .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)

テストプロジェクトのビルドが成功すれば、テストは合格となります。

テスト結果は自動的にキャッシュされ、すべてのサブプロジェクトでも利用可能になります。そのため、すべての構成テストはトップレベルのプロジェクトファイルで実行することを推奨します。

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

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

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

qtHaveModule(name)

name で指定された Qt モジュールが存在するかどうかを確認します。 取り得る値の一覧については、QT を参照してください。

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

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.