android - 有没有办法在 Android.bp 中添加/删除模块?
问题描述
我正在尝试根据环境变量集在 Android.bp 中添加/删除模块。例如,如果我将 1 设置为 BUILD_SOURCE,则 Android.bp 中的 cc_prebuilt_binary 会被删除,而会添加一些 cc_binary。
我看过指南并看到下面 的句子,https://android.googlesource.com/platform/build/soong/#how-do-i-write-conditionals
宋故意不支持 Android.bp 文件中的条件。相反,需要条件的构建规则的复杂性在 Go 中处理
但是我找不到控制整个模块而不是模块中的属性的方法。
有谁知道怎么做或指南在哪里?
提前致谢 :)
解决方案
我假设你有以下设置:
cc_binary {
name: "my_binary",
srcs: ["some_file.cc"]
}
cc_prebuilt_binary {
name: "my_binary_prebuilt",
srcs: ["some_blob"]
}
我建议采用以下方法:
第 1 步:有条件地选择模块
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
第 2 步:有条件地启用模块
如果两个模块的源文件始终可用,则不需要进一步的工作。但是,例如,如果预构建的二进制文件在 时根本不可用,则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
字段不应该被评估。
推荐阅读
- c# - 替换字符但提供正确的转义
- php - Firebase 通知,在后台或被杀死时不显示,但发送数据
- c - 整数类型显示 10 位 RGB 用于显示
- asp.net-mvc - 代表用户获取 Azure AD 令牌 - NetCore2
- google-api-dotnet-client - Google.Apis.Request.RequestsError - 无权访问此资源
- c# - 如何为 Assembly.LoadFrom 方法进行卸载
- python - 没有名为“matplotlib.finance”的模块,已弃用,且 mpl_finance 也未维护
- java - 更正应用程序的类路径,使其包含一个兼容的 org.axonframework.eventsourcing.eventstore.jpa 版本
- reactjs - Babel 无法为 React 的 render() 函数编译简单的 JSX - 使用 Visual Studio 代码
- python - 如何比较具有两个条件的两个列表?