Chromium

提供:senooken JP Wiki
2023年12月6日 (水) 11:18時点におけるSenooken (トーク | 投稿記録)による版 (GN)

About

ChromiumはOSSのWebブラウザー。Google Chromeのベースコードになっている。

Debug

Logging

ChromiumはLOG/DLOGとVLOG/DVLOGの2系統のログ出力マクロが用意されている。それぞれ対応するオプションが異なる。VLOG/DVLOGが新しくて推奨されている。

情報源

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