gn help toolchain
ツールチェイン
ツールチェインはソースコードをコンパイルするためのコマンドとビルドフラグの集まりである。
ツールチェイン外観
ビルド実行時にいくつものツールチェインを持つことができ、ターゲットは多数のツールチェインと同時に存在できる。ビルドファイルは参照されるすべてのツールチェインごとに実行され、GNコードはツールチェインごとにパラメータを変更できる。
単純な1つのツールチェインを使うビルドがあるとき、ビルド設定ファイルはビルドの開始時にロードされる。そのときset_default_toolchain()が呼ばれ("gn help set_default_toolchain"を参照)GNに使うツールチェインのラベルを与える。ツールチェイン定義のtoolchain_argsセクションは無視される。
ターゲットが他のツールチェインを使うターゲットに依存しているとき("gn help labels"参照)、GNは2番めのツールチェインを使ってビルドを行う。GNはtoolchain_argsで指定された値を上書きしたビルド引数でビルド設定をロードする。デフォルトのツールチェインはすでに知られているのでset_default_toolchain()呼び出しは無視される。
2番めのツールチェインでファイルを読み込むとき、GNは以下を行う:
- ツールチェインが中で定義されているファイルを読み込む:
- マスタービルド設定ファイルを再実行する、このときツールチェイン定義のtoolchain_argsセクションが適用される。
- 上のステップで構成されたコンテキストで目的のビルドファイルをロードする。
ツールチェインの構成は2方向である。デフォルトのツールチェイン(例えばメインのビルドターゲット)では構成はビルド設定ファイルからツールチェインに流れる。ビルド設定ファイルはビルドの状態を見て(OSタイプ、CPUアーキテクチャ、など)どのツールチェインを使うかを決める(set_default_toolchain()経由で)。2番めのツールチェインでは、構成はツールチェインからビルド設定ファイルに流れる:ツールチェイン定義のtoolchain_argsでビルドが再実行される。
関数と変数
tool()
tool()関数呼び出しはコマンドを指定する("gn help tool"参照)。
toolchain_args
実行時にビルド引数を上書きし、ツールチェインに渡す。これはscopeタイプの変数であり、変数名はdeclare_args()ブロックの変数に対応する。
2番めのツールチェインを使ってターゲットを指定したとき、マスタービルド構成ファイルはそのツールチェインのコンテキストで再解釈される。toolchain_argsは2番めのビルド実行の引数をコントロールする。
デフォルトのシステム引数やgn args経由の引数も同様に2番めの実行に渡される。ただしtoolchain_argsで上書きされているときは別である。
ツールチェインがデフォルトのときはtoolchain_argsは無視される。
これらの引数の概要は"gn help buildargs"を参照。
deps
ツールチェインの依存関係。これらの依存はコンパイルが始まる前に解決される。循環依存を避けるため、これらのターゲットは他のツールチェインで定義されていなければならない。
これはターゲットにリストで表され、一般的にはツールチェインを指定する。
deps = [ "//foo/bar:baz(//build//toolchain:bootstrap)" ]
このコンセプトはNinjaで表現するには不十分である(多くのルールの複製が必要になる)ので絶対に必要なときのみ使うべきである。
ツールチェイン定義の例
toolchain("32") { tool("cc") { command = "gcc {{source}}" ... } toolchain_args = { use_doom_melon = true # Doom melon always required for 32-bit builds. current_cpu = "x86" } } toolchain("64") { tool("cc") { command = "gcc {{source}}" ... } toolchain_args = { # use_doom_melon is not overridden here, it will take the default. current_cpu = "x64" } } toolchain_args = { # The 64-bit build needs this 32-bit helper. data_deps = [ ":helper(//toolchains:32)" ] } }
クロスツールチェインの依存関係の例
64ビットのターゲットが32ビットのバイナリに依存したい場合、data_depsを指定する。(data依存は実行時に必要とされリンクされないもの、64ビットと32ビットはリンクできないため)。
executable("my_program") { ... if (target_cpu == "x64") { # The 64-bit build needs this 32-bit helper. data_deps = [ ":helper(//toolchains:32)" ] } } if (target_cpu == "x86") { # Our helper library is only compiled in 32-bits. shared_library("helper") { ... } }