【问题标题】:What is art.go? And why is it considered a way to write conditionals in bp files?什么是 art.go?为什么它被认为是在 bp 文件中编写条件的一种方式?
【发布时间】:2019-06-14 16:56:34
【问题描述】:

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

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

它有一个“我如何编写条件语句?”部分,指向 art.go:https://android.googlesource.com/platform/art/+/master/build/art.go

这几乎不是上述问题的答案。它需要比简单的链接更多的说明。

我的 Android.bp 中有我开发的模块 (HAL) 的 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 文件的文档,其中描述了如何使用它们来做事。我什至找不到像“最简单的用法示例”这样的东西。

有人知道我在这里尝试做什么吗?

【问题讨论】:

    标签: android android-soong


    【解决方案1】:

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

    【讨论】:

    • 嗨.. 在我的情况下,我需要包含基于一些全局变量的 src 文件。如何在 my_defaults 节点中添加该条件语句?你能解释一下吗
    • 嗨,我还没有测试过这个,但是应该可以在props 结构中添加一个Srcs []string 字段,然后根据Getenv 有条件地初始化它,如示例中所示。然后构建系统应该选择它。如果您发布一个单独的问题,我可以尝试更详细地介绍,因为不支持在 cmets 中发布多行代码。
    • 想重新构建问题以便更好地理解.. 我们需要在 my_defaults 节点中做的只是 src[] 本身就可以了吗?只有当我们为那个特定的环境变量设置了 cflags 时才会包含这个 src 集吗?
    • 我的理解是你有一个环境变量SOME_ENV,并且你想编译一些源文件some_file.c只有在设置SOME_ENV时。我不知道你是否也想根据环境变量设置cflags。在 go 文件中,您将调整 type props struct 以具有 Srcs []string 字段。如果您不需要调整 cflags,您可以从结构中删除它们。在结构声明的下方,您将根据SOME_ENV 初始化Srcs 字段。因此,如果设置了SOME_ENV,请将Srcs 字段设置为例如some_file.c,否则为其他值。
    • 在 bp 文件中,您可以使用my_defaults。请注意,很快构建系统会将所有属性合并在一起。所以如果go文件中的Srcs字段设置为some_file1.c,并且在bp文件中,你声明了一个使用my_defaults的二进制文件,同时也声明了自己的srcs: ["some_file2.c"],那么这不会覆盖my_defaults,但两者都会结合在一起。
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 2012-04-01
    • 2011-10-02
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多