如何覆盖GN目标/模板的变量值?

时间:2018-02-28 11:17:08

标签: google-chrome chromium build-tools gn

我在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更改文件名称,而不是扩展程序

问题的逻辑延续是否可以覆盖{。1}}或is_debug之类的变量而不是.gn文件中的变量,而只覆盖目标/模板?

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

1 个答案:

答案 0 :(得分:0)

在我的案例中,添加output_extension为我工作:

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

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