Что такое art.go?И почему считается способ записи условных выражений в файлы bp? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь найти способ записать условное в файл .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 Ответ

0 голосов
/ 17 июня 2019

В папке вашего проекта создайте файл «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"]
}
...