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

放肆的年华 提交于 2019-12-11 02:32:36

问题


I am trying to find a way to write a conditional inside a .bp file.

I found a documentation here: https://android.googlesource.com/platform/build/soong/+/HEAD/README.md

It has a "How do I write conditionals?" part, which points to the art.go: https://android.googlesource.com/platform/art/+/master/build/art.go

Which is hardly an answer to the aforementioned question. It needs a lot more clarification than a simple link.

I have cc_binary in my Android.bp for the module (HAL) I develop.

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

I want to add a conditional cflag (-DCONDITIONAL), which will be set to 1 if environmental variable SOME_ENV_VAR is equal to "some_value".

I found a lot of examples of similar *.go files inside AOSP, but they turned out to be of no use for me, because I cannot simply apply practices described there to my case. I also failed to find any documentation about *.go files, which describes how to do stuff using them. I cannot even find something like "simplest example of usage".

Does anyone know is it even possible what I am trying to do here?


回答1:


In your project folder, create a "my_defaults.go" file, where you can define the logic that adds custom build flags based on environment variables or other conditions (which is basically what happens in the art.go that was given as an example).

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
}

In your Android.bp, declare the following module:

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

You can then use "my_defaults" instead of the usual "cc_defaults" in your Android.bp, e.g.

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

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


来源:https://stackoverflow.com/questions/56602427/what-is-art-go-and-why-is-it-considered-a-way-to-write-conditionals-in-bp-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!