Fuchsiaシステムninjaコンパイル

5655 ワード

次のfxサブコマンドbuildを使用してfuchsiaコードをコンパイルします.実際に実行されるのは、ディレクトリtools/devshell/のコンパイルスクリプトbuildです.fxはninjaを呼び出して2回実行します:1回目のzirconコンパイル、2回目のfuchsiaコンパイル.
~/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