Что такое art.go? И почему считается способ записи условных выражений в файлы bp?
Я пытаюсь найти способ написать условное в файл.bp.
Я нашел документацию здесь: https://android.googlesource.com/platform/build/soong/+/HEAD/README.md
У этого есть "Как я пишу условия?" часть, которая указывает на art.go: https://android.googlesource.com/platform/art/+/master/build/art.go
Что вряд ли является ответом на вышеупомянутый вопрос. Требуется гораздо больше разъяснений, чем простая ссылка.
У меня есть cc_binary в моем Android.bp для модуля (HAL), который я разрабатываю.
cc_binary {
name: "name",
init_rc: ["script.rc"],
vintf_fragments: ["fragments.xml"],
relative_install_path: "path",
srcs: ["src1.cpp", "src2.cpp", ...],
shared_libs: ["sh_lib1", "sh_lib2", ...],
tstic_libs: ["lib1", "lib2", ...],
}
Я хочу добавить условный флаг (-DCONDITIONAL), который будет установлен в 1, если переменная среды SOME_ENV_VAR равна "some_value".
Я нашел много примеров похожих файлов *.go внутри AOSP, но они оказались бесполезны для меня, потому что я не могу просто применить описанные там практики к своему делу. Мне также не удалось найти какую-либо документацию о файлах *.go, в которой описано, как их использовать. Я даже не могу найти что-то вроде "простейшего примера использования".
Кто-нибудь знает, возможно ли то, что я пытаюсь сделать здесь?
1 ответ
В папке проекта создайте файл my_defaults.go, в котором вы можете определить логику, которая добавляет настраиваемые флаги сборки на основе переменных среды или других условий (что в основном происходит в art.go, приведенном в качестве примера).
package my_defaults
import (
"android/soong/android"
"android/soong/cc"
)
func globalFlags(ctx android.BaseContext) []string {
var cflags []string
if ctx.AConfig().Getenv("SOME_ENV_VAR") == "some_value" {
cflags = append(cflags, "-DCONDITIONAL")
}
return cflags
}
func deviceFlags(ctx android.BaseContext) []string {
var cflags []string
return cflags
}
func hostFlags(ctx android.BaseContext) []string {
var cflags []string
return cflags
}
func myDefaults(ctx android.LoadHookContext) {
type props struct {
Target struct {
Android struct {
Cflags []string
Enabled *bool
}
Host struct {
Enabled *bool
}
Linux struct {
Cflags []string
}
Darwin struct {
Cflags []string
}
}
Cflags []string
}
p := &props{}
p.Cflags = globalFlags(ctx)
p.Target.Android.Cflags = deviceFlags(ctx)
h := hostFlags(ctx)
p.Target.Linux.Cflags = h
p.Target.Darwin.Cflags = h
ctx.AppendProperties(p)
}
func init() {
android.RegisterModuleType("my_defaults", myDefaultsFactory)
}
func myDefaultsFactory() android.Module {
module := cc.DefaultsFactory()
android.AddLoadHook(module, myDefaults)
return module
}
В вашем Android.bp объявите следующий модуль:
bootstrap_go_package {
name: "soong-my_defaults",
pkgPath: "android/soong/my/defaults",
deps: [
"soong",
"soong-android",
"soong-cc"
],
srcs: [
"my_defaults.go"
],
pluginFor: ["soong_build"]
}
Затем вы можете использовать my_defaults вместо обычного cc_defaults в вашем Android.bp, например
my_defaults {
name: "my-defaults-instance"
// Set some additional non-conditional cflags ...
}
cc_binary {
name: "my_binary",
defaults: ["my-defaults-instance"]
}