qmake 言語
多くの qmake プロジェクトファイルは、name = value
とname += value
定義のリストを使用して、プロジェクトで使用されるソースとヘッダーファイルを単に記述します。qmake は、変数宣言で提供される情報を処理するために使用できる他の演算子、関数、スコープも提供します。これらの高度な機能により、1 つのプロジェクトファイルから複数のプラットフォーム用の 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
は、それがまだ定義されていない場合にのみ、プリプロセッサー定義のリストに追加されます。unique()関数は、変数に各値のインスタンスが1つだけ含まれるようにするためにも使えることに注意。
値の置き換え
~=
演算子は、正規表現にマッチする値を指定された値で置き換えます:
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
の値はプロジェクト・ファイルが処理されるときにすぐに読み込まれますが、$(PWD)
は生成された Makefile のDESTDIR
に代入されます。これにより、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プラットフォーム用にビルドするときのみ、USE_MY_STUFF
をDEFINES変数に追加します。一般に、:
演算子は論理 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 などの Makefile を生成する際に qmake が使用する特別な変数です。qmake は指定された名前の代入に出会うと新しい変数を作成します。例えば
MY_VARIABLE = value
qmake はスコープを処理するときに評価する必要がない限り、変数を無視します。
また、変数名の前に$$を付けることで、現在の変数の値を別の変数に代入することもできます。例えば
MY_DEFINES = $$DEFINES
これで、MY_DEFINES変数には、プロジェクトファイルのこの時点でDEFINES変数に入っているものが入ります。と同じです:
MY_DEFINES = $${DEFINES}
番目の記法では、変数の内容をスペースで区切らずに別の値に追加することができます。例えば、次のようにすると、最終的な実行ファイルには、使用するプロジェクト・テンプレートを含む名前が付けられます:
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) }
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。