refactor Bazel variable export

Most of the variable export code for cc modules can be re-used for
exporting variables for java modules. Refactor this code into a more
composable structure for reuse.

Test: build/bazel/bp2build.sh
Test: manual comparison of
  out/soong/soong_injection/cc_toolchain/constants.bzl
  with previous output
Change-Id: Ie5a6fee08cc888b7dc69c3e324e5c3f8aa269a8f
This commit is contained in:
Sam Delmerico 2022-03-25 14:55:40 +00:00
parent 85b935eff2
commit 7f88956c16
12 changed files with 305 additions and 237 deletions

View file

@ -36,6 +36,7 @@ bootstrap_go_package {
"bazel_handler.go",
"bazel_paths.go",
"config.go",
"config_bp2build.go",
"csuite_config.go",
"deapexer.go",
"defaults.go",
@ -96,6 +97,7 @@ bootstrap_go_package {
"bazel_handler_test.go",
"bazel_test.go",
"config_test.go",
"config_bp2build_test.go",
"csuite_config_test.go",
"defaults_test.go",
"depset_test.go",

View file

@ -19,6 +19,7 @@ import (
"fmt"
"strconv"
"android/soong/bazel"
"android/soong/starlark_fmt"
)
@ -393,10 +394,10 @@ func printApiLevelsStarlarkDict(config Config) string {
}
func StarlarkApiLevelConfigs(config Config) string {
return fmt.Sprintf(`# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
return fmt.Sprintf(bazel.GeneratedBazelFileWarning+`
_api_levels = %s
api_levels = _api_levels
`, printApiLevelsStarlarkDict(config),
)
}
}

View file

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package config
package android
import (
"fmt"
@ -21,33 +21,112 @@ import (
"sort"
"strings"
"android/soong/android"
"android/soong/bazel"
"android/soong/starlark_fmt"
"github.com/google/blueprint"
)
type bazelVarExporter interface {
asBazel(android.Config, exportedStringVariables, exportedStringListVariables, exportedConfigDependingVariables) []bazelConstant
// BazelVarExporter is a collection of configuration variables that can be exported for use in Bazel rules
type BazelVarExporter interface {
// asBazel expands strings of configuration variables into their concrete values
asBazel(Config, ExportedStringVariables, ExportedStringListVariables, ExportedConfigDependingVariables) []bazelConstant
}
// Helpers for exporting cc configuration information to Bazel.
var (
// ExportedVariables is a collection of interdependent configuration variables
type ExportedVariables struct {
// Maps containing toolchain variables that are independent of the
// environment variables of the build.
exportedStringListVars = exportedStringListVariables{}
exportedStringVars = exportedStringVariables{}
exportedStringListDictVars = exportedStringListDictVariables{}
// Note: these can only contain references to other variables and must be printed last
exportedVariableReferenceDictVars = exportedVariableReferenceDictVariables{}
exportedStringVars ExportedStringVariables
exportedStringListVars ExportedStringListVariables
exportedStringListDictVars ExportedStringListDictVariables
exportedVariableReferenceDictVars ExportedVariableReferenceDictVariables
/// Maps containing variables that are dependent on the build config.
exportedConfigDependingVars = exportedConfigDependingVariables{}
)
exportedConfigDependingVars ExportedConfigDependingVariables
type exportedConfigDependingVariables map[string]interface{}
pctx PackageContext
}
func (m exportedConfigDependingVariables) Set(k string, v interface{}) {
// NewExportedVariables creats an empty ExportedVariables struct with non-nil maps
func NewExportedVariables(pctx PackageContext) ExportedVariables {
return ExportedVariables{
exportedStringVars: ExportedStringVariables{},
exportedStringListVars: ExportedStringListVariables{},
exportedStringListDictVars: ExportedStringListDictVariables{},
exportedVariableReferenceDictVars: ExportedVariableReferenceDictVariables{},
exportedConfigDependingVars: ExportedConfigDependingVariables{},
pctx: pctx,
}
}
func (ev ExportedVariables) asBazel(config Config,
stringVars ExportedStringVariables, stringListVars ExportedStringListVariables, cfgDepVars ExportedConfigDependingVariables) []bazelConstant {
ret := []bazelConstant{}
ret = append(ret, ev.exportedStringVars.asBazel(config, stringVars, stringListVars, cfgDepVars)...)
ret = append(ret, ev.exportedStringListVars.asBazel(config, stringVars, stringListVars, cfgDepVars)...)
ret = append(ret, ev.exportedStringListDictVars.asBazel(config, stringVars, stringListVars, cfgDepVars)...)
// Note: ExportedVariableReferenceDictVars collections can only contain references to other variables and must be printed last
ret = append(ret, ev.exportedVariableReferenceDictVars.asBazel(config, stringVars, stringListVars, cfgDepVars)...)
return ret
}
// ExportStringStaticVariable declares a static string variable and exports it to
// Bazel's toolchain.
func (ev ExportedVariables) ExportStringStaticVariable(name string, value string) {
ev.pctx.StaticVariable(name, value)
ev.exportedStringVars.set(name, value)
}
// ExportStringListStaticVariable declares a static variable and exports it to
// Bazel's toolchain.
func (ev ExportedVariables) ExportStringListStaticVariable(name string, value []string) {
ev.pctx.StaticVariable(name, strings.Join(value, " "))
ev.exportedStringListVars.set(name, value)
}
// ExportVariableConfigMethod declares a variable whose value is evaluated at
// runtime via a function with access to the Config and exports it to Bazel's
// toolchain.
func (ev ExportedVariables) ExportVariableConfigMethod(name string, method interface{}) blueprint.Variable {
ev.exportedConfigDependingVars.set(name, method)
return ev.pctx.VariableConfigMethod(name, method)
}
// ExportSourcePathVariable declares a static "source path" variable and exports
// it to Bazel's toolchain.
func (ev ExportedVariables) ExportSourcePathVariable(name string, value string) {
ev.pctx.SourcePathVariable(name, value)
ev.exportedStringVars.set(name, value)
}
// ExportString only exports a variable to Bazel, but does not declare it in Soong
func (ev ExportedVariables) ExportString(name string, value string) {
ev.exportedStringVars.set(name, value)
}
// ExportStringList only exports a variable to Bazel, but does not declare it in Soong
func (ev ExportedVariables) ExportStringList(name string, value []string) {
ev.exportedStringListVars.set(name, value)
}
// ExportStringListDict only exports a variable to Bazel, but does not declare it in Soong
func (ev ExportedVariables) ExportStringListDict(name string, value map[string][]string) {
ev.exportedStringListDictVars.set(name, value)
}
// ExportVariableReferenceDict only exports a variable to Bazel, but does not declare it in Soong
func (ev ExportedVariables) ExportVariableReferenceDict(name string, value map[string]string) {
ev.exportedVariableReferenceDictVars.set(name, value)
}
// ExportedConfigDependingVariables is a mapping of variable names to functions
// of type func(config Config) string which return the runtime-evaluated string
// value of a particular variable
type ExportedConfigDependingVariables map[string]interface{}
func (m ExportedConfigDependingVariables) set(k string, v interface{}) {
m[k] = v
}
@ -67,14 +146,15 @@ type bazelConstant struct {
sortLast bool
}
type exportedStringVariables map[string]string
// ExportedStringVariables is a mapping of variable names to string values
type ExportedStringVariables map[string]string
func (m exportedStringVariables) Set(k string, v string) {
func (m ExportedStringVariables) set(k string, v string) {
m[k] = v
}
func (m exportedStringVariables) asBazel(config android.Config,
stringVars exportedStringVariables, stringListVars exportedStringListVariables, cfgDepVars exportedConfigDependingVariables) []bazelConstant {
func (m ExportedStringVariables) asBazel(config Config,
stringVars ExportedStringVariables, stringListVars ExportedStringListVariables, cfgDepVars ExportedConfigDependingVariables) []bazelConstant {
ret := make([]bazelConstant, 0, len(m))
for k, variableValue := range m {
expandedVar, err := expandVar(config, variableValue, stringVars, stringListVars, cfgDepVars)
@ -92,21 +172,16 @@ func (m exportedStringVariables) asBazel(config android.Config,
return ret
}
// Convenience function to declare a static variable and export it to Bazel's cc_toolchain.
func exportStringStaticVariable(name string, value string) {
pctx.StaticVariable(name, value)
exportedStringVars.Set(name, value)
}
// ExportedStringListVariables is a mapping of variable names to a list of strings
type ExportedStringListVariables map[string][]string
type exportedStringListVariables map[string][]string
func (m exportedStringListVariables) Set(k string, v []string) {
func (m ExportedStringListVariables) set(k string, v []string) {
m[k] = v
}
func (m exportedStringListVariables) asBazel(config android.Config,
stringScope exportedStringVariables, stringListScope exportedStringListVariables,
exportedVars exportedConfigDependingVariables) []bazelConstant {
func (m ExportedStringListVariables) asBazel(config Config,
stringScope ExportedStringVariables, stringListScope ExportedStringListVariables,
exportedVars ExportedConfigDependingVariables) []bazelConstant {
ret := make([]bazelConstant, 0, len(m))
// For each exported variable, recursively expand elements in the variableValue
// list to ensure that interpolated variables are expanded according to their values
@ -130,37 +205,17 @@ func (m exportedStringListVariables) asBazel(config android.Config,
return ret
}
// Convenience function to declare a static "source path" variable and export it to Bazel's cc_toolchain.
func exportVariableConfigMethod(name string, method interface{}) blueprint.Variable {
exportedConfigDependingVars.Set(name, method)
return pctx.VariableConfigMethod(name, method)
}
// ExportedStringListDictVariables is a mapping from variable names to a
// dictionary which maps keys to lists of strings
type ExportedStringListDictVariables map[string]map[string][]string
// Convenience function to declare a static "source path" variable and export it to Bazel's cc_toolchain.
func exportSourcePathVariable(name string, value string) {
pctx.SourcePathVariable(name, value)
exportedStringVars.Set(name, value)
}
// Convenience function to declare a static variable and export it to Bazel's cc_toolchain.
func exportStringListStaticVariable(name string, value []string) {
pctx.StaticVariable(name, strings.Join(value, " "))
exportedStringListVars.Set(name, value)
}
func ExportStringList(name string, value []string) {
exportedStringListVars.Set(name, value)
}
type exportedStringListDictVariables map[string]map[string][]string
func (m exportedStringListDictVariables) Set(k string, v map[string][]string) {
func (m ExportedStringListDictVariables) set(k string, v map[string][]string) {
m[k] = v
}
// Since dictionaries are not supported in Ninja, we do not expand variables for dictionaries
func (m exportedStringListDictVariables) asBazel(_ android.Config, _ exportedStringVariables,
_ exportedStringListVariables, _ exportedConfigDependingVariables) []bazelConstant {
func (m ExportedStringListDictVariables) asBazel(_ Config, _ ExportedStringVariables,
_ ExportedStringListVariables, _ ExportedConfigDependingVariables) []bazelConstant {
ret := make([]bazelConstant, 0, len(m))
for k, dict := range m {
ret = append(ret, bazelConstant{
@ -171,14 +226,23 @@ func (m exportedStringListDictVariables) asBazel(_ android.Config, _ exportedStr
return ret
}
type exportedVariableReferenceDictVariables map[string]map[string]string
// ExportedVariableReferenceDictVariables is a mapping from variable names to a
// dictionary which references previously defined variables. This is used to
// create a Starlark output such as:
// string_var1 = "string1
// var_ref_dict_var1 = {
// "key1": string_var1
// }
// This type of variable collection must be expanded last so that it recognizes
// previously defined variables.
type ExportedVariableReferenceDictVariables map[string]map[string]string
func (m exportedVariableReferenceDictVariables) Set(k string, v map[string]string) {
func (m ExportedVariableReferenceDictVariables) set(k string, v map[string]string) {
m[k] = v
}
func (m exportedVariableReferenceDictVariables) asBazel(_ android.Config, _ exportedStringVariables,
_ exportedStringListVariables, _ exportedConfigDependingVariables) []bazelConstant {
func (m ExportedVariableReferenceDictVariables) asBazel(_ Config, _ ExportedStringVariables,
_ ExportedStringListVariables, _ ExportedConfigDependingVariables) []bazelConstant {
ret := make([]bazelConstant, 0, len(m))
for n, dict := range m {
for k, v := range dict {
@ -201,24 +265,15 @@ func (m exportedVariableReferenceDictVariables) asBazel(_ android.Config, _ expo
return ret
}
// BazelCcToolchainVars generates bzl file content containing variables for
// Bazel's cc_toolchain configuration.
func BazelCcToolchainVars(config android.Config) string {
return bazelToolchainVars(
// BazelToolchainVars expands an ExportedVariables collection and returns a string
// of formatted Starlark variable definitions
func BazelToolchainVars(config Config, exportedVars ExportedVariables) string {
results := exportedVars.asBazel(
config,
exportedStringListDictVars,
exportedStringListVars,
exportedStringVars,
exportedVariableReferenceDictVars)
}
func bazelToolchainVars(config android.Config, vars ...bazelVarExporter) string {
ret := "# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.\n\n"
results := []bazelConstant{}
for _, v := range vars {
results = append(results, v.asBazel(config, exportedStringVars, exportedStringListVars, exportedConfigDependingVars)...)
}
exportedVars.exportedStringVars,
exportedVars.exportedStringListVars,
exportedVars.exportedConfigDependingVars,
)
sort.Slice(results, func(i, j int) bool {
if results[i].sortLast != results[j].sortLast {
@ -237,6 +292,8 @@ func bazelToolchainVars(config android.Config, vars ...bazelVarExporter) string
}
// Build the exported constants struct.
ret := bazel.GeneratedBazelFileWarning
ret += "\n\n"
ret += strings.Join(definitions, "\n\n")
ret += "\n\n"
ret += "constants = struct(\n"
@ -279,8 +336,8 @@ func variableReference(input string) (match, error) {
// string slice than to handle a pass-by-referenced map, which would make it
// quite complex to track depth-first interpolations. It's also unlikely the
// interpolation stacks are deep (n > 1).
func expandVar(config android.Config, toExpand string, stringScope exportedStringVariables,
stringListScope exportedStringListVariables, exportedVars exportedConfigDependingVariables) ([]string, error) {
func expandVar(config Config, toExpand string, stringScope ExportedStringVariables,
stringListScope ExportedStringListVariables, exportedVars ExportedConfigDependingVariables) ([]string, error) {
// Internal recursive function.
var expandVarInternal func(string, map[string]bool) (string, error)

View file

@ -12,25 +12,24 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package config
package android
import (
"android/soong/bazel"
"testing"
"android/soong/android"
)
func TestExpandVars(t *testing.T) {
android_arm64_config := android.TestConfig("out", nil, "", nil)
android_arm64_config.BuildOS = android.Android
android_arm64_config.BuildArch = android.Arm64
android_arm64_config := TestConfig("out", nil, "", nil)
android_arm64_config.BuildOS = Android
android_arm64_config.BuildArch = Arm64
testCases := []struct {
description string
config android.Config
stringScope exportedStringVariables
stringListScope exportedStringListVariables
configVars exportedConfigDependingVariables
config Config
stringScope ExportedStringVariables
stringListScope ExportedStringListVariables
configVars ExportedConfigDependingVariables
toExpand string
expectedValues []string
}{
@ -41,7 +40,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "single level expansion for string var",
stringScope: exportedStringVariables{
stringScope: ExportedStringVariables{
"foo": "bar",
},
toExpand: "${foo}",
@ -49,7 +48,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "single level expansion with short-name for string var",
stringScope: exportedStringVariables{
stringScope: ExportedStringVariables{
"foo": "bar",
},
toExpand: "${config.foo}",
@ -57,7 +56,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "single level expansion string list var",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"foo": []string{"bar"},
},
toExpand: "${foo}",
@ -65,11 +64,11 @@ func TestExpandVars(t *testing.T) {
},
{
description: "mixed level expansion for string list var",
stringScope: exportedStringVariables{
stringScope: ExportedStringVariables{
"foo": "${bar}",
"qux": "hello",
},
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"bar": []string{"baz", "${qux}"},
},
toExpand: "${foo}",
@ -77,7 +76,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "double level expansion",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"foo": []string{"${bar}"},
"bar": []string{"baz"},
},
@ -86,7 +85,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "double level expansion with a literal",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"a": []string{"${b}", "c"},
"b": []string{"d"},
},
@ -95,7 +94,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "double level expansion, with two variables in a string",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"a": []string{"${b} ${c}"},
"b": []string{"d"},
"c": []string{"e"},
@ -105,7 +104,7 @@ func TestExpandVars(t *testing.T) {
},
{
description: "triple level expansion with two variables in a string",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"a": []string{"${b} ${c}"},
"b": []string{"${c}", "${d}"},
"c": []string{"${d}"},
@ -116,9 +115,9 @@ func TestExpandVars(t *testing.T) {
},
{
description: "expansion with config depending vars",
configVars: exportedConfigDependingVariables{
"a": func(c android.Config) string { return c.BuildOS.String() },
"b": func(c android.Config) string { return c.BuildArch.String() },
configVars: ExportedConfigDependingVariables{
"a": func(c Config) string { return c.BuildOS.String() },
"b": func(c Config) string { return c.BuildArch.String() },
},
config: android_arm64_config,
toExpand: "${a}-${b}",
@ -126,14 +125,14 @@ func TestExpandVars(t *testing.T) {
},
{
description: "double level multi type expansion",
stringListScope: exportedStringListVariables{
stringListScope: ExportedStringListVariables{
"platform": []string{"${os}-${arch}"},
"const": []string{"const"},
},
configVars: exportedConfigDependingVariables{
"os": func(c android.Config) string { return c.BuildOS.String() },
"arch": func(c android.Config) string { return c.BuildArch.String() },
"foo": func(c android.Config) string { return "foo" },
configVars: ExportedConfigDependingVariables{
"os": func(c Config) string { return c.BuildOS.String() },
"arch": func(c Config) string { return c.BuildArch.String() },
"foo": func(c Config) string { return "foo" },
},
config: android_arm64_config,
toExpand: "${const}/${platform}/${foo}",
@ -160,19 +159,19 @@ func TestExpandVars(t *testing.T) {
func TestBazelToolchainVars(t *testing.T) {
testCases := []struct {
name string
config android.Config
vars []bazelVarExporter
config Config
vars ExportedVariables
expectedOut string
}{
{
name: "exports strings",
vars: []bazelVarExporter{
exportedStringVariables{
vars: ExportedVariables{
exportedStringVars: ExportedStringVariables{
"a": "b",
"c": "d",
},
},
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
expectedOut: bazel.GeneratedBazelFileWarning + `
_a = "b"
@ -185,13 +184,13 @@ constants = struct(
},
{
name: "exports string lists",
vars: []bazelVarExporter{
exportedStringListVariables{
vars: ExportedVariables{
exportedStringListVars: ExportedStringListVariables{
"a": []string{"b1", "b2"},
"c": []string{"d1", "d2"},
},
},
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
expectedOut: bazel.GeneratedBazelFileWarning + `
_a = [
"b1",
@ -210,13 +209,13 @@ constants = struct(
},
{
name: "exports string lists dicts",
vars: []bazelVarExporter{
exportedStringListDictVariables{
"a": map[string][]string{"b1": []string{"b2"}},
"c": map[string][]string{"d1": []string{"d2"}},
vars: ExportedVariables{
exportedStringListDictVars: ExportedStringListDictVariables{
"a": map[string][]string{"b1": {"b2"}},
"c": map[string][]string{"d1": {"d2"}},
},
},
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
expectedOut: bazel.GeneratedBazelFileWarning + `
_a = {
"b1": ["b2"],
@ -233,13 +232,13 @@ constants = struct(
},
{
name: "exports dict with var refs",
vars: []bazelVarExporter{
exportedVariableReferenceDictVariables{
vars: ExportedVariables{
exportedVariableReferenceDictVars: ExportedVariableReferenceDictVariables{
"a": map[string]string{"b1": "${b2}"},
"c": map[string]string{"d1": "${config.d2}"},
},
},
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
expectedOut: bazel.GeneratedBazelFileWarning + `
_a = {
"b1": _b2,
@ -256,25 +255,25 @@ constants = struct(
},
{
name: "sorts across types with variable references last",
vars: []bazelVarExporter{
exportedStringVariables{
vars: ExportedVariables{
exportedStringVars: ExportedStringVariables{
"b": "b-val",
"d": "d-val",
},
exportedStringListVariables{
exportedStringListVars: ExportedStringListVariables{
"c": []string{"c-val"},
"e": []string{"e-val"},
},
exportedStringListDictVariables{
"a": map[string][]string{"a1": []string{"a2"}},
"f": map[string][]string{"f1": []string{"f2"}},
exportedStringListDictVars: ExportedStringListDictVariables{
"a": map[string][]string{"a1": {"a2"}},
"f": map[string][]string{"f1": {"f2"}},
},
exportedVariableReferenceDictVariables{
exportedVariableReferenceDictVars: ExportedVariableReferenceDictVariables{
"aa": map[string]string{"b1": "${b}"},
"cc": map[string]string{"d1": "${config.d}"},
},
},
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
expectedOut: bazel.GeneratedBazelFileWarning + `
_a = {
"a1": ["a2"],
@ -315,7 +314,7 @@ constants = struct(
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
out := bazelToolchainVars(tc.config, tc.vars...)
out := BazelToolchainVars(tc.config, tc.vars)
if out != tc.expectedOut {
t.Errorf("Expected \n%s, got \n%s", tc.expectedOut, out)
}

View file

@ -21,7 +21,7 @@ const (
SoongInjectionDirName = "soong_injection"
GeneratedBazelFileWarning = "# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT"
GeneratedBazelFileWarning = "# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT."
)
// String returns the name of the run.

View file

@ -11,7 +11,6 @@ bootstrap_go_package {
"soong-starlark-format",
],
srcs: [
"bp2build.go",
"clang.go",
"global.go",
"tidy.go",
@ -33,7 +32,6 @@ bootstrap_go_package {
"arm64_linux_host.go",
],
testSrcs: [
"bp2build_test.go",
"tidy_test.go",
],
}

View file

@ -98,28 +98,28 @@ func init() {
pctx.SourcePathVariable("Arm64GccRoot",
"prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
exportStringListStaticVariable("Arm64Ldflags", arm64Ldflags)
exportStringListStaticVariable("Arm64Lldflags", arm64Lldflags)
exportedVars.ExportStringListStaticVariable("Arm64Ldflags", arm64Ldflags)
exportedVars.ExportStringListStaticVariable("Arm64Lldflags", arm64Lldflags)
exportStringListStaticVariable("Arm64Cflags", arm64Cflags)
exportStringListStaticVariable("Arm64Cppflags", arm64Cppflags)
exportedVars.ExportStringListStaticVariable("Arm64Cflags", arm64Cflags)
exportedVars.ExportStringListStaticVariable("Arm64Cppflags", arm64Cppflags)
exportedVariableReferenceDictVars.Set("Arm64ArchVariantCflags", arm64ArchVariantCflagsVar)
exportedVariableReferenceDictVars.Set("Arm64CpuVariantCflags", arm64CpuVariantCflagsVar)
exportedVariableReferenceDictVars.Set("Arm64CpuVariantLdflags", arm64CpuVariantLdflags)
exportedVars.ExportVariableReferenceDict("Arm64ArchVariantCflags", arm64ArchVariantCflagsVar)
exportedVars.ExportVariableReferenceDict("Arm64CpuVariantCflags", arm64CpuVariantCflagsVar)
exportedVars.ExportVariableReferenceDict("Arm64CpuVariantLdflags", arm64CpuVariantLdflags)
exportStringListStaticVariable("Arm64Armv8ACflags", arm64ArchVariantCflags["armv8-a"])
exportStringListStaticVariable("Arm64Armv8ABranchProtCflags", arm64ArchVariantCflags["armv8-a-branchprot"])
exportStringListStaticVariable("Arm64Armv82ACflags", arm64ArchVariantCflags["armv8-2a"])
exportStringListStaticVariable("Arm64Armv82ADotprodCflags", arm64ArchVariantCflags["armv8-2a-dotprod"])
exportedVars.ExportStringListStaticVariable("Arm64Armv8ACflags", arm64ArchVariantCflags["armv8-a"])
exportedVars.ExportStringListStaticVariable("Arm64Armv8ABranchProtCflags", arm64ArchVariantCflags["armv8-a-branchprot"])
exportedVars.ExportStringListStaticVariable("Arm64Armv82ACflags", arm64ArchVariantCflags["armv8-2a"])
exportedVars.ExportStringListStaticVariable("Arm64Armv82ADotprodCflags", arm64ArchVariantCflags["armv8-2a-dotprod"])
exportStringListStaticVariable("Arm64CortexA53Cflags", arm64CpuVariantCflags["cortex-a53"])
exportStringListStaticVariable("Arm64CortexA55Cflags", arm64CpuVariantCflags["cortex-a55"])
exportStringListStaticVariable("Arm64KryoCflags", arm64CpuVariantCflags["kryo"])
exportStringListStaticVariable("Arm64ExynosM1Cflags", arm64CpuVariantCflags["exynos-m1"])
exportStringListStaticVariable("Arm64ExynosM2Cflags", arm64CpuVariantCflags["exynos-m2"])
exportedVars.ExportStringListStaticVariable("Arm64CortexA53Cflags", arm64CpuVariantCflags["cortex-a53"])
exportedVars.ExportStringListStaticVariable("Arm64CortexA55Cflags", arm64CpuVariantCflags["cortex-a55"])
exportedVars.ExportStringListStaticVariable("Arm64KryoCflags", arm64CpuVariantCflags["kryo"])
exportedVars.ExportStringListStaticVariable("Arm64ExynosM1Cflags", arm64CpuVariantCflags["exynos-m1"])
exportedVars.ExportStringListStaticVariable("Arm64ExynosM2Cflags", arm64CpuVariantCflags["exynos-m2"])
exportStringListStaticVariable("Arm64FixCortexA53Ldflags", []string{"-Wl,--fix-cortex-a53-843419"})
exportedVars.ExportStringListStaticVariable("Arm64FixCortexA53Ldflags", []string{"-Wl,--fix-cortex-a53-843419"})
}
var (

View file

@ -178,41 +178,41 @@ func init() {
pctx.SourcePathVariable("ArmGccRoot", "prebuilts/gcc/${HostPrebuiltTag}/arm/arm-linux-androideabi-${armGccVersion}")
// Just exported. Not created as a Ninja static variable.
exportedStringVars.Set("ArmClangTriple", clangTriple)
exportedVars.ExportString("ArmClangTriple", clangTriple)
exportStringListStaticVariable("ArmLdflags", armLdflags)
exportStringListStaticVariable("ArmLldflags", armLldflags)
exportedVars.ExportStringListStaticVariable("ArmLdflags", armLdflags)
exportedVars.ExportStringListStaticVariable("ArmLldflags", armLldflags)
exportStringListStaticVariable("ArmFixCortexA8LdFlags", armFixCortexA8LdFlags)
exportStringListStaticVariable("ArmNoFixCortexA8LdFlags", armNoFixCortexA8LdFlags)
exportedVars.ExportStringListStaticVariable("ArmFixCortexA8LdFlags", armFixCortexA8LdFlags)
exportedVars.ExportStringListStaticVariable("ArmNoFixCortexA8LdFlags", armNoFixCortexA8LdFlags)
// Clang cflags
exportStringListStaticVariable("ArmToolchainCflags", armToolchainCflags)
exportStringListStaticVariable("ArmCflags", armCflags)
exportStringListStaticVariable("ArmCppflags", armCppflags)
exportedVars.ExportStringListStaticVariable("ArmToolchainCflags", armToolchainCflags)
exportedVars.ExportStringListStaticVariable("ArmCflags", armCflags)
exportedVars.ExportStringListStaticVariable("ArmCppflags", armCppflags)
// Clang ARM vs. Thumb instruction set cflags
exportStringListStaticVariable("ArmArmCflags", armArmCflags)
exportStringListStaticVariable("ArmThumbCflags", armThumbCflags)
exportedVars.ExportStringListStaticVariable("ArmArmCflags", armArmCflags)
exportedVars.ExportStringListStaticVariable("ArmThumbCflags", armThumbCflags)
exportedVariableReferenceDictVars.Set("ArmArchVariantCflags", armArchVariantCflagsVar)
exportedVariableReferenceDictVars.Set("ArmCpuVariantCflags", armCpuVariantCflagsVar)
exportedVars.ExportVariableReferenceDict("ArmArchVariantCflags", armArchVariantCflagsVar)
exportedVars.ExportVariableReferenceDict("ArmCpuVariantCflags", armCpuVariantCflagsVar)
// Clang arch variant cflags
exportStringListStaticVariable("ArmArmv7ACflags", armArchVariantCflags["armv7-a"])
exportStringListStaticVariable("ArmArmv7ANeonCflags", armArchVariantCflags["armv7-a-neon"])
exportStringListStaticVariable("ArmArmv8ACflags", armArchVariantCflags["armv8-a"])
exportStringListStaticVariable("ArmArmv82ACflags", armArchVariantCflags["armv8-2a"])
exportedVars.ExportStringListStaticVariable("ArmArmv7ACflags", armArchVariantCflags["armv7-a"])
exportedVars.ExportStringListStaticVariable("ArmArmv7ANeonCflags", armArchVariantCflags["armv7-a-neon"])
exportedVars.ExportStringListStaticVariable("ArmArmv8ACflags", armArchVariantCflags["armv8-a"])
exportedVars.ExportStringListStaticVariable("ArmArmv82ACflags", armArchVariantCflags["armv8-2a"])
// Clang cpu variant cflags
exportStringListStaticVariable("ArmGenericCflags", armCpuVariantCflags[""])
exportStringListStaticVariable("ArmCortexA7Cflags", armCpuVariantCflags["cortex-a7"])
exportStringListStaticVariable("ArmCortexA8Cflags", armCpuVariantCflags["cortex-a8"])
exportStringListStaticVariable("ArmCortexA15Cflags", armCpuVariantCflags["cortex-a15"])
exportStringListStaticVariable("ArmCortexA53Cflags", armCpuVariantCflags["cortex-a53"])
exportStringListStaticVariable("ArmCortexA55Cflags", armCpuVariantCflags["cortex-a55"])
exportStringListStaticVariable("ArmKraitCflags", armCpuVariantCflags["krait"])
exportStringListStaticVariable("ArmKryoCflags", armCpuVariantCflags["kryo"])
exportedVars.ExportStringListStaticVariable("ArmGenericCflags", armCpuVariantCflags[""])
exportedVars.ExportStringListStaticVariable("ArmCortexA7Cflags", armCpuVariantCflags["cortex-a7"])
exportedVars.ExportStringListStaticVariable("ArmCortexA8Cflags", armCpuVariantCflags["cortex-a8"])
exportedVars.ExportStringListStaticVariable("ArmCortexA15Cflags", armCpuVariantCflags["cortex-a15"])
exportedVars.ExportStringListStaticVariable("ArmCortexA53Cflags", armCpuVariantCflags["cortex-a53"])
exportedVars.ExportStringListStaticVariable("ArmCortexA55Cflags", armCpuVariantCflags["cortex-a55"])
exportedVars.ExportStringListStaticVariable("ArmKraitCflags", armCpuVariantCflags["krait"])
exportedVars.ExportStringListStaticVariable("ArmKryoCflags", armCpuVariantCflags["kryo"])
}
var (

View file

@ -23,6 +23,9 @@ import (
)
var (
pctx = android.NewPackageContext("android/soong/cc/config")
exportedVars = android.NewExportedVariables(pctx)
// Flags used by lots of devices. Putting them in package static variables
// will save bytes in build.ninja so they aren't repeated for every file
commonGlobalCflags = []string{
@ -299,20 +302,28 @@ var (
WarningAllowedOldProjects = []string{}
)
var pctx = android.NewPackageContext("android/soong/cc/config")
// BazelCcToolchainVars generates bzl file content containing variables for
// Bazel's cc_toolchain configuration.
func BazelCcToolchainVars(config android.Config) string {
return android.BazelToolchainVars(config, exportedVars)
}
func ExportStringList(name string, value []string) {
exportedVars.ExportStringList(name, value)
}
func init() {
if runtime.GOOS == "linux" {
commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=")
}
exportStringListStaticVariable("CommonGlobalConlyflags", commonGlobalConlyflags)
exportStringListStaticVariable("DeviceGlobalCppflags", deviceGlobalCppflags)
exportStringListStaticVariable("DeviceGlobalLdflags", deviceGlobalLdflags)
exportStringListStaticVariable("DeviceGlobalLldflags", deviceGlobalLldflags)
exportStringListStaticVariable("HostGlobalCppflags", hostGlobalCppflags)
exportStringListStaticVariable("HostGlobalLdflags", hostGlobalLdflags)
exportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags)
exportedVars.ExportStringListStaticVariable("CommonGlobalConlyflags", commonGlobalConlyflags)
exportedVars.ExportStringListStaticVariable("DeviceGlobalCppflags", deviceGlobalCppflags)
exportedVars.ExportStringListStaticVariable("DeviceGlobalLdflags", deviceGlobalLdflags)
exportedVars.ExportStringListStaticVariable("DeviceGlobalLldflags", deviceGlobalLldflags)
exportedVars.ExportStringListStaticVariable("HostGlobalCppflags", hostGlobalCppflags)
exportedVars.ExportStringListStaticVariable("HostGlobalLdflags", hostGlobalLdflags)
exportedVars.ExportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags)
// Export the static default CommonGlobalCflags to Bazel.
// TODO(187086342): handle cflags that are set in VariableFuncs.
@ -323,7 +334,7 @@ func init() {
"-ftrivial-auto-var-init=zero",
"-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang",
}...)
exportedStringListVars.Set("CommonGlobalCflags", bazelCommonGlobalCflags)
exportedVars.ExportStringList("CommonGlobalCflags", bazelCommonGlobalCflags)
pctx.VariableFunc("CommonGlobalCflags", func(ctx android.PackageVarContext) string {
flags := commonGlobalCflags
@ -352,17 +363,17 @@ func init() {
// Export the static default DeviceGlobalCflags to Bazel.
// TODO(187086342): handle cflags that are set in VariableFuncs.
exportedStringListVars.Set("DeviceGlobalCflags", deviceGlobalCflags)
exportedVars.ExportStringList("DeviceGlobalCflags", deviceGlobalCflags)
pctx.VariableFunc("DeviceGlobalCflags", func(ctx android.PackageVarContext) string {
return strings.Join(deviceGlobalCflags, " ")
})
exportStringListStaticVariable("HostGlobalCflags", hostGlobalCflags)
exportStringListStaticVariable("NoOverrideGlobalCflags", noOverrideGlobalCflags)
exportStringListStaticVariable("NoOverrideExternalGlobalCflags", noOverrideExternalGlobalCflags)
exportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
exportStringListStaticVariable("ExternalCflags", extraExternalCflags)
exportedVars.ExportStringListStaticVariable("HostGlobalCflags", hostGlobalCflags)
exportedVars.ExportStringListStaticVariable("NoOverrideGlobalCflags", noOverrideGlobalCflags)
exportedVars.ExportStringListStaticVariable("NoOverrideExternalGlobalCflags", noOverrideExternalGlobalCflags)
exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
exportedVars.ExportStringListStaticVariable("ExternalCflags", extraExternalCflags)
// Everything in these lists is a crime against abstraction and dependency tracking.
// Do not add anything to this list.
@ -377,11 +388,11 @@ func init() {
"frameworks/native/opengl/include",
"frameworks/av/include",
}
exportedStringListVars.Set("CommonGlobalIncludes", commonGlobalIncludes)
exportedVars.ExportStringList("CommonGlobalIncludes", commonGlobalIncludes)
pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I", commonGlobalIncludes)
exportStringStaticVariable("CLANG_DEFAULT_VERSION", ClangDefaultVersion)
exportStringStaticVariable("CLANG_DEFAULT_SHORT_VERSION", ClangDefaultShortVersion)
exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_VERSION", ClangDefaultVersion)
exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_SHORT_VERSION", ClangDefaultShortVersion)
pctx.StaticVariableWithEnvOverride("ClangBase", "LLVM_PREBUILTS_BASE", ClangDefaultBase)
pctx.StaticVariableWithEnvOverride("ClangVersion", "LLVM_PREBUILTS_VERSION", ClangDefaultVersion)
@ -421,7 +432,7 @@ func init() {
pctx.StaticVariableWithEnvOverride("REAbiLinkerExecStrategy", "RBE_ABI_LINKER_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
}
var HostPrebuiltTag = exportVariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS)
var HostPrebuiltTag = exportedVars.ExportVariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS)
func ClangPath(ctx android.PathContext, file string) android.SourcePath {
type clangToolKey string

View file

@ -91,26 +91,26 @@ func init() {
pctx.SourcePathVariable("X86_64GccRoot",
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86_64GccVersion}")
exportStringListStaticVariable("X86_64ToolchainCflags", []string{"-m64"})
exportStringListStaticVariable("X86_64ToolchainLdflags", []string{"-m64"})
exportedVars.ExportStringListStaticVariable("X86_64ToolchainCflags", []string{"-m64"})
exportedVars.ExportStringListStaticVariable("X86_64ToolchainLdflags", []string{"-m64"})
exportStringListStaticVariable("X86_64Ldflags", x86_64Ldflags)
exportStringListStaticVariable("X86_64Lldflags", x86_64Ldflags)
exportedVars.ExportStringListStaticVariable("X86_64Ldflags", x86_64Ldflags)
exportedVars.ExportStringListStaticVariable("X86_64Lldflags", x86_64Ldflags)
// Clang cflags
exportStringListStaticVariable("X86_64Cflags", x86_64Cflags)
exportStringListStaticVariable("X86_64Cppflags", x86_64Cppflags)
exportedVars.ExportStringListStaticVariable("X86_64Cflags", x86_64Cflags)
exportedVars.ExportStringListStaticVariable("X86_64Cppflags", x86_64Cppflags)
// Yasm flags
exportStringListStaticVariable("X86_64YasmFlags", []string{
exportedVars.ExportStringListStaticVariable("X86_64YasmFlags", []string{
"-f elf64",
"-m amd64",
})
// Extended cflags
exportedStringListDictVars.Set("X86_64ArchVariantCflags", x86_64ArchVariantCflags)
exportedStringListDictVars.Set("X86_64ArchFeatureCflags", x86_64ArchFeatureCflags)
exportedVars.ExportStringListDict("X86_64ArchVariantCflags", x86_64ArchVariantCflags)
exportedVars.ExportStringListDict("X86_64ArchFeatureCflags", x86_64ArchFeatureCflags)
// Architecture variant cflags
for variant, cflags := range x86_64ArchVariantCflags {

View file

@ -98,25 +98,25 @@ func init() {
pctx.SourcePathVariable("X86GccRoot",
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86GccVersion}")
exportStringListStaticVariable("X86ToolchainCflags", []string{"-m32"})
exportStringListStaticVariable("X86ToolchainLdflags", []string{"-m32"})
exportedVars.ExportStringListStaticVariable("X86ToolchainCflags", []string{"-m32"})
exportedVars.ExportStringListStaticVariable("X86ToolchainLdflags", []string{"-m32"})
exportStringListStaticVariable("X86Ldflags", x86Ldflags)
exportStringListStaticVariable("X86Lldflags", x86Ldflags)
exportedVars.ExportStringListStaticVariable("X86Ldflags", x86Ldflags)
exportedVars.ExportStringListStaticVariable("X86Lldflags", x86Ldflags)
// Clang cflags
exportStringListStaticVariable("X86Cflags", x86Cflags)
exportStringListStaticVariable("X86Cppflags", x86Cppflags)
exportedVars.ExportStringListStaticVariable("X86Cflags", x86Cflags)
exportedVars.ExportStringListStaticVariable("X86Cppflags", x86Cppflags)
// Yasm flags
exportStringListStaticVariable("X86YasmFlags", []string{
exportedVars.ExportStringListStaticVariable("X86YasmFlags", []string{
"-f elf32",
"-m x86",
})
// Extended cflags
exportedStringListDictVars.Set("X86ArchVariantCflags", x86ArchVariantCflags)
exportedStringListDictVars.Set("X86ArchFeatureCflags", x86ArchFeatureCflags)
exportedVars.ExportStringListDict("X86ArchVariantCflags", x86ArchVariantCflags)
exportedVars.ExportStringListDict("X86ArchFeatureCflags", x86ArchFeatureCflags)
// Architecture variant cflags
for variant, cflags := range x86ArchVariantCflags {

View file

@ -121,40 +121,40 @@ const (
)
func init() {
exportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
exportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
// Most places use the full GCC version. A few only use up to the first two numbers.
if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
exportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
} else {
exportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
}
exportSourcePathVariable("LinuxGccRoot",
exportedVars.ExportSourcePathVariable("LinuxGccRoot",
"prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
exportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
exportedVars.ExportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"})
exportStringListStaticVariable("LinuxCflags", linuxCflags)
exportStringListStaticVariable("LinuxLdflags", linuxLdflags)
exportStringListStaticVariable("LinuxLldflags", linuxLdflags)
exportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
exportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
exportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
exportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
exportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
exportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags)
exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags)
exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags)
exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
exportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
exportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
exportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
exportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
exportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
exportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
// Yasm flags
exportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
exportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
}
type toolchainLinux struct {