このページについて

qmake 言語

多くの qmake プロジェクトファイルは、name = value およびname += value の定義リストを用いて、プロジェクトで使用されるソースファイルやヘッダーファイルを単に記述するだけです。qmake は、変数宣言で指定された情報を処理するために使用できる、その他の演算子、関数、およびスコープも提供しています。これらの高度な機能により、単一のプロジェクトファイルから複数のプラットフォーム向けの Makefile を生成することが可能になります。

演算子

多くのプロジェクトファイルでは、代入演算子(= )および追加演算子(+= )を使用して、プロジェクトに関するすべての情報を記述できます。 典型的な使用パターンは、変数に値のリストを代入し、さまざまなテストの結果に応じてさらに値を追加することです。qmakeでは特定の変数がデフォルト値で定義されているため、不要な値を排除するために削除演算子(-= )を使用する必要がある場合があります。以下のセクションでは、演算子を使用して変数の内容を操作する方法について説明します。

値の代入

= 演算子は、変数に値を代入します。

TARGET = myapp

上記の行は、TARGET変数にmyapp を代入します。これにより、TARGET に対して以前に設定されていた値はすべてmyapp で上書きされます。

値の追加

+= 演算子は、変数の値のリストに新しい値を追加します:

DEFINES += USE_MY_STUFF

上記の行は、生成される Makefile に記述されるプリプロセッサ定義のリストに `USE_MY_STUFF ` を追加します。

値の削除

-= 演算子は、変数の値のリストから値を削除します:

DEFINES -= USE_MY_STUFF

上記の行は、生成される Makefile に挿入されるプリプロセッサ定義のリストから `USE_MY_STUFF ` を削除します。

一意の値の追加

*= 演算子は、変数の値のリストに値を追加しますが、その値がまだ存在しない場合に限ります。これにより、変数に同じ値が複数回含まれるのを防ぎます。例えば:

DEFINES *= USE_MY_STUFF

上記の行では、USE_MY_STUFF がまだ定義されていない場合にのみ、プリプロセッサ定義のリストに追加されます。なお、variableが各値を1つだけ含むようにするには、unique()関数を使用することもできます。

値の置換

~= 演算子は、正規表現に一致する値を指定された値に置換します:

DEFINES ~= s/QT_[DT].+/QT

上記の行では、リスト内の値のうち、QT_D またはQT_T で始まるものはすべて、QT に置換されます。

変数の展開

$$ 演算子は変数の内容を抽出するために使用され、変数間で値を渡したり、関数に値を供給したりするために利用できます:

EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)

変数を使用して、環境変数の内容を格納することができます。これらは、qmakeの実行時に評価されるほか、生成されたMakefileに含めて、プロジェクトのビルド時に評価されるようにすることもできます。

qmakeの実行時に環境変数の値を取得するには、$$(...) 演算子を使用します:

DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

上記の代入文では、プロジェクトファイルが処理される際に、PWD 環境変数の値が読み込まれます。

生成された Makefile が処理される時点で環境変数の値を取得するには、$(...) 演算子を使用します:

DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

DESTDIR = $(PWD)
message(The project will be installed in the value of PWD)
message(when the Makefile is processed.)

上記の代入では、プロジェクトファイルが処理される直後にPWD の値が読み取られますが、生成されたMakefile内では、DESTDIR に$(PWD) が代入されます。これにより、Makefileが処理される時点で環境変数が正しく設定されていれば、ビルドプロセスの柔軟性が高まります。

qmakeプロパティへのアクセス

qmakeのプロパティにアクセスするには、特別な$$[...] 演算子を使用できます:

message(Qt version: $$[QT_VERSION])
message(Qt is installed in $$[QT_INSTALL_PREFIX])
message(Qt resources can be found in the following locations:)
message(Documentation: $$[QT_INSTALL_DOCS])
message(Header files: $$[QT_INSTALL_HEADERS])
message(Libraries: $$[QT_INSTALL_LIBS])
message(Binary files (executables): $$[QT_INSTALL_BINS])
message(Plugins: $$[QT_INSTALL_PLUGINS])
message(Data files: $$[QT_INSTALL_DATA])
message(Translation files: $$[QT_INSTALL_TRANSLATIONS])
message(Settings: $$[QT_INSTALL_CONFIGURATION])
message(Examples: $$[QT_INSTALL_EXAMPLES])

