首页 > 解决方案 > 有没有办法在 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 中处理

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

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

提前致谢 :)

标签: androidandroid-soong

解决方案


我假设你有以下设置:

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

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

我建议采用以下方法:

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

soong 构建系统要求模块名称是唯一的。因此,在您的情况下cc_prebuilt_binarycc_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字段不应该被评估。


推荐阅读