Как переопределить значение переменной для GN target/ шаблона?

Я добавил shared_library Цель GN в моей сборке Chromium. Имеет расширение согласно определению в 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_debug или же is_component_build не в.gn файле, а только для цели / шаблона?

Допустим, я хочу построить V8 как is_component_build=true (и сделать это в v8.gni в шаблонах), но остальной код принимает значение по умолчанию или пользовательскую переменную.

1 ответ

Решение

В моем случае добавление output_extension работал на меня:

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

Не уверен насчет общего случая переопределения переменных.

Другие вопросы по тегам