「Chromium」の版間の差分
(Option) |
(GN) |
||
34行目: | 34行目: | ||
=== Option === | === Option === | ||
起動オプションは [[https://chromium.googlesource.com/chromium/src/+/refs/heads/main/content/public/common/content_switches.cc content/public/common/content_switches.cc - chromium/src - Git at Google]] のソースコードにある。 | 起動オプションは [[https://chromium.googlesource.com/chromium/src/+/refs/heads/main/content/public/common/content_switches.cc content/public/common/content_switches.cc - chromium/src - Git at Google]] のソースコードにある。 | ||
== GN == | |||
情報源: [https://gn.googlesource.com/gn/+/main/docs/language.md GN Language and Operation]。 | |||
GNはChromiumで採用されているBUILD.gnのビルド設定記述言語。 | |||
=== GN build configuration === | |||
情報源: [https://chromium.googlesource.com/playground/chromium-org-site/+/refs/heads/main/developers/gn-build-configuration.md Chromium - GN build configuration]。 | |||
Chromiumのargs.gnのビルド設定で使用できる設定がいくつかある。 | |||
* is_debug=false | |||
* dcheck_always_on=true | |||
* is_component_build | |||
* symol_level | |||
* enable_nacl | |||
* remove_webcore_debug_symbols | |||
* target_cpu | |||
* use_goma | |||
* is_official_build | |||
* is_chrome_branded | |||
=== Targets === | |||
[target] というのがあって、これがビルドグラフのノードになる。一般的には、生成物のバイナリー、ライブラリーを指す。targetは別のtargetに依存する。組み込みのtargetは以下となる。gn help <targettype> で細かい情報を確認できる。 | |||
* action | |||
* action_foreach | |||
* bundle_data | |||
* create_bundle | |||
* executable | |||
* group | |||
* shared_library | |||
* loadable_module | |||
* source_set: 軽量仮想静的ライブラリー。 | |||
* static_library | |||
templateを使うことでカスタムtargetタイプを作れる。Chromeでは以下のtemplateを使っている。 | |||
* component: ビルドタイプに応じたsource_setかshred_library。 | |||
=== Configs === | |||
[configs] は名前付きオブジェクト。ディレクトリーやdefineを含むフラグの集合を指定する。[target] に適用され、依存targetに押し込まれる。 | |||
以下のように定義する。 | |||
config("myconfig") { | |||
includes = [ "src/include" ] | |||
defines = [ "ENABLE_DOOM_MELON" ] | |||
} | |||
targetへのconfigの適用には以下のようにする。 | |||
executable("doom_melon") { | |||
configs = [ ":myconfig" ] | |||
} | |||
一般的に、configs += “:myconfig” でデフォルトのリストに追記する。 | |||
=== Public configs === | |||
targetは依存している他のtargetに設定を適用できる。もっとも一般的な例はサードパーティーtargetだ。適切なコンパイルのためのヘッダーのためのdefineやディレクトリーincludeを必要とする。サードパーティーライブラリーと同様に、そのライブラリーを使用するtargetもコンパイルのために、設定を適用したいでしょう。 | |||
このために、適用したい設定のconfigを以下のように書く。 | |||
config("my_external_library_config") { | |||
includes = "." | |||
defines = [ "DISABLE_JANK" ] | |||
} | |||
それから、以下の記述でこのconfigはpublic configとしてtargetに追加される。これは依存しているtargetと同様にtargetにも両方に適用する。 | |||
shared_library("my_external_library") { | |||
... | |||
# Targets that depend on this get this config applied. | |||
public_configs = [ ":my_external_library_config" ] | |||
} | |||
依存targetは、public依存としてあなたのtargetに追加することで、他の依存ツリーレベルを前倒しできる。 | |||
static_library("intermediate_library") { | |||
... | |||
# Targets that depend on this one also get the configs from "my external library". | |||
public_deps = [ ":my_external_library" ] | |||
} | |||
targetは全依存物にconfigを進められる。all_dependent_configとしての設定のリンク境界に達するまで。これは推奨しない。代わりに、フラグの適用場所の制御にはpublic_depsを使う。 | |||
Chromeには、build/buildflag_header.gniのビルドフラグヘッダーシステムがある。コンパイラーdefineのdefineのために。 | |||
わかりにくいので整理する。 | |||
* public_configs: targetと依存targetの両方に指定したconfigが適用される。 | |||
* public_deps: targetと依存targetの両方に指定したtargetのconfigが適用される。 | |||
public_configsがconfig同士なのに対し、public_depsはtarget同士になる。基本はpublic_configsだろうか。 |
2023年12月6日 (水) 11:18時点における版
About
ChromiumはOSSのWebブラウザー。Google Chromeのベースコードになっている。
Debug
Logging
ChromiumはLOG/DLOGとVLOG/DVLOGの2系統のログ出力マクロが用意されている。それぞれ対応するオプションが異なる。VLOG/DVLOGが新しくて推奨されている。
情報源
- Chromium Docs - Tips for debugging on Linux
- How to enable logging
- base/logging.h - chromium/src - Git at Google
DLOG/DVLOGはis_debug=trueのときのみ有効になる。
- --log-level=0: LOG/DLOGの出力ログの制御。
- --v=0: VLOG/DVLOGの出力ログの制御。
- --enable-logging: is_debug=falseでもログ出力する?
Stacktrace
以下のようなコードでスタックトレースを出力できる (ChromiumOS Docs - How to get a stack trace at runtime for debugging purposes)。
#include "base/logging.h" #include "base/debug/stack_trace.h" LOG(ERROR) << base::debug::StackTrace(); base::debug::StackTrace().Print(); // stderr
CHECK/DCHECK
assert用のマクロがある (Chromium C++ style guide)。
DCHECKはDCHECK_IS_ONがtrueの場合にコンパイルされる。基本はこれを使う。
Option
起動オプションは [content/public/common/content_switches.cc - chromium/src - Git at Google] のソースコードにある。
GN
情報源: GN Language and Operation。
GNはChromiumで採用されているBUILD.gnのビルド設定記述言語。
GN build configuration
情報源: Chromium - GN build configuration。
Chromiumのargs.gnのビルド設定で使用できる設定がいくつかある。
- is_debug=false
- dcheck_always_on=true
- is_component_build
- symol_level
- enable_nacl
- remove_webcore_debug_symbols
- target_cpu
- use_goma
- is_official_build
- is_chrome_branded
Targets
[target] というのがあって、これがビルドグラフのノードになる。一般的には、生成物のバイナリー、ライブラリーを指す。targetは別のtargetに依存する。組み込みのtargetは以下となる。gn help <targettype> で細かい情報を確認できる。
- action
- action_foreach
- bundle_data
- create_bundle
- executable
- group
- shared_library
- loadable_module
- source_set: 軽量仮想静的ライブラリー。
- static_library
templateを使うことでカスタムtargetタイプを作れる。Chromeでは以下のtemplateを使っている。
- component: ビルドタイプに応じたsource_setかshred_library。
Configs
[configs] は名前付きオブジェクト。ディレクトリーやdefineを含むフラグの集合を指定する。[target] に適用され、依存targetに押し込まれる。
以下のように定義する。
config("myconfig") { includes = [ "src/include" ] defines = [ "ENABLE_DOOM_MELON" ] }
targetへのconfigの適用には以下のようにする。
executable("doom_melon") { configs = [ ":myconfig" ] }
一般的に、configs += “:myconfig” でデフォルトのリストに追記する。
Public configs
targetは依存している他のtargetに設定を適用できる。もっとも一般的な例はサードパーティーtargetだ。適切なコンパイルのためのヘッダーのためのdefineやディレクトリーincludeを必要とする。サードパーティーライブラリーと同様に、そのライブラリーを使用するtargetもコンパイルのために、設定を適用したいでしょう。
このために、適用したい設定のconfigを以下のように書く。
config("my_external_library_config") { includes = "." defines = [ "DISABLE_JANK" ] }
それから、以下の記述でこのconfigはpublic configとしてtargetに追加される。これは依存しているtargetと同様にtargetにも両方に適用する。
shared_library("my_external_library") { ... # Targets that depend on this get this config applied. public_configs = [ ":my_external_library_config" ] }
依存targetは、public依存としてあなたのtargetに追加することで、他の依存ツリーレベルを前倒しできる。
static_library("intermediate_library") { ... # Targets that depend on this one also get the configs from "my external library". public_deps = [ ":my_external_library" ] }
targetは全依存物にconfigを進められる。all_dependent_configとしての設定のリンク境界に達するまで。これは推奨しない。代わりに、フラグの適用場所の制御にはpublic_depsを使う。
Chromeには、build/buildflag_header.gniのビルドフラグヘッダーシステムがある。コンパイラーdefineのdefineのために。
わかりにくいので整理する。
- public_configs: targetと依存targetの両方に指定したconfigが適用される。
- public_deps: targetと依存targetの両方に指定したtargetのconfigが適用される。
public_configsがconfig同士なのに対し、public_depsはtarget同士になる。基本はpublic_configsだろうか。