skia/gn/BUILDCONFIG.gn の解説
著作権とライセンス
# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.- 説明: この部分はファイルの著作権が2016年のGoogle Inc.にあり、BSDスタイルのライセンスに従うことを示しています。
グローバルフラグの定義
is_skia_standalone = true
# It's best to keep the names and defaults of is_foo flags consistent with Chrome.- 説明:
is_skia_standaloneをtrueに設定します。これはSkiaが独立したプロジェクトとしてビルドされることを示します。- フラグ名とデフォルト値をChromeと一致させることを推奨しています。
ビルド引数の宣言(第一部)
declare_args() {
is_official_build = false
is_component_build = false
ndk = ""
# Android 5.0, Lollipop
ndk_api = 21
sanitize = ""
ar = "ar"
cc = "cc"
cxx = "c++"
win_sdk = "C:/Program Files (x86)/Windows Kits/10"
win_sdk_version = ""
win_vc = ""
win_toolchain_version = ""
clang_win = ""
clang_win_version = ""
ios_min_target = ""
ios_use_simulator =
target_os == "ios" && (target_cpu == "x86" || target_cpu == "x64")
# Enable -H, which prints the include tree during compilation.
# For use by external tools for analyzing include files.
show_includes = false
}- 説明: ここでは、ビルドに関連するさまざまな引数を宣言しています。
is_official_build: 公式ビルドかどうかを示すフラグ。デフォルトはfalse。is_component_build: コンポーネントビルドかどうかを示すフラグ。デフォルトはfalse。ndk: Android NDKのパス。ndk_api: 使用するNDKのAPIレベル。デフォルトは21(Android 5.0, Lollipop)。sanitize: サニタイザーの種類。ar: アーカイブツールの名前。デフォルトは"ar"。cc: Cコンパイラの名前。デフォルトは"cc"。cxx: C++コンパイラの名前。デフォルトは"c++"。win_sdk: Windows SDKのパス。win_sdk_version: Windows SDKのバージョン。win_vc: Visual C++のパス。win_toolchain_version: Visual C++ツールチェインのバージョン。clang_win: Windows用Clangのパス。clang_win_version: Windows用Clangのバージョン。ios_min_target: iOSの最小ターゲットバージョン。ios_use_simulator: iOSシミュレータを使用するかどうかを示すフラグ。target_osがiosかつtarget_cpuがx86またはx64の場合にtrue。show_includes: コンパイル時にインクルードツリーを表示するかどうかを示すフラグ。デフォルトはfalse。
ビルド引数の宣言(第二部)
declare_args() {
is_debug = !is_official_build
# This affects Skia's ABI; must be set consistently for Skia and dependents.
is_trivial_abi = !is_official_build
}- 説明: ここでは追加のビルド引数を宣言しています。
is_debug: デバッグビルドかどうかを示すフラグ。is_official_buildがfalseの場合にtrueになります。is_trivial_abi: Trivial ABIを使用するかどうかを示すフラグ。is_official_buildがfalseの場合にtrueになります。この設定はSkiaのABIに影響を与え、Skiaとその依存関係で一貫して設定する必要があります。
デバッグビルドと公式ビルドの矛盾チェック
assert(!(is_debug && is_official_build))- 説明: デバッグビルドと公式ビルドが同時に設定されていないことを確認します。両方が同時に
trueになることは許容されません。
WebAssemblyターゲットの設定
if (target_cpu == "wasm") {
target_os = "wasm"
}- 説明:
target_cpuが"wasm"の場合、target_osを"wasm"に設定します。
プラットフォームの検出
if (target_os == "") {
target_os = host_os
if (ndk != "") {
target_os = "android"
}
}
if (current_os == "") {
current_os = target_os
}- 説明:
target_osが空の場合、host_osをtarget_osに設定します。- さらに、
ndkが設定されている場合、target_osを"android"に設定します。 current_osが空の場合、current_osをtarget_osに設定します。
プラットフォームのフラグ設定
is_android = current_os == "android"
is_fuchsia = current_os == "fuchsia"
is_ios = current_os == "ios" || current_os == "tvos"
is_tvos = current_os == "tvos"
is_linux = current_os == "linux"
is_mac = current_os == "mac"
is_wasm = current_os == "wasm"
is_win = current_os == "win"- 説明:
current_osに基づいて各プラットフォームのフラグを設定します。is_android:current_osが"android"の場合にtrue。is_fuchsia:current_osが"fuchsia"の場合にtrue。is_ios:current_osが"ios"または"tvos"の場合にtrue。is_tvos:current_osが"tvos"の場合にtrue。is_linux:current_osが"linux"の場合にtrue。is_mac:current_osが"mac"の場合にtrue。is_wasm:current_osが"wasm"の場合にtrue。is_win:current_osが"win"の場合にtrue。
ChromeOSおよびAppleプラットフォームの設定
# This is just to make the Dawn build files happy. Skia itself uses target_os = "linux"
# for ChromeOS, so this variable will not affect Skia proper.
is_chromeos = false
# This is to make the ANGLE build files happy. Skia always uses is_mac and/or is_ios.
is_apple = is_mac || is_ios- 説明:
is_chromeos:falseに設定。これはDawnのビルドファイルのために存在しますが、Skia自体には影響しません。is_apple:is_macまたはis_iosがtrueの場合にtrue。これはANGLEのビルドファイルのために存在します。
ターゲットCPUの設定
if (target_cpu == "") {
target_cpu = host_cpu
if (is_android || is_ios) {
target_cpu = "arm64"
}
}
if (target_cpu == "x86_64") {
target_cpu = "x64"
}
if (current_cpu == "") {
current_cpu = target_cpu
}- 説明:
target_cpuが空の場合、host_cpuをtarget_cpuに設定します。- さらに、
is_androidまたはis_iosがtrueの場合、target_cpuを"arm64"に設定します。 target_cpuが"x86_64"の場合、target_cpuを"x64"に設定します。current_cpuが空の場合、current_cpuをtarget_cpuに設定します。
Clangコンパイラの判定
is_clang = is_android || is_ios || is_mac || is_fuchsia || is_wasm ||
(cc == "clang" && cxx == "clang++") || clang_win != ""
if (!is_clang && !is_win) {
is_clang = exec_script("//gn/is_clang.py",
[
cc,
cxx,
],
"value")
}- 説明:
is_clangは、以下のいずれかの条件が満たされた場合にtrueになります:is_android,is_ios,is_mac,is_fuchsia,is_wasmのいずれかがtrueccが"clang"でcxxが"clang++"clang_winが空でない
- これらの条件に当てはまらず、かつ
is_winでもない場合、スクリプトis_clang.pyを実行してccとcxxを引数に渡し、Clangコンパイラであるかを判定します。
Android NDKの設定
if (is_android) {
ndk_host = ""
ndk_target = ""
if (host_os == "linux") {
ndk_host = "linux-x86_64"
} else if (host_os == "mac") {
ndk_host = "darwin-x86_64"
} else if (host_os == "win") {
ndk_host = "windows-x86_64"
}
if (target_cpu == "arm64") {
ndk_target = "aarch64-linux-android"
} else if (target_cpu == "arm") {
ndk_target = "armv7a-linux-androideabi"
} else if (target_cpu == "x64") {
ndk_target = "x86_64-linux-android"
} else if (target_cpu == "x86") {
ndk_target = "i686-linux-android"
}
}- 説明:
is_androidがtrueの場合、Android NDKのホストシステムおよびターゲットシステムを設定します。host_osに基づいてndk_hostを設定します:- Linux:
"linux-x86_64" - macOS:
"darwin-x86_64" - Windows:
"windows-x86_64"
- Linux:
target_cpuに基づいてndk_targetを設定します:arm64:"aarch64-linux-android"arm:"armv7a-linux-androideabi"x64:"x86_64-linux-android"x86:"i686-linux-android"
Windows用MSVCコンパイラの検出
if (target_os == "win") {
# By default we look for 2017 (Enterprise, Pro, and Community), then 2015. If MSVC is installed in a
# non-default location, you can set win_vc to inform us where it is.
if (win_vc == "") {
win_vc = exec_script("//gn/find_msvc.py", [], "trim string")
}
assert(win_vc != "") # Could not find VC installation. Set win_vc to your VC
# directory.
}- 説明:
target_osが"win"の場合、MSVCコンパイラのインストール場所を検出します。- デフォルトでは、Visual Studio 2017(Enterprise、Pro、Community)の順に探し、それが見つからなければ2015を探します。MSVCがデフォルト以外の場所にインストールされている場合は、
win_vcを設定して場所を指定できます。 win_vcが空の場合、スクリプトfind_msvc.pyを実行してMSVCのインストール場所を取得します。win_vcが空でないことを確認するためにassertを使用し、空の場合はエラーメッセージを出力します。
Windowsプラットフォームの設定
if (target_os == "win") {- 説明: この部分は、ターゲットOSがWindowsである場合にのみ実行される設定を含んでいます。
Visual Studioツールチェインのバージョン設定
if (win_toolchain_version == "") {
win_toolchain_version = exec_script("//gn/highest_version_dir.py",
[
"$win_vc/Tools/MSVC",
"[0-9]{2}\.[0-9]{2}\.[0-9]{5}",
],
"trim string")
}- 説明:
win_toolchain_versionが空の場合、スクリプトhighest_version_dir.pyを実行して、Visual Studioツールチェインのバージョンを取得します。- スクリプトには、
$win_vc/Tools/MSVCディレクトリと、バージョン形式を指定する正規表現[0-9]{2}\.[0-9]{2}\.[0-9]{5}を渡します。 - 結果を
trim string形式で返し、win_toolchain_versionに設定します。
Windows SDKのバージョン設定
if (win_sdk_version == "") {
win_sdk_version = exec_script("//gn/highest_version_dir.py",
[
"$win_sdk/Include",
"[0-9]{2}\.[0-9]\.[0-9]{5}\.[0-9]",
],
"trim string")
}- 説明:
win_sdk_versionが空の場合、スクリプトhighest_version_dir.pyを実行して、Windows SDKのバージョンを取得します。- スクリプトには、
$win_sdk/Includeディレクトリと、バージョン形式を指定する正規表現[0-9]{2}\.[0-9]\.[0-9]{5}\.[0-9]を渡します。 - 結果を
trim string形式で返し、win_sdk_versionに設定します。
Clang for Windowsのバージョン設定
if (clang_win != "" && clang_win_version == "") {
clang_win_version = exec_script("//gn/highest_version_dir.py",
[
"$clang_win/lib/clang",
"[0-9]+\.[0-9]+\.[0-9]+",
],
"trim string")
}
}- 説明:
clang_winが空でなく、かつclang_win_versionが空の場合、スクリプトhighest_version_dir.pyを実行して、Clang for Windowsのバージョンを取得します。- スクリプトには、
$clang_win/lib/clangディレクトリと、バージョン形式を指定する正規表現[0-9]+\.[0-9]+\.[0-9]+を渡します。 - 結果を
trim string形式で返し、clang_win_versionに設定します。
全体の流れ
- この設定は、Windows環境でのビルドに必要なツールチェインとSDKのバージョンを自動的に検出し、設定することを目的としています。これにより、開発者は特定のバージョンを手動で設定する手間を省くことができます。
highest_version_dir.pyスクリプトは、指定されたディレクトリ内で最も高いバージョン番号を持つサブディレクトリを検索し、その名前を返すように設計されています。
コンポーネントの定義
# A component is either a static or a shared library.
template("component") {
_component_mode = "static_library"
if (is_component_build) {
_component_mode = "shared_library"
}
target(_component_mode, target_name) {
forward_variables_from(invoker, "*")
}
}- 説明:
- テンプレート名:
component - 目的: コンポーネントは静的ライブラリまたは共有ライブラリとして定義されます。
- 条件:
is_component_buildがtrueの場合、_component_modeを"shared_library"に設定し、それ以外の場合は"static_library"に設定します。 - ターゲットの定義:
_component_modeに基づいてターゲットを定義し、invokerからすべての変数を引き継ぎます。
- テンプレート名:
デフォルトコンフィグの定義
# Default configs
default_configs = [
"//gn/skia:default",
"//gn/skia:no_exceptions",
"//gn/skia:no_rtti",
]
if (!is_debug) {
default_configs += [
"//gn/skia:optimize",
"//gn/skia:NDEBUG",
]
}
if (is_trivial_abi) {
default_configs += [ "//gn/skia:trivial_abi" ]
}
if (!is_official_build) {
default_configs += [ "//gn/skia:debug_symbols" ]
}
default_configs += [ "//gn/skia:extra_flags" ]- 説明:
- 基本コンフィグ:
"//gn/skia:default""//gn/skia:no_exceptions""//gn/skia:no_rtti"
- 追加コンフィグ:
!is_debugの場合:"//gn/skia:optimize"と"//gn/skia:NDEBUG"is_trivial_abiの場合:"//gn/skia:trivial_abi"!is_official_buildの場合:"//gn/skia:debug_symbols"
- 共通コンフィグ:
"//gn/skia:extra_flags"
- 基本コンフィグ:
ターゲットごとのデフォルト設定
set_defaults("executable") {
configs = [ "//gn/skia:executable" ] + default_configs
}
set_defaults("source_set") {
configs = default_configs
}
set_defaults("static_library") {
configs = default_configs
}
set_defaults("shared_library") {
configs = default_configs
}
set_defaults("component") {
configs = default_configs
if (!is_component_build) {
complete_static_lib = true
}
}- 説明:
executableターゲット:configsに"//gn/skia:executable"とdefault_configsを設定。
source_setターゲット:configsにdefault_configsを設定。
static_libraryターゲット:configsにdefault_configsを設定。
shared_libraryターゲット:configsにdefault_configsを設定。
componentターゲット:configsにdefault_configsを設定。is_component_buildがfalseの場合、complete_static_libをtrueに設定。
Skiaのデフォルトコンフィグ設定
skia_target_default_configs = []
if (!is_official_build) {
skia_target_default_configs += [ "//gn/skia:warnings" ]
}- 説明:
skia_target_default_configsは、Skiaのターゲットに適用されるデフォルトのビルドコンフィグのリストです。is_official_buildがfalseの場合、デフォルトの警告設定//gn/skia:warningsを追加します。
Skiaのヘッダ用デフォルトコンフィグ設定
skia_header_target_default_configs = []
if (!is_official_build) {
skia_header_target_default_configs +=
[ "//gn/skia:warnings_for_public_headers" ]
}- 説明:
skia_header_target_default_configsは、Skiaの公開ヘッダに適用されるデフォルトのビルドコンフィグのリストです。is_official_buildがfalseの場合、公開ヘッダ用の警告設定//gn/skia:warnings_for_public_headersを追加します。
ツールチェインの設定
if (is_win) {
# Windows tool chain
set_default_toolchain("//gn/toolchain:msvc")
default_toolchain_name = "msvc"
host_toolchain = "msvc_host"
} else if (is_wasm) {
set_default_toolchain("//gn/toolchain:wasm")
default_toolchain_name = "wasm"
host_toolchain = "wasm"
} else {
# GCC-like toolchains, including Clang.
set_default_toolchain("//gn/toolchain:gcc_like")
default_toolchain_name = "gcc_like"
host_toolchain = "gcc_like_host"
}- 説明:
- Windowsの場合(
is_winがtrue):- デフォルトのツールチェインを
//gn/toolchain:msvcに設定します。 default_toolchain_nameを"msvc"に設定します。host_toolchainを"msvc_host"に設定します。
- デフォルトのツールチェインを
- WebAssemblyの場合(
is_wasmがtrue):- デフォルトのツールチェインを
//gn/toolchain:wasmに設定します。 default_toolchain_nameを"wasm"に設定します。host_toolchainを"wasm"に設定します。
- デフォルトのツールチェインを
- その他のプラットフォーム:
- デフォルトのツールチェインを
//gn/toolchain:gcc_likeに設定します。 default_toolchain_nameを"gcc_like"に設定します。host_toolchainを"gcc_like_host"に設定します。
- デフォルトのツールチェインを
- Windowsの場合(