高度な使用法

新しい設定機能の追加

qmake では、CONFIG変数で指定された値のリストに名前を追加することで、プロジェクトファイルに含めることができる独自のfeatures を作成することができます。フィーチャーは、.prf ファイルにあるカスタム関数と定義の集まりで、多くの標準ディレクトリのいずれかに存在することができます。これらのディレクトリの場所は多くの場所で定義されており、qmake は.prf ファイルを探す際に、以下の順序でそれぞれのディレクトリをチェックします:

  1. 環境変数QMAKEFEATURES にリストされているディレクトリで、プラットフォームのパスリスト区切り文字(Unixの場合はコロン、Windowsの場合はセミコロン)で区切られたディレクトリのリストを含む。
  2. QMAKEFEATURES プロパティ変数にリストされた、プラットフォームのパスリスト区切り文字で区切られたディレクトリのリストを含むディレクトリ。
  3. mkspecs ディレクトリの中にあるfeaturesディレクトリの中。mkspecs ディレクトリは、環境変数QMAKEPATH にリストされている、 プラットフォームのパスリスト区切り文字で区切られたディレクトリの リストの下に置くことができる。たとえば、$QMAKEPATH/mkspecs/<features>
  4. QMAKESPEC環境変数で指定されたディレクトリの下にあるfeaturesディレクトリ。例:$QMAKESPEC/<features>.
  5. data_install/mkspecs ディレクトリにある features ディレクトリ。例:data_install/mkspecs/<features>.
  6. QMAKESPEC 環境変数で指定されたディレクトリの兄弟として存在する features ディレクトリ内。例:$QMAKESPEC/../<features>.

次の features ディレクトリで features ファイルが検索されます:

  1. features/unix使用するプラットフォームによって、features/win32 、またはfeatures/macx 、が検索されます。
  2. features/

例えば、プロジェクト・ファイルに次のように代入するとします:

CONFIG += myfeatures

このようにCONFIG 変数を追加すると、qmake はプロジェクトファイルの解析が終わった後、myfeatures.prf ファイルを探すために上記の場所を検索します。Unix システムでは、以下のファイルを探します:

  1. $QMAKEFEATURES/myfeatures.prf (環境変数 にリストされている各ディレクトリ)QMAKEFEATURES
  2. $$QMAKEFEATURES/myfeatures.prf (プロパティ変数 にリストされている各ディレクトリ)QMAKEFEATURES
  3. myfeatures.prf (プロジェクトのルート・ディレクトリ)。プロジェクトのルートは、トップ・レベルの ファイルによって決まります。ただし、 ファイルをサブ・ディレクトリまたはサブ・プロジェクトのディレクトリに置いた場合、プロジェクト・ルートはサブ・ディレクトリそのものになります。.pro .qmake.cache
  4. $QMAKEPATH/mkspecs/features/unix/myfeatures.prf および (環境変数 にリストされている各ディレクトリに対して)。$QMAKEPATH/mkspecs/features/myfeatures.prf QMAKEPATH
  5. $QMAKESPEC/features/unix/myfeatures.prf$QMAKESPEC/features/myfeatures.prf
  6. data_install/mkspecs/features/unix/myfeatures.prf およびdata_install/mkspecs/features/myfeatures.prf
  7. $QMAKESPEC/../features/unix/myfeatures.prf および$QMAKESPEC/../features/myfeatures.prf

注: .prf ファイル名は小文字でなければなりません。

ファイルのインストール

Unixでは、ビルドツールを使ってアプリケーションやライブラリをインストールすることも一般的です。例えば、make install を呼び出します。このため、qmake にはinstall set という概念があります。 は、プロジェクトの一部をどのようにインストールするかという指示を含むオブジェクトです。例えば、ドキュメントファイルのコレクションは次のように記述できます:

