Я добавил цель shared_library
GN в свою сборку Chromium. Он имеет расширение в соответствии с определенным в toolchain.gni
rules:
# 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
в шаблонах), но остальной код принимает значение переменной по умолчанию или заданное пользователем.