我正在尝试根据环境变量集在Android.bp中添加/删除模块。 例如,如果我将BUILD_SOURCE设置为1,则会在android.bp中删除cc_prebuilt_binary,而是添加一些cc_binary。
我看过指南并看了下面的句子, a https://android.googlesource.com/platform/build/soong/#how-do-i-write-conditionals
Soong故意不支持Android.bp文件中的条件语句。取而代之的是,在Go中处理需要条件的构建规则的复杂性
但是我找不到控制整个模块的方法,而不是模块中的属性。
有人知道该怎么做或该指南在哪里?
预先感谢:)
答案 0 :(得分:1)
我假设您具有以下设置:
cc_binary {
name: "my_binary",
srcs: ["some_file.cc"]
}
cc_prebuilt_binary {
name: "my_binary_prebuilt",
srcs: ["some_blob"]
}
我建议采用以下方法:
soong构建系统要求模块名称必须唯一。因此,在您的情况下,cc_prebuilt_binary
和cc_binary
需要不同的名称。因此,在需要这些模块的地方,您必须选择正确的模块。
由于您正在处理二进制文件,因此我假设您是通过某些PRODUCT_PACKAGES
文件中的.mk
变量选择这些模块的(相对于库,库也可以选择作为依赖项)另一个模块)。然后,您可以将PRODUCT_PACKAGES
声明修改为例如:
ifeq ($(BUILD_SOURCE),1)
PRODUCT_PACKAGES += my_binary
else
PRODUCT_PACKAGES += my_binary_prebuilt
endif
如果两个模块的源文件始终可用,则无需进一步的工作。但是,例如如果BUILD_SOURCE=1
时根本无法使用预构建的二进制文件,则需要完全禁用此模块。这与步骤1:没有选择它的方法不同。对于禁用的模块,srcs
中指定的文件未经过可用性验证。
可以通过以下方式手动禁用:
cc_prebuilt_binary {
name: "my_binary_prebuilt",
srcs: ["some_blob"],
enabled: false
}
但是,我假设您要基于BUILD_SOURCE
环境变量自动执行此操作。
为此,您将定义一个自定义模块预设(例如,在文件my_prebuilt_preset.go
中),该预设根据enabled
环境变量设置BUILD_SOURCE
标志:
package my_prebuilt_preset
import (
"android/soong/android"
"android/soong/cc"
)
func myPrebuiltDefaults(ctx android.LoadHookContext) {
type props struct {
Target struct {
Android struct {
Enabled *bool
}
}
}
p := &props{}
p.Target.Android.Enabled = new(bool)
*p.Target.Android.Enabled = !ctx.AConfig().IsEnvTrue("BUILD_SOURCE")
ctx.AppendProperties(p)
}
func myPrebuiltDefaultsFactory() android.Module {
module := cc.DefaultsFactory()
android.AddLoadHook(module, myPrebuiltDefaults)
return module
}
func init() {
android.RegisterModuleType("my_prebuilt_preset", myPrebuiltDefaultsFactory)
}
您将在Android.bp中为Go文件添加一个模块:
bootstrap_go_package {
name: "soong-my_prebuilt_preset",
pkgPath: "android/soong/external/my_prebuilt_preset",
deps: [
"soong",
"soong-android",
"soong-cc"
],
srcs: [
"my_prebuilt_preset.go"
],
pluginFor: ["soong_build"]
}
然后将预设添加到您的my_binary_prebuilt
:
my_prebuilt_preset {
name: "my-prebuilt-preset"
}
cc_prebuilt_binary {
name: "my_binary_prebuilt",
srcs: ["some_blob"],
defaults: ["my-prebuilt-preset"]
}
然后,当不应评估my_binary_prebuilt
及其BUILD_SOURCE=1
字段时,应禁用您的srcs
。