documentation.path = /usr/local/program/doc
documentation.files = docs/*

path メンバは/usr/local/program/doc (path メンバ) にファイルをインストールするよう qmake に通知し、files メンバはインストールディレクトリにコピーするファイルを指定します。この場合、docs ディレクトリのすべてが/usr/local/program/doc にコピーされます。

インストールセットを完全に記述したら、次のような行でインストールリストに追 加できます:

INSTALLS += documentation

qmake は、指定したファイルがインストールディレクトリにコピーされるよう にします。qmake は、指定されたファイルがインストールディレクトリにコピーされるよう にします。このプロセスをもっと制御したい場合は、オブジェクトのextra メンバに定義を与えることもできます。例えば、以下の行は、qmake にこのインストールセットの一連のコマンドを実行するように指示します:

unix:documentation.extra = create_docs; mv master.doc toc.doc

unix スコープは、これらの特定のコマンドが Unix プラットフォーム上での み実行されることを保証します。他のプラットフォーム用の適切なコマンドは、他のスコープルールで定義できます。

extra メンバで指定されたコマンドは、オブジェクトの他のメンバの命令が実行される前に実行されます。

組み込みインストールセットをINSTALLS 変数に追加し、files またはextra メンバーを指定しない場合、qmake がコピーする必要があるものを決定します。現在、targetdlltarget のインストールセットがサポートされています。例えば

target.path = /usr/local/myprogram
INSTALLS += target

上記の行では、qmake は何がコピーされる必要があるかを知っており、インストール処理を自動的に行います。

カスタムターゲットの追加

qmake はクロスプラットフォームビルドツールに期待されるすべてのことを行おうとします。プラットフォーム依存の特別なコマンドを実行する必要がある場合、これはしばしば理想的ではありません。これは、異なる qmake バックエンドに特定の指示を与えることで実現できます。

Makefile 出力のカスタマイズは、qmake の他の場所で見られるようなオブジェクトスタイルの API を通して実行されます。オブジェクトはメンバーを指定することで自動的に定義されます。例えば

mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2

mytarget2.commands = @echo Building $$mytarget.target

touch 上記の定義はmytarget という qmake ターゲットを定義し、.buildfile という Makefile ターゲットを含んでいます。最後に、.depends のメンバは、mytarget が、その後に定義される別のターゲット、mytarget2 に依存することを指定します。mytarget2 はダミーのターゲットです。コンソールにテキストをエコーするためだけに定義されている。

最後のステップは、変数QMAKE_EXTRA_TARGETS を使って、このオブジェクトがビルドすべきターゲットであることをqmakeに指示することである:

QMAKE_EXTRA_TARGETS += mytarget mytarget2

カスタムターゲットを実際にビルドするために必要なことはこれだけだ。もちろん、これらのターゲットのひとつをqmakeのビルドターゲットに結びつけたい場合もあるだろう。これを行うには、PRE_TARGETDEPS のリストに Makefile ターゲットを含めるだけです。

カスタムターゲットの仕様は以下のメンバーをサポートしています:

メンバー説明
コマンドカスタムビルドターゲットを生成するためのコマンドです。
CONFIGカスタムビルドターゲットの特定の設定オプション。recursive に設定すると、サブターゲット固有の Makefile 内で関連するターゲットを呼び出すルールを Makefile 内で作成する必要があることを示します。このメンバのデフォルトは、サブターゲットごとにエントリを作成します。
依存カスタムビルドターゲットが依存する既存のビルドターゲット。
recurseサブターゲット固有の Makefile で呼び出す Makefile のルールを作成するときに使用するサブターゲットを指定します。このメンバは、CONFIGrecursive が設定されている場合にのみ使用されます。典型的な値は "Debug" と "Release" です。
recurse_targetMakefile 内のルールに対して、サブターゲット Makefile 経由でビルドすべきターゲットを指定します。このメンバは、$(MAKE) -f Makefile.[subtarget] [recurse_target] のようなものを追加する。このメンバは、recursiveCONFIG で設定されている場合にのみ使用される。
ターゲットカスタム・ビルド・ターゲットの名前。

コンパイラの追加

新しいコンパイラやプリプロセッサをサポートするように qmake をカスタマイズすることができます:

new_moc.output  = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc

上記の定義により、mocに代わるものがあれば、それを使用することができます。コマンドは(input メンバから)NEW_HEADERS 変数に与えられたすべての引数に対して実行され、結果はoutput メンバで定義されたファイルに書き込まれます。このファイルはプロジェクト内の他のソースファイルに追加される。さらに、qmake はdepend_command を実行して依存情報を生成し、この情報もプロジェクトに配置します。

カスタム・コンパイラ仕様は、以下のメンバーをサポートしています:

メンバー説明
コマンド入力から出力を生成するためのコマンド。
CONFIGカスタム・コンパイラ固有の設定オプション。詳細は CONFIG の表を参照。
depend_command出力の依存関係のリストを生成するために使用するコマンドを指定します。
依存関係タイプ出力ファイルのタイプを指定します。既知のタイプ(TYPE_C、TYPE_UI、TYPE_QRCなど)であれば、これらのタイプのファイルとして扱われます。
依存関係出力ファイルの依存関係を指定します。
inputカスタム・コンパイラで処理するファイルを指定する変数。
名前カスタムコンパイラが何を行っているかの説明。これは一部のバックエンドでのみ使用されます。
出力カスタムコンパイラから出力されるファイル名。
output_function作成されるファイル名を指定するためのカスタム qmake 関数を指定します。
変数proファイルで$(VARNAME)として参照されるとき、ここで指定された変数が$(QMAKE_COMP_VARNAME)に置き換えられることを示します。
variable_out出力から作成されたファイルを追加する変数。

CONFIG メンバは以下のオプションをサポートしています:

オプション説明
combineすべての入力ファイルを1つの出力ファイルに結合することを示す。
target_predeps出力をPRE_TARGETDEPSのリストに追加することを示す。
明示的依存関係出力の依存関係はdependsメンバからのみ生成され、それ以外からは生成されません。
dep_existing_only.depend_commandの結果であるすべての依存関係が存在するかどうかチェックされます。存在しない依存関係は無視されます。この値は Qt 5.13.2 で導入されました。
dep_lines.depend_commandからの出力は、1行に1ファイルであると解釈されます。デフォルトは空白で分割され、後方互換性のためだけに維持されます。
no_link出力がリンクされるオブジェクトのリストに追加されないことを示します。

ライブラリ依存性

ライブラリに対してリンクする場合、qmake はそのライブラリが他にどのようなライブラリに対してリンクしているかを知るために、基本的なプラットフォームに依存し、プラットフォームにそれらを取り込ませることがよくあります。しかし、多くの場合、これでは十分ではありません。例えば、ライブラリを静的にリンクする場合、他のライブラリはリンクされないので、それらのライブラリへの依存関係は作成されません。しかし、後でこのライブラリをリンクするアプリケーションは、静的ライブラリが必要とするシンボルがどこにあるかを知る必要があります。qmakeは、明示的に追跡を有効にした場合、適切な場合にはライブラリの依存関係を追跡しようとします。

最初のステップは、ライブラリ自体の依存関係の追跡を有効にすることです。これを行うには、qmakeにライブラリの情報を保存するように指示する必要があります:

CONFIG += create_prl

これはlib テンプレートにのみ関係し、それ以外では無視されます。このオプションを有効にすると、qmake は .prl で終わるファイルを作成し、ライブラリに関するメタ情報を保存します。このメタファイルは普通のプロジェクトファイルと同じですが、内部変数の宣言だけが含まれています。このライブラリをインストールするとき、INSTALLS宣言でターゲットとして指定することで、qmakeは自動的に.prlファイルをインストールパスにコピーします。

このプロセスの第2段階は、スタティック・ライブラリを使用するアプリケーションで、このメタ情報の読み取りを有効にすることです:

CONFIG += link_prl

これを有効にすると、qmakeはアプリケーションによってリンクされるすべてのライブラリを処理し、そのメタ情報を見つけます。qmakeはこれを使用して関連するリンク情報を決定し、特にアプリケーションプロジェクトファイルのDEFINESと LIBSのリストに値を追加します。qmakeがこのファイルを処理したら、LIBS 変数で新しく導入されたライブラリを調べ、依存する .prl ファイルを見つけ、すべてのライブラリが解決されるまで続けます。この時点で、Makefileは通常通り作成され、ライブラリはアプリケーションに対して明示的にリンクされます。

.prlファイルはqmakeによってのみ作成されるべきであり、オペレーティングシステム間で転送されるべきではありません。

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