gpt4 book ai didi

android - 有没有办法在 Android.bp 中添加/删除模块?

转载 作者:行者123 更新时间:2023-11-29 22:46:13 25 4
gpt4 key购买 nike

我正在尝试根据环境变量集在 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 deliberately does not support conditionals in Android.bp files. Instead, complexity in build rules that would require conditionals are handled in Go

但是我找不到控制整个模块而不是模块中的属性的方法。

有谁知道怎么做或者指南在哪里?

提前致谢:)

最佳答案

我假设您有以下设置:

cc_binary {
name: "my_binary",
srcs: ["some_file.cc"]
}

cc_prebuilt_binary {
name: "my_binary_prebuilt",
srcs: ["some_blob"]
}

我建议采用以下方法:

第一步:有条件地选择模块

soong 构建系统要求模块名称是唯一的。因此,在您的情况下,cc_prebuilt_binarycc_binary 需要不同的名称。因此,在您需要这些模块的地方,您必须选择正确的模块。

由于您正在处理二进制文件,我假设您是通过某些 .mk 文件中的 PRODUCT_PACKAGES 变量选择这些模块(而不是库,它可以也被选为另一个模块的依赖项)。然后,您可以将 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 中),根据 BUILD_SOURCE< 设置 enabled 标志 环境变量:

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"]
}

BUILD_SOURCE=1 及其 srcs 字段不应被评估时,您的 my_binary_prebuilt 应该被禁用。

关于android - 有没有办法在 Android.bp 中添加/删除模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com