Что такое art.go? И почему считается способ записи условных выражений в файлы bp?

Я пытаюсь найти способ написать условное в файл.bp.

Я нашел документацию здесь: https://android.googlesource.com/platform/build/soong/+/HEAD/README.md

У этого есть "Как я пишу условия?" часть, которая указывает на art.go: https://android.googlesource.com/platform/art/+/master/build/art.go

Что вряд ли является ответом на вышеупомянутый вопрос. Требуется гораздо больше разъяснений, чем простая ссылка.

У меня есть cc_binary в моем Android.bp для модуля (HAL), который я разрабатываю.

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

Я хочу добавить условный флаг (-DCONDITIONAL), который будет установлен в 1, если переменная среды SOME_ENV_VAR равна "some_value".

Я нашел много примеров похожих файлов *.go внутри AOSP, но они оказались бесполезны для меня, потому что я не могу просто применить описанные там практики к своему делу. Мне также не удалось найти какую-либо документацию о файлах *.go, в которой описано, как их использовать. Я даже не могу найти что-то вроде "простейшего примера использования".

Кто-нибудь знает, возможно ли то, что я пытаюсь сделать здесь?

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

Затем вы можете использовать my_defaults вместо обычного cc_defaults в вашем Android.bp, например

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

cc_binary {
  name: "my_binary",
  defaults: ["my-defaults-instance"]
}
Другие вопросы по тегам