詳細については、「qmake の設定」を参照してください。

この演算子でアクセス可能なプロパティは、通常、サードパーティ製のプラグインやコンポーネントを Qt に統合するために使用されます。たとえば、プロジェクトファイルに以下の宣言を行うことで、Qt Widgets Designer プラグインをQt Widgets Designer の組み込みプラグインと併せてインストールすることができます:

target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target

スコープ

スコープは、手続き型プログラミング言語におけるif 文に似ています。特定の条件が真の場合、スコープ内の宣言が処理されます。

スコープの構文

スコープは、条件、その行に続く開括弧、一連のコマンドや定義、そして新しい行にある閉じ括弧で構成されます:

<condition> {
    <command or definition>
    ...
}

開括弧は、条件と同じ行に記述する必要があります。スコープは、後述するように、複数の条件を含めるために連結することができます。

スコープと条件

スコープは、条件の後に、一対の中括弧で囲まれた一連の宣言が続く形式で記述されます。例えば:

win32 {
    SOURCES += paintwidget_win.cpp
}

上記のコードは、Windowsプラットフォーム向けにビルドする際、生成されたMakefileにリストされているソースにpaintwidget_win.cpp ファイルを追加します。他のプラットフォーム向けにビルドする場合、このdefineは無視されます。

特定のスコープで使用される条件を否定することで、元の条件が偽の場合にのみ処理される代替の宣言セットを指定することもできます。たとえば、Windows以外のすべてのプラットフォーム向けにビルドする際に何かを処理するには、次のようにスコープを否定します:

!win32 {
    SOURCES -= paintwidget_win.cpp
}

スコープはネストして、複数の条件を組み合わせることができます。たとえば、デバッグが有効になっている場合にのみ、特定のプラットフォーム向けに特定のファイルを含めるには、次のように記述します:

macx {
    CONFIG(debug, debug|release) {
        HEADERS += debugging.h
    }
}

多くのネストされたスコープを記述する手間を省くために、: 演算子を使用してスコープをネストすることができます。上記の例にあるネストされたスコープは、次のように書き換えることができます:

macx:CONFIG(debug, debug|release) {
    HEADERS += debugging.h
}

: 演算子を使用して、1行の条件付き代入を行うこともできます。例えば:

win32:DEFINES += USE_MY_STUFF

上記の行は、Windowsプラットフォーム向けにビルドする場合にのみ、DEFINES変数に USE_MY_STUFF を追加します。一般的に、: 演算子は論理AND演算子のように振る舞い、複数の条件を結合し、それらすべてが真であることを要求します。

また、論理OR演算子のように振る舞い、複数の条件を結合し、そのうちの1つが真であればよいという| 演算子もあります。

win32|macx {
    HEADERS += debugging.h
}

両方の演算子を混在させる必要がある場合は、if 関数を使用して演算子の優先順位を指定できます。

if(win32|macos):CONFIG(debug, debug|release) {
    # Do something on Windows and macOS,
    # but only for the debug configuration.
}
win32|if(macos:CONFIG(debug, debug|release)) {
    # Do something on Windows (regardless of debug or release)
    # and on macOS (only for debug).
}

この条件では、ワイルドカード文字を使用して、CONFIG 値やmkspec名のグループに一致させることができます。

win32-* {
    # Matches every mkspec starting with "win32-"
    SOURCES += win32_specific.cpp
}

注:従来 、上記のようにワイルドカードを使用して mkspec 名をチェックすることは、qmake がプラットフォームを確認する方法でした。現在では、QMAKE_PLATFORM 変数に mkspec によって定義された値を使用することを推奨しています。

また、else スコープを使用することで、そのスコープ内の宣言に対して代替の宣言を指定することもできます。各else スコープは、先行するスコープの条件が偽の場合に処理されます。これにより、他のスコープと組み合わせる(上記のように: 演算子で区切る)ことで、複雑なテストを記述することが可能になります。例えば:

win32:xml {
    message(Building for Windows)
    SOURCES += xmlhandler_win.cpp
} else:xml {
    SOURCES += xmlhandler.cpp
} else {
    message("Unknown configuration")
}

設定とスコープ

CONFIG変数に格納された値は、qmakeによって特別に扱われます。可能な各値は、スコープの条件として使用できます。例えば、CONFIG が保持する値のリストは、opengl という値を追加することで拡張できます:

CONFIG += opengl

