Chromium
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だろうか。