Fuchsiaシステムninjaコンパイル
5655 ワード
次のfxサブコマンドbuildを使用してfuchsiaコードをコンパイルします.実際に実行されるのは、ディレクトリtools/devshell/のコンパイルスクリプトbuildです.fxはninjaを呼び出して2回実行します:1回目のzirconコンパイル、2回目のfuchsiaコンパイル.
実際、各fxのサブコマンドはtools/devshellディレクトリのスクリプトファイルに対応しています.
もちろん、fx buildコマンドを使用してzirconを個別にコンパイルすることもできます.zirconのdefaultターゲットを次のようにコンパイルします.
または、fuchsiaのターゲットtargetを個別にコンパイルします.次のようにfuchsiaをコンパイルするdefaultターゲットは、zirconに依存するため、まずzirconをコンパイルし、その後fuchsiaターゲットをコンパイルします.
tools/devshell/buildスクリプトのメイン関数mainを見てみましょう.zirconのコンパイルディレクトリが存在しない場合は、buildtools/gnスクリプトを使用してコンパイルディレクトリを作成するfx-gen関数作成(tools/devshell/lib/var.sh)を呼び出します.上記のようにfuchsiaをコンパイルするtarget(上記のdefault)を指定すると、スクリプトは自動的にzircon_になります.targetはdefaultターゲットを追加します.すなわちfuchsiaをコンパイルするとzirconのdefaultターゲットが先にコンパイルされます.次にrun-ninja関数を呼び出してzircon関連コンパイルを行い、コンパイルディレクトリの指定-Cは:out/default.zircon.通常、パラメータ${zircon_targets[@]}は空です.
zirconコンパイルが完了した後、zircon関連targetをコンパイルするだけであれば、メイン関数はこれで終了します.zirconをコンパイルするdefaultターゲットがfuchsiaターゲットをコンパイルする準備をしている場合は、run-ninjaコンパイルfuchsiaを再度呼び出します.コンパイルディレクトリは、out/defaultとして指定されます.
簡単に言えば、関数run-ninjaはfx-run-ninja関数(tools/devshell/lib/vars.sh)のみをカプセル化し、buildtools/ninjaスクリプトを呼び出してコンパイルを実行します.
スクリプトbuildtools/ninjaは次のとおりです.SCRIPTにあげるだけROOTとTOOL_NAME 2つの変数に値を割り当て、exec_を呼び出します.tool.shスクリプト.
スクリプトexec_tool.shは以下の通りです.システムアーキテクチャに基づいて動的コンパイルツールのパスを取得し、コンパイルを実行します.たとえば、最終的なninjaパスはbuildtools/linux-x 64/ninjaです.
ninjaのコンパイルルールファイルのデフォルトはbuildです.次のようにzirconディレクトリの下にあるbuild.ninjaファイル.
次のninjaコマンドツールdepsを使用して、機能の依存関係(一部のみ表示)を表示します.ターゲットcowsay.cowsay.oの依存関係には、1つのCファイルと複数のヘッダファイルが含まれる.
ninja実行による依存関係とログファイルはコンパイルディレクトリの下にあり、それぞれ.ninja_depsと.ninja_log.
ninjaツールコマンドbrowseは依存図を生成し、8000ポートで実行されるウェブサービスを起動し、ブラウザで表示できます.ローカルリスニングアドレスを指定できます:--host=192.168.1.xは、--port=8080などのリスニングポートを指定することもできます.
END
~/fuchsia$ scripts/fx build
実際、各fxのサブコマンドはtools/devshellディレクトリのスクリプトファイルに対応しています.
~/fuchsia$ ls tools/devshell/
add-update-source cp lib mkzedboot README.md serial shell wait
aemu doctor list-boards netaddr reboot serve ssh
args exec list-packages netboot run serve-updates symbolize
build flash list-products netls run-host-tests set syslog
~/fuchsia$
もちろん、fx buildコマンドを使用してzirconを個別にコンパイルすることもできます.zirconのdefaultターゲットを次のようにコンパイルします.
~/fuchsia$ scripts/fx build zircon/default
ninja: Entering directory `/home/kai/fuchsia/out/default.zircon'
[65/65] STAMP obj/default.stamp
~/fuchsia$
または、fuchsiaのターゲットtargetを個別にコンパイルします.次のようにfuchsiaをコンパイルするdefaultターゲットは、zirconに依存するため、まずzirconをコンパイルし、その後fuchsiaターゲットをコンパイルします.
~/fuchsia$ scripts/fx build default
ninja: Entering directory `/home/kai/fuchsia/out/default.zircon'
ninja: no work to do.
ninja: Entering directory `/home/kai/fuchsia/out/default'
[1/1] Regenerating ninja files
[355/355] STAMP obj/default.stamp
~/fuchsia$
tools/devshell/buildスクリプトのメイン関数mainを見てみましょう.zirconのコンパイルディレクトリが存在しない場合は、buildtools/gnスクリプトを使用してコンパイルディレクトリを作成するfx-gen関数作成(tools/devshell/lib/var.sh)を呼び出します.上記のようにfuchsiaをコンパイルするtarget(上記のdefault)を指定すると、スクリプトは自動的にzircon_になります.targetはdefaultターゲットを追加します.すなわちfuchsiaをコンパイルするとzirconのdefaultターゲットが先にコンパイルされます.次にrun-ninja関数を呼び出してzircon関連コンパイルを行い、コンパイルディレクトリの指定-Cは:out/default.zircon.通常、パラメータ${zircon_targets[@]}は空です.
function main {
if [ ! -d "$ZIRCON_BUILDROOT" ]; then
echo >&2 "Re-running gn gen first (missing $ZIRCON_BUILDROOT)"
fx-gen || return
fi
if [ ${#fuchsia_targets[@]} -ne 0 ]; then
zircon_targets+=(default)
fi
run-ninja -C "${ZIRCON_BUILDROOT}" "${switches[@]}" "${zircon_targets[@]}"
zirconコンパイルが完了した後、zircon関連targetをコンパイルするだけであれば、メイン関数はこれで終了します.zirconをコンパイルするdefaultターゲットがfuchsiaターゲットをコンパイルする準備をしている場合は、run-ninjaコンパイルfuchsiaを再度呼び出します.コンパイルディレクトリは、out/defaultとして指定されます.
# If there were explicit Zircon targets and no other explicit targets,
# the Zircon run was enough by itself. Otherwise Zircon default is
# a prerequisite for any Fuchsia target (including implicit default).
if [ ${#fuchsia_targets[@]} -ne 0 -o ${#zircon_targets[@]} -eq 0 ]; then
run-ninja -C "${FUCHSIA_BUILD_DIR}" "${switches[@]}" "${fuchsia_targets[@]}"
fuchsia_status=$?
if [ "${status}" -eq 0 ]; then
status="${fuchsia_status}"
fi
fi
return "${status}"
}
簡単に言えば、関数run-ninjaはfx-run-ninja関数(tools/devshell/lib/vars.sh)のみをカプセル化し、buildtools/ninjaスクリプトを呼び出してコンパイルを実行します.
function run-ninja {
(fx-run-ninja "${FUCHSIA_DIR}/buildtools/ninja" "$@") || exit
}
スクリプトbuildtools/ninjaは次のとおりです.SCRIPTにあげるだけROOTとTOOL_NAME 2つの変数に値を割り当て、exec_を呼び出します.tool.shスクリプト.
readonly SCRIPT_ROOT="$(cd $(dirname ${BASH_SOURCE[0]} ) && pwd)"
readonly TOOL_NAME=$(basename "$0")
source "${SCRIPT_ROOT}/exec_tool.sh"
スクリプトexec_tool.shは以下の通りです.システムアーキテクチャに基づいて動的コンパイルツールのパスを取得し、コンパイルを実行します.たとえば、最終的なninjaパスはbuildtools/linux-x 64/ninjaです.
case "$(uname -s)" in
Darwin)
readonly HOST_PLATFORM="mac-x64"
;;
Linux)
readonly HOST_PLATFORM="linux-x64"
;;
esac
readonly TOOL_PATH="${SCRIPT_ROOT}/${HOST_PLATFORM}/${TOOL_NAME}"
exec "${TOOL_PATH}" "$@"
ninjaのコンパイルルールファイルのデフォルトはbuildです.次のようにzirconディレクトリの下にあるbuild.ninjaファイル.
~/fuchsia$ ls -l out/default.zircon/build.ninja*
-rw-rw-r-- 1 kai kai 1023201 Jun 13 02:46 out/default.zircon/build.ninja
-rw-rw-r-- 1 kai kai 49635 Jun 13 02:46 out/default.zircon/build.ninja.d
~/fuchsia$
次のninjaコマンドツールdepsを使用して、機能の依存関係(一部のみ表示)を表示します.ターゲットcowsay.cowsay.oの依存関係には、1つのCファイルと複数のヘッダファイルが含まれる.
~/fuchsia$ buildtools/linux-x64/ninja -C out/default -t deps
obj/examples/cowsay/cowsay.cowsay.o: #deps 8, deps mtime 1560228190 (VALID)
../../examples/cowsay/cowsay.c
../../zircon/third_party/ulib/musl/include/stdio.h
../../zircon/third_party/ulib/musl/include/features.h
../../zircon/third_party/ulib/musl/include/bits/alltypes.h
../../zircon/third_party/ulib/musl/include/bits/null.h
../../buildtools/linux-x64/clang/lib/clang/9.0.0/include/stddef.h
../../zircon/third_party/ulib/musl/include/string.h
../../zircon/third_party/ulib/musl/include/strings.h
ninja実行による依存関係とログファイルはコンパイルディレクトリの下にあり、それぞれ.ninja_depsと.ninja_log.
~/fuchsia$ ls -l out/default/.ninja_*
-rw-rw-r-- 1 kai kai 7086288 Jun 11 06:18 out/default/.ninja_deps
-rw-rw-r-- 1 kai kai 3025583 Jun 13 02:48 out/default/.ninja_log
~/fuchsia$
ninjaツールコマンドbrowseは依存図を生成し、8000ポートで実行されるウェブサービスを起動し、ブラウザで表示できます.ローカルリスニングアドレスを指定できます:--host=192.168.1.xは、--port=8080などのリスニングポートを指定することもできます.
~/fuchsia$ buildtools/linux-x64/ninja -C out/default -t browse
Web server running on localhost:8000, ctl-C to abort...
Web server pid 91479
END