この操作の結果、opengl を条件とするすべてのスコープが処理されるようになります。この機能を利用して、最終的な実行ファイルに適切な名前を付けることができます:

opengl {
    TARGET = application-gl
} else {
    TARGET = application
}

この機能により、特定の構成に必要なカスタム設定をすべて失うことなく、プロジェクトの構成を簡単に変更できます。 上記のコードでは、最初のスコープ内の宣言が処理され、最終的な実行ファイルはapplication-gl という名前になります。しかし、opengl が指定されていない場合は、代わりに 2 番目のスコープ内の宣言が処理され、最終的な実行ファイルはapplication という名前になります。

CONFIG 行には独自の値を指定できるため、これによりプロジェクトファイルをカスタマイズし、生成される Makefile を微調整するための便利な方法が提供されます。

プラットフォームスコープの値

多くのスコープ条件で使用されるwin32 、macx 、unix の値に加え、スコープを使用して、その他のさまざまな組み込みのプラットフォームおよびコンパイラ固有の値をテストすることができます。これらは、Qt のmkspecs ディレクトリに提供されているプラットフォーム仕様に基づいています。たとえば、プロジェクトファイル内の以下の行は、現在使用されている仕様を示し、linux-g++ 仕様をテストしています。

message($$QMAKESPEC)

linux-g++ {
    message(Linux)
}

mkspecs ディレクトリに仕様が存在する限り、その他のプラットフォームとコンパイラの組み合わせについてもテストを行うことができます。

変数

プロジェクトファイルで使用される変数の多くは、DEFINES、SOURCES、HEADERSなど、qmakeがMakefileを生成する際に使用する特別な変数です。さらに、独自に使用する変数を作成することもできます。qmakeは、特定の名前への代入に出会うと、その名前で新しい変数を作成します。例えば:

MY_VARIABLE = value

独自の変数に対しては、どのような操作を行っても制限はありません。qmakeは、スコープを処理する際にその変数を評価する必要がない限り、それらを無視します。

また、変数名の先頭に $$ を付けることで、ある変数の値を別の変数に代入することもできます。例えば:

MY_DEFINES = $$DEFINES

これで、MY_DEFINES 変数には、プロジェクトファイルのこの時点における DEFINES 変数の内容が格納されます。これは、次の記述とも同等です:

MY_DEFINES = $${DEFINES}

2番目の表記法を使用すると、変数の内容を別の値にスペースで区切ることなく追加することができます。例えば、以下のコードは、最終的な実行ファイルの名前に使用中のプロジェクトテンプレートが含まれるようにします:

TARGET = myproject_$${TEMPLATE}

置換関数

qmake には、変数の内容を処理するための組み込み関数が用意されています。これらの関数は、渡された引数を処理し、その結果として値または値のリストを返します。結果を変数に代入するには、ある変数の内容を別の変数に代入する場合と同様に、この種の関数に対して$$ 演算子を使用します:

HEADERS = model.h
HEADERS += $$OTHER_HEADERS
HEADERS = $$unique(HEADERS)

この種の関数は、代入式の右辺(つまり、オペランドとして)で使用する必要があります。

変数の内容を処理するための独自の関数は、次のように定義できます:

defineReplace(functionName){
    #function code
}

次の例の関数は、変数名を唯一の引数として受け取り、組み込み関数eval()を使用してその変数から値のリストを抽出し、ファイルのリストを生成します:

defineReplace(headersAndSources) {
    variable = $$1
    names = $$eval($$variable)
    headers =
    sources =

    for(name, names) {
        header = $${name}.h
        exists($$header) {
            headers += $$header
        }
        source = $${name}.cpp
        exists($$source) {
            sources += $$source
        }
    }
    return($$headers $$sources)
}

テスト関数

qmake には、スコープを記述する際の条件として使用できる組み込み関数が用意されています。これらの関数は値を返すのではなく、成功または失敗を示すものです:

count(options, 2) {
    message(Both release and debug specified.)
}

この種の関数は、条件式でのみ使用すべきです。

スコープの条件として使用する独自の関数を定義することも可能です。次の例は、リスト内の各ファイルが存在するかどうかをテストし、すべて存在する場合は true を、存在しない場合は false を返します:

defineTest(allFiles) {
    files = $$ARGS

    for(file, files) {
        !exists($$file) {
            return(false)
        }
    }
    return(true)
}

© 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.