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

前端 未结 1 1189
北荒
北荒 2020-12-11 08:50

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

相关标签:
1条回答
  • 2020-12-11 09:50

    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"]
    }
    
    0 讨论(0)
提交回复
热议问题