如何覆盖 GN target/template 的变量值?

How to override variable value for GN target/template?

我在我的 Chromium 构建中添加了 shared_library GN 目标。根据 toolchain.gni 规则中定义的扩展名:

# Extension for shared library files (including leading dot).
if (is_mac || is_ios) {
  shlib_extension = ".dylib"
} else if (is_android && is_component_build) {
  # By appending .cr, we prevent name collisions with libraries already
  # loaded by the Android zygote.
  shlib_extension = ".cr.so"
} else if (is_posix) {
  shlib_extension = ".so"
} else if (is_win) {
  shlib_extension = ".dll"
} else {
  assert(false, "Platform not supported")
}

# Prefix for shared library files.
if (is_posix) {
  shlib_prefix = "lib"
} else {
  shlib_prefix = ""
}

我想更改扩展名,因此我需要覆盖 shlib_extension 变量,但仅限于我的 shared_library 目标。如果我修改 toolchain.gni 它将影响所有使用 shlib_extension 变量的目标。

我不想使用 output_name shared_library 属性,因为我可以看到使用 out_name="lib${target_name}.cr" 会产生以下 v8.ninja:

...
output_extension = .so
output_dir = .
solibs = ./libv8_libbase.cr.so

但如果有 shlib_ext=".cr.so" 则如下 v8.ninja:

...
output_extension = .cr.so
output_dir = .
solibs = ./libicui18n.cr.so ./libicuuc.cr.so ./libv8_libbase.cr.so

(这意味着 output_name 更改文件 名称 ,而不是 扩展名

作为问题的逻辑延续,是否可以覆盖 is_debugis_component_build 之类的变量,而不是在 .gn 文件中,而仅针对 target/template?

假设我想像 is_component_build=true 一样构建 V8(并在模板中的 v8.gni 中执行),但其余代码采用默认或用户定义的变量值。

就我而言,添加 output_extension 对我有用:

shared_library(target_name) {
  output_extension = "cr.so"
  ...
}

不确定覆盖变量的一般情况。