高度な使用法
新しい設定機能の追加
qmake では、CONFIG変数で指定された値のリストに名前を追加することで、プロジェクトファイルに含めることができる独自のfeatures
を作成することができます。フィーチャーは、.prf
ファイルにあるカスタム関数と定義の集まりで、多くの標準ディレクトリのいずれかに存在することができます。これらのディレクトリの場所は多くの場所で定義されており、qmake は.prf
ファイルを探す際に、以下の順序でそれぞれのディレクトリをチェックします:
- 環境変数
QMAKEFEATURES
にリストされているディレクトリで、プラットフォームのパスリスト区切り文字(Unixの場合はコロン、Windowsの場合はセミコロン)で区切られたディレクトリのリストを含む。 QMAKEFEATURES
プロパティ変数にリストされた、プラットフォームのパスリスト区切り文字で区切られたディレクトリのリストを含むディレクトリ。mkspecs
ディレクトリの中にあるfeaturesディレクトリの中。mkspecs
ディレクトリは、環境変数QMAKEPATH
にリストされている、 プラットフォームのパスリスト区切り文字で区切られたディレクトリの リストの下に置くことができる。たとえば、$QMAKEPATH/mkspecs/<features>
。- QMAKESPEC環境変数で指定されたディレクトリの下にあるfeaturesディレクトリ。例:
$QMAKESPEC/<features>
. data_install/mkspecs
ディレクトリにある features ディレクトリ。例:data_install/mkspecs/<features>
.QMAKESPEC
環境変数で指定されたディレクトリの兄弟として存在する features ディレクトリ内。例:$QMAKESPEC/../<features>
.
次の features ディレクトリで features ファイルが検索されます:
features/unix
使用するプラットフォームによって、features/win32
、またはfeatures/macx
、が検索されます。features/
例えば、プロジェクト・ファイルに次のように代入するとします:
CONFIG += myfeatures
このようにCONFIG
変数を追加すると、qmake はプロジェクトファイルの解析が終わった後、myfeatures.prf
ファイルを探すために上記の場所を検索します。Unix システムでは、以下のファイルを探します:
$QMAKEFEATURES/myfeatures.prf
(環境変数 にリストされている各ディレクトリ)QMAKEFEATURES
$$QMAKEFEATURES/myfeatures.prf
(プロパティ変数 にリストされている各ディレクトリ)QMAKEFEATURES
myfeatures.prf
(プロジェクトのルート・ディレクトリ)。プロジェクトのルートは、トップ・レベルの ファイルによって決まります。ただし、 ファイルをサブ・ディレクトリまたはサブ・プロジェクトのディレクトリに置いた場合、プロジェクト・ルートはサブ・ディレクトリそのものになります。.pro
.qmake.cache
$QMAKEPATH/mkspecs/features/unix/myfeatures.prf
および (環境変数 にリストされている各ディレクトリに対して)。$QMAKEPATH/mkspecs/features/myfeatures.prf
QMAKEPATH
$QMAKESPEC/features/unix/myfeatures.prf
と$QMAKESPEC/features/myfeatures.prf
data_install/mkspecs/features/unix/myfeatures.prf
およびdata_install/mkspecs/features/myfeatures.prf
$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 がコピーする必要があるものを決定します。現在、target
とdlltarget
のインストールセットがサポートされています。例えば
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 のルールを作成するときに使用するサブターゲットを指定します。このメンバは、CONFIG でrecursive が設定されている場合にのみ使用されます。典型的な値は "Debug" と "Release" です。 |
recurse_target | Makefile 内のルールに対して、サブターゲット Makefile 経由でビルドすべきターゲットを指定します。このメンバは、$(MAKE) -f Makefile.[subtarget] [recurse_target] のようなものを追加する。このメンバは、recursive がCONFIG で設定されている場合にのみ使用される。 |
ターゲット | カスタム・ビルド・ターゲットの名前。 |
コンパイラの追加
新しいコンパイラやプリプロセッサをサポートするように 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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。