什么是 art.go?为什么它被认为是一种在 bp 文件中编写条件的方法?

What is art.go? And why is it considered a way to write conditionals in bp files?

我正在尝试找到一种在 .bp 文件中编写条件的方法。

我在这里找到了文档:https://android.googlesource.com/platform/build/soong/+/HEAD/README.md

它有一个 "How do I write conditionals?" 部分,指向 art.go: https://android.googlesource.com/platform/art/+/master/build/art.go

这很难回答上述问题。它需要比简单的 link.

更多的说明

对于我开发的模块 (HAL),我的 Android.bp 中有 cc_binary。

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

我想添加一个条件 cflag (-DCONDITIONAL),如果环境变量 SOME_ENV_VAR 等于 "some_value",它将被设置为 1。

我在AOSP中找到了很多类似*.go文件的例子,但结果证明它们对我没有用,因为我不能简单地将那里描述的做法应用到我的案例中。 我也没有找到任何关于 *.go 文件的文档,它描述了如何使用它们来做事。我什至找不到像 "simplest example of usage".

这样的东西

有谁知道我在这里尝试做的事情是否可行?

在您的项目文件夹中,创建一个 "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"]
}

然后您可以在 Android.bp 中使用 "my_defaults" 而不是通常的 "cc_defaults",例如

my_defaults {
  name: "my-defaults-instance"
  // Set some additional non-conditional cflags ...
}

cc_binary {
  name: "my_binary",
  defaults: ["my-defaults-instance"]
}