Merge changes from topic "export-vars"
* changes: export Java variables to Bazel refactor Bazel variable export
This commit is contained in:
@@ -36,6 +36,7 @@ bootstrap_go_package {
|
|||||||
"bazel_handler.go",
|
"bazel_handler.go",
|
||||||
"bazel_paths.go",
|
"bazel_paths.go",
|
||||||
"config.go",
|
"config.go",
|
||||||
|
"config_bp2build.go",
|
||||||
"csuite_config.go",
|
"csuite_config.go",
|
||||||
"deapexer.go",
|
"deapexer.go",
|
||||||
"defaults.go",
|
"defaults.go",
|
||||||
@@ -96,6 +97,7 @@ bootstrap_go_package {
|
|||||||
"bazel_handler_test.go",
|
"bazel_handler_test.go",
|
||||||
"bazel_test.go",
|
"bazel_test.go",
|
||||||
"config_test.go",
|
"config_test.go",
|
||||||
|
"config_bp2build_test.go",
|
||||||
"csuite_config_test.go",
|
"csuite_config_test.go",
|
||||||
"defaults_test.go",
|
"defaults_test.go",
|
||||||
"depset_test.go",
|
"depset_test.go",
|
||||||
|
@@ -19,6 +19,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"android/soong/bazel"
|
||||||
"android/soong/starlark_fmt"
|
"android/soong/starlark_fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -393,7 +394,7 @@ func printApiLevelsStarlarkDict(config Config) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func StarlarkApiLevelConfigs(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 = %s
|
||||||
|
|
||||||
api_levels = _api_levels
|
api_levels = _api_levels
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package config
|
package android
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -21,33 +21,123 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/bazel"
|
||||||
"android/soong/starlark_fmt"
|
"android/soong/starlark_fmt"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bazelVarExporter interface {
|
// BazelVarExporter is a collection of configuration variables that can be exported for use in Bazel rules
|
||||||
asBazel(android.Config, exportedStringVariables, exportedStringListVariables, exportedConfigDependingVariables) []bazelConstant
|
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.
|
// ExportedVariables is a collection of interdependent configuration variables
|
||||||
var (
|
type ExportedVariables struct {
|
||||||
// Maps containing toolchain variables that are independent of the
|
// Maps containing toolchain variables that are independent of the
|
||||||
// environment variables of the build.
|
// environment variables of the build.
|
||||||
exportedStringListVars = exportedStringListVariables{}
|
exportedStringVars ExportedStringVariables
|
||||||
exportedStringVars = exportedStringVariables{}
|
exportedStringListVars ExportedStringListVariables
|
||||||
exportedStringListDictVars = exportedStringListDictVariables{}
|
exportedStringListDictVars ExportedStringListDictVariables
|
||||||
// Note: these can only contain references to other variables and must be printed last
|
|
||||||
exportedVariableReferenceDictVars = exportedVariableReferenceDictVariables{}
|
exportedVariableReferenceDictVars ExportedVariableReferenceDictVariables
|
||||||
|
|
||||||
/// Maps containing variables that are dependent on the build config.
|
/// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportVariableFuncVariable declares a variable whose value is evaluated at
|
||||||
|
// runtime via a function and exports it to Bazel's toolchain.
|
||||||
|
func (ev ExportedVariables) ExportVariableFuncVariable(name string, f func() string) {
|
||||||
|
ev.exportedConfigDependingVars.set(name, func(config Config) string {
|
||||||
|
return f()
|
||||||
|
})
|
||||||
|
ev.pctx.VariableFunc(name, func(PackageVarContext) string {
|
||||||
|
return f()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
m[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,14 +157,15 @@ type bazelConstant struct {
|
|||||||
sortLast bool
|
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
|
m[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m exportedStringVariables) asBazel(config android.Config,
|
func (m ExportedStringVariables) asBazel(config Config,
|
||||||
stringVars exportedStringVariables, stringListVars exportedStringListVariables, cfgDepVars exportedConfigDependingVariables) []bazelConstant {
|
stringVars ExportedStringVariables, stringListVars ExportedStringListVariables, cfgDepVars ExportedConfigDependingVariables) []bazelConstant {
|
||||||
ret := make([]bazelConstant, 0, len(m))
|
ret := make([]bazelConstant, 0, len(m))
|
||||||
for k, variableValue := range m {
|
for k, variableValue := range m {
|
||||||
expandedVar, err := expandVar(config, variableValue, stringVars, stringListVars, cfgDepVars)
|
expandedVar, err := expandVar(config, variableValue, stringVars, stringListVars, cfgDepVars)
|
||||||
@@ -92,21 +183,16 @@ func (m exportedStringVariables) asBazel(config android.Config,
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convenience function to declare a static variable and export it to Bazel's cc_toolchain.
|
// ExportedStringListVariables is a mapping of variable names to a list of strings
|
||||||
func exportStringStaticVariable(name string, value string) {
|
type ExportedStringListVariables map[string][]string
|
||||||
pctx.StaticVariable(name, value)
|
|
||||||
exportedStringVars.Set(name, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
type exportedStringListVariables map[string][]string
|
func (m ExportedStringListVariables) set(k string, v []string) {
|
||||||
|
|
||||||
func (m exportedStringListVariables) Set(k string, v []string) {
|
|
||||||
m[k] = v
|
m[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m exportedStringListVariables) asBazel(config android.Config,
|
func (m ExportedStringListVariables) asBazel(config Config,
|
||||||
stringScope exportedStringVariables, stringListScope exportedStringListVariables,
|
stringScope ExportedStringVariables, stringListScope ExportedStringListVariables,
|
||||||
exportedVars exportedConfigDependingVariables) []bazelConstant {
|
exportedVars ExportedConfigDependingVariables) []bazelConstant {
|
||||||
ret := make([]bazelConstant, 0, len(m))
|
ret := make([]bazelConstant, 0, len(m))
|
||||||
// For each exported variable, recursively expand elements in the variableValue
|
// For each exported variable, recursively expand elements in the variableValue
|
||||||
// list to ensure that interpolated variables are expanded according to their values
|
// list to ensure that interpolated variables are expanded according to their values
|
||||||
@@ -130,37 +216,17 @@ func (m exportedStringListVariables) asBazel(config android.Config,
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convenience function to declare a static "source path" variable and export it to Bazel's cc_toolchain.
|
// ExportedStringListDictVariables is a mapping from variable names to a
|
||||||
func exportVariableConfigMethod(name string, method interface{}) blueprint.Variable {
|
// dictionary which maps keys to lists of strings
|
||||||
exportedConfigDependingVars.Set(name, method)
|
type ExportedStringListDictVariables map[string]map[string][]string
|
||||||
return pctx.VariableConfigMethod(name, method)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convenience function to declare a static "source path" variable and export it to Bazel's cc_toolchain.
|
func (m ExportedStringListDictVariables) set(k string, v map[string][]string) {
|
||||||
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) {
|
|
||||||
m[k] = v
|
m[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since dictionaries are not supported in Ninja, we do not expand variables for dictionaries
|
// Since dictionaries are not supported in Ninja, we do not expand variables for dictionaries
|
||||||
func (m exportedStringListDictVariables) asBazel(_ android.Config, _ exportedStringVariables,
|
func (m ExportedStringListDictVariables) asBazel(_ Config, _ ExportedStringVariables,
|
||||||
_ exportedStringListVariables, _ exportedConfigDependingVariables) []bazelConstant {
|
_ ExportedStringListVariables, _ ExportedConfigDependingVariables) []bazelConstant {
|
||||||
ret := make([]bazelConstant, 0, len(m))
|
ret := make([]bazelConstant, 0, len(m))
|
||||||
for k, dict := range m {
|
for k, dict := range m {
|
||||||
ret = append(ret, bazelConstant{
|
ret = append(ret, bazelConstant{
|
||||||
@@ -171,14 +237,23 @@ func (m exportedStringListDictVariables) asBazel(_ android.Config, _ exportedStr
|
|||||||
return ret
|
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
|
m[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m exportedVariableReferenceDictVariables) asBazel(_ android.Config, _ exportedStringVariables,
|
func (m ExportedVariableReferenceDictVariables) asBazel(_ Config, _ ExportedStringVariables,
|
||||||
_ exportedStringListVariables, _ exportedConfigDependingVariables) []bazelConstant {
|
_ ExportedStringListVariables, _ ExportedConfigDependingVariables) []bazelConstant {
|
||||||
ret := make([]bazelConstant, 0, len(m))
|
ret := make([]bazelConstant, 0, len(m))
|
||||||
for n, dict := range m {
|
for n, dict := range m {
|
||||||
for k, v := range dict {
|
for k, v := range dict {
|
||||||
@@ -201,24 +276,15 @@ func (m exportedVariableReferenceDictVariables) asBazel(_ android.Config, _ expo
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// BazelCcToolchainVars generates bzl file content containing variables for
|
// BazelToolchainVars expands an ExportedVariables collection and returns a string
|
||||||
// Bazel's cc_toolchain configuration.
|
// of formatted Starlark variable definitions
|
||||||
func BazelCcToolchainVars(config android.Config) string {
|
func BazelToolchainVars(config Config, exportedVars ExportedVariables) string {
|
||||||
return bazelToolchainVars(
|
results := exportedVars.asBazel(
|
||||||
config,
|
config,
|
||||||
exportedStringListDictVars,
|
exportedVars.exportedStringVars,
|
||||||
exportedStringListVars,
|
exportedVars.exportedStringListVars,
|
||||||
exportedStringVars,
|
exportedVars.exportedConfigDependingVars,
|
||||||
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)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Slice(results, func(i, j int) bool {
|
sort.Slice(results, func(i, j int) bool {
|
||||||
if results[i].sortLast != results[j].sortLast {
|
if results[i].sortLast != results[j].sortLast {
|
||||||
@@ -237,6 +303,8 @@ func bazelToolchainVars(config android.Config, vars ...bazelVarExporter) string
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build the exported constants struct.
|
// Build the exported constants struct.
|
||||||
|
ret := bazel.GeneratedBazelFileWarning
|
||||||
|
ret += "\n\n"
|
||||||
ret += strings.Join(definitions, "\n\n")
|
ret += strings.Join(definitions, "\n\n")
|
||||||
ret += "\n\n"
|
ret += "\n\n"
|
||||||
ret += "constants = struct(\n"
|
ret += "constants = struct(\n"
|
||||||
@@ -279,8 +347,8 @@ func variableReference(input string) (match, error) {
|
|||||||
// string slice than to handle a pass-by-referenced map, which would make it
|
// 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
|
// quite complex to track depth-first interpolations. It's also unlikely the
|
||||||
// interpolation stacks are deep (n > 1).
|
// interpolation stacks are deep (n > 1).
|
||||||
func expandVar(config android.Config, toExpand string, stringScope exportedStringVariables,
|
func expandVar(config Config, toExpand string, stringScope ExportedStringVariables,
|
||||||
stringListScope exportedStringListVariables, exportedVars exportedConfigDependingVariables) ([]string, error) {
|
stringListScope ExportedStringListVariables, exportedVars ExportedConfigDependingVariables) ([]string, error) {
|
||||||
|
|
||||||
// Internal recursive function.
|
// Internal recursive function.
|
||||||
var expandVarInternal func(string, map[string]bool) (string, error)
|
var expandVarInternal func(string, map[string]bool) (string, error)
|
||||||
@@ -346,7 +414,8 @@ func expandVar(config android.Config, toExpand string, stringScope exportedStrin
|
|||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
var ret []string
|
var ret []string
|
||||||
for _, v := range strings.Split(toExpand, " ") {
|
stringFields := splitStringKeepingQuotedSubstring(toExpand, ' ')
|
||||||
|
for _, v := range stringFields {
|
||||||
val, err := expandVarInternal(v, map[string]bool{})
|
val, err := expandVarInternal(v, map[string]bool{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ret, err
|
return ret, err
|
||||||
@@ -357,6 +426,46 @@ func expandVar(config android.Config, toExpand string, stringScope exportedStrin
|
|||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// splitStringKeepingQuotedSubstring splits a string on a provided separator,
|
||||||
|
// but it will not split substrings inside unescaped double quotes. If the double
|
||||||
|
// quotes are escaped, then the returned string will only include the quote, and
|
||||||
|
// not the escape.
|
||||||
|
func splitStringKeepingQuotedSubstring(s string, delimiter byte) []string {
|
||||||
|
var ret []string
|
||||||
|
quote := byte('"')
|
||||||
|
|
||||||
|
var substring []byte
|
||||||
|
quoted := false
|
||||||
|
escaped := false
|
||||||
|
|
||||||
|
for i := range s {
|
||||||
|
if !quoted && s[i] == delimiter {
|
||||||
|
ret = append(ret, string(substring))
|
||||||
|
substring = []byte{}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
characterIsEscape := i < len(s)-1 && s[i] == '\\' && s[i+1] == quote
|
||||||
|
if characterIsEscape {
|
||||||
|
escaped = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if s[i] == quote {
|
||||||
|
if !escaped {
|
||||||
|
quoted = !quoted
|
||||||
|
}
|
||||||
|
escaped = false
|
||||||
|
}
|
||||||
|
|
||||||
|
substring = append(substring, s[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = append(ret, string(substring))
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
func validateVariableMethod(name string, methodValue reflect.Value) {
|
func validateVariableMethod(name string, methodValue reflect.Value) {
|
||||||
methodType := methodValue.Type()
|
methodType := methodValue.Type()
|
||||||
if methodType.Kind() != reflect.Func {
|
if methodType.Kind() != reflect.Func {
|
454
android/config_bp2build_test.go
Normal file
454
android/config_bp2build_test.go
Normal file
@@ -0,0 +1,454 @@
|
|||||||
|
// Copyright 2021 Google Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package android
|
||||||
|
|
||||||
|
import (
|
||||||
|
"android/soong/bazel"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestExpandVars(t *testing.T) {
|
||||||
|
android_arm64_config := TestConfig("out", nil, "", nil)
|
||||||
|
android_arm64_config.BuildOS = Android
|
||||||
|
android_arm64_config.BuildArch = Arm64
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
description string
|
||||||
|
config Config
|
||||||
|
stringScope ExportedStringVariables
|
||||||
|
stringListScope ExportedStringListVariables
|
||||||
|
configVars ExportedConfigDependingVariables
|
||||||
|
toExpand string
|
||||||
|
expectedValues []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
description: "no expansion for non-interpolated value",
|
||||||
|
toExpand: "foo",
|
||||||
|
expectedValues: []string{"foo"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "single level expansion for string var",
|
||||||
|
stringScope: ExportedStringVariables{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
toExpand: "${foo}",
|
||||||
|
expectedValues: []string{"bar"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "single level expansion with short-name for string var",
|
||||||
|
stringScope: ExportedStringVariables{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
toExpand: "${config.foo}",
|
||||||
|
expectedValues: []string{"bar"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "single level expansion string list var",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"foo": []string{"bar"},
|
||||||
|
},
|
||||||
|
toExpand: "${foo}",
|
||||||
|
expectedValues: []string{"bar"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "mixed level expansion for string list var",
|
||||||
|
stringScope: ExportedStringVariables{
|
||||||
|
"foo": "${bar}",
|
||||||
|
"qux": "hello",
|
||||||
|
},
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"bar": []string{"baz", "${qux}"},
|
||||||
|
},
|
||||||
|
toExpand: "${foo}",
|
||||||
|
expectedValues: []string{"baz hello"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "double level expansion",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"foo": []string{"${bar}"},
|
||||||
|
"bar": []string{"baz"},
|
||||||
|
},
|
||||||
|
toExpand: "${foo}",
|
||||||
|
expectedValues: []string{"baz"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "double level expansion with a literal",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"a": []string{"${b}", "c"},
|
||||||
|
"b": []string{"d"},
|
||||||
|
},
|
||||||
|
toExpand: "${a}",
|
||||||
|
expectedValues: []string{"d c"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "double level expansion, with two variables in a string",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"a": []string{"${b} ${c}"},
|
||||||
|
"b": []string{"d"},
|
||||||
|
"c": []string{"e"},
|
||||||
|
},
|
||||||
|
toExpand: "${a}",
|
||||||
|
expectedValues: []string{"d e"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "triple level expansion with two variables in a string",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"a": []string{"${b} ${c}"},
|
||||||
|
"b": []string{"${c}", "${d}"},
|
||||||
|
"c": []string{"${d}"},
|
||||||
|
"d": []string{"foo"},
|
||||||
|
},
|
||||||
|
toExpand: "${a}",
|
||||||
|
expectedValues: []string{"foo foo foo"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "expansion with config depending vars",
|
||||||
|
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}",
|
||||||
|
expectedValues: []string{"android-arm64"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "double level multi type expansion",
|
||||||
|
stringListScope: ExportedStringListVariables{
|
||||||
|
"platform": []string{"${os}-${arch}"},
|
||||||
|
"const": []string{"const"},
|
||||||
|
},
|
||||||
|
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}",
|
||||||
|
expectedValues: []string{"const/android-arm64/foo"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, testCase := range testCases {
|
||||||
|
t.Run(testCase.description, func(t *testing.T) {
|
||||||
|
output, _ := expandVar(testCase.config, testCase.toExpand, testCase.stringScope, testCase.stringListScope, testCase.configVars)
|
||||||
|
if len(output) != len(testCase.expectedValues) {
|
||||||
|
t.Errorf("Expected %d values, got %d", len(testCase.expectedValues), len(output))
|
||||||
|
}
|
||||||
|
for i, actual := range output {
|
||||||
|
expectedValue := testCase.expectedValues[i]
|
||||||
|
if actual != expectedValue {
|
||||||
|
t.Errorf("Actual value '%s' doesn't match expected value '%s'", actual, expectedValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBazelToolchainVars(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
config Config
|
||||||
|
vars ExportedVariables
|
||||||
|
expectedOut string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "exports strings",
|
||||||
|
vars: ExportedVariables{
|
||||||
|
exportedStringVars: ExportedStringVariables{
|
||||||
|
"a": "b",
|
||||||
|
"c": "d",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: bazel.GeneratedBazelFileWarning + `
|
||||||
|
|
||||||
|
_a = "b"
|
||||||
|
|
||||||
|
_c = "d"
|
||||||
|
|
||||||
|
constants = struct(
|
||||||
|
a = _a,
|
||||||
|
c = _c,
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "exports string lists",
|
||||||
|
vars: ExportedVariables{
|
||||||
|
exportedStringListVars: ExportedStringListVariables{
|
||||||
|
"a": []string{"b1", "b2"},
|
||||||
|
"c": []string{"d1", "d2"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: bazel.GeneratedBazelFileWarning + `
|
||||||
|
|
||||||
|
_a = [
|
||||||
|
"b1",
|
||||||
|
"b2",
|
||||||
|
]
|
||||||
|
|
||||||
|
_c = [
|
||||||
|
"d1",
|
||||||
|
"d2",
|
||||||
|
]
|
||||||
|
|
||||||
|
constants = struct(
|
||||||
|
a = _a,
|
||||||
|
c = _c,
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "exports string lists dicts",
|
||||||
|
vars: ExportedVariables{
|
||||||
|
exportedStringListDictVars: ExportedStringListDictVariables{
|
||||||
|
"a": map[string][]string{"b1": {"b2"}},
|
||||||
|
"c": map[string][]string{"d1": {"d2"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: bazel.GeneratedBazelFileWarning + `
|
||||||
|
|
||||||
|
_a = {
|
||||||
|
"b1": ["b2"],
|
||||||
|
}
|
||||||
|
|
||||||
|
_c = {
|
||||||
|
"d1": ["d2"],
|
||||||
|
}
|
||||||
|
|
||||||
|
constants = struct(
|
||||||
|
a = _a,
|
||||||
|
c = _c,
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "exports dict with var refs",
|
||||||
|
vars: ExportedVariables{
|
||||||
|
exportedVariableReferenceDictVars: ExportedVariableReferenceDictVariables{
|
||||||
|
"a": map[string]string{"b1": "${b2}"},
|
||||||
|
"c": map[string]string{"d1": "${config.d2}"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: bazel.GeneratedBazelFileWarning + `
|
||||||
|
|
||||||
|
_a = {
|
||||||
|
"b1": _b2,
|
||||||
|
}
|
||||||
|
|
||||||
|
_c = {
|
||||||
|
"d1": _d2,
|
||||||
|
}
|
||||||
|
|
||||||
|
constants = struct(
|
||||||
|
a = _a,
|
||||||
|
c = _c,
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "sorts across types with variable references last",
|
||||||
|
vars: ExportedVariables{
|
||||||
|
exportedStringVars: ExportedStringVariables{
|
||||||
|
"b": "b-val",
|
||||||
|
"d": "d-val",
|
||||||
|
},
|
||||||
|
exportedStringListVars: ExportedStringListVariables{
|
||||||
|
"c": []string{"c-val"},
|
||||||
|
"e": []string{"e-val"},
|
||||||
|
},
|
||||||
|
exportedStringListDictVars: ExportedStringListDictVariables{
|
||||||
|
"a": map[string][]string{"a1": {"a2"}},
|
||||||
|
"f": map[string][]string{"f1": {"f2"}},
|
||||||
|
},
|
||||||
|
exportedVariableReferenceDictVars: ExportedVariableReferenceDictVariables{
|
||||||
|
"aa": map[string]string{"b1": "${b}"},
|
||||||
|
"cc": map[string]string{"d1": "${config.d}"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: bazel.GeneratedBazelFileWarning + `
|
||||||
|
|
||||||
|
_a = {
|
||||||
|
"a1": ["a2"],
|
||||||
|
}
|
||||||
|
|
||||||
|
_b = "b-val"
|
||||||
|
|
||||||
|
_c = ["c-val"]
|
||||||
|
|
||||||
|
_d = "d-val"
|
||||||
|
|
||||||
|
_e = ["e-val"]
|
||||||
|
|
||||||
|
_f = {
|
||||||
|
"f1": ["f2"],
|
||||||
|
}
|
||||||
|
|
||||||
|
_aa = {
|
||||||
|
"b1": _b,
|
||||||
|
}
|
||||||
|
|
||||||
|
_cc = {
|
||||||
|
"d1": _d,
|
||||||
|
}
|
||||||
|
|
||||||
|
constants = struct(
|
||||||
|
a = _a,
|
||||||
|
b = _b,
|
||||||
|
c = _c,
|
||||||
|
d = _d,
|
||||||
|
e = _e,
|
||||||
|
f = _f,
|
||||||
|
aa = _aa,
|
||||||
|
cc = _cc,
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
out := BazelToolchainVars(tc.config, tc.vars)
|
||||||
|
if out != tc.expectedOut {
|
||||||
|
t.Errorf("Expected \n%s, got \n%s", tc.expectedOut, out)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSplitStringKeepingQuotedSubstring(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
description string
|
||||||
|
s string
|
||||||
|
delimiter byte
|
||||||
|
split []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
description: "empty string returns single empty string",
|
||||||
|
s: "",
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with single space returns two empty strings",
|
||||||
|
s: " ",
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with two spaces returns three empty strings",
|
||||||
|
s: " ",
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with four words returns four word string",
|
||||||
|
s: "hello world with words",
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
"world",
|
||||||
|
"with",
|
||||||
|
"words",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with words and nested quote returns word strings and quote string",
|
||||||
|
s: `hello "world with" words`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
`"world with"`,
|
||||||
|
"words",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with escaped quote inside real quotes",
|
||||||
|
s: `hello \"world "with\" words"`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
`"world`,
|
||||||
|
`"with" words"`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with words and escaped quotes returns word strings",
|
||||||
|
s: `hello \"world with\" words`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
`"world`,
|
||||||
|
`with"`,
|
||||||
|
"words",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string which is single quoted substring returns only substring",
|
||||||
|
s: `"hello world with words"`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
`"hello world with words"`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string starting with quote returns quoted string",
|
||||||
|
s: `"hello world with" words`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
`"hello world with"`,
|
||||||
|
"words",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "string with starting quote and no ending quote returns quote to end of string",
|
||||||
|
s: `hello "world with words`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
`"world with words`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: "quoted string is treated as a single \"word\" unless separated by delimiter",
|
||||||
|
s: `hello "world"with words`,
|
||||||
|
delimiter: ' ',
|
||||||
|
split: []string{
|
||||||
|
"hello",
|
||||||
|
`"world"with`,
|
||||||
|
"words",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.description, func(t *testing.T) {
|
||||||
|
split := splitStringKeepingQuotedSubstring(tc.s, tc.delimiter)
|
||||||
|
if len(split) != len(tc.split) {
|
||||||
|
t.Fatalf("number of split string elements (%d) differs from expected (%d): split string (%v), expected (%v)",
|
||||||
|
len(split), len(tc.split), split, tc.split,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
for i := range split {
|
||||||
|
if split[i] != tc.split[i] {
|
||||||
|
t.Errorf("split string element (%d), %v, differs from expected, %v", i, split[i], tc.split[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@@ -21,7 +21,7 @@ const (
|
|||||||
|
|
||||||
SoongInjectionDirName = "soong_injection"
|
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.
|
// String returns the name of the run.
|
||||||
|
@@ -580,7 +580,9 @@ func prettyPrint(propertyValue reflect.Value, indent int, emitZeroValues bool) (
|
|||||||
elements = append(elements, val)
|
elements = append(elements, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return starlark_fmt.PrintList(elements, indent, "%s"), nil
|
return starlark_fmt.PrintList(elements, indent, func(s string) string {
|
||||||
|
return "%s"
|
||||||
|
}), nil
|
||||||
|
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
// Special cases where the bp2build sends additional information to the codegenerator
|
// Special cases where the bp2build sends additional information to the codegenerator
|
||||||
|
@@ -7,7 +7,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
"android/soong/cc/config"
|
cc_config "android/soong/cc/config"
|
||||||
|
java_config "android/soong/java/config"
|
||||||
|
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
)
|
)
|
||||||
@@ -22,7 +23,10 @@ func CreateSoongInjectionFiles(cfg android.Config, metrics CodegenMetrics) []Baz
|
|||||||
var files []BazelFile
|
var files []BazelFile
|
||||||
|
|
||||||
files = append(files, newFile("cc_toolchain", GeneratedBuildFileName, "")) // Creates a //cc_toolchain package.
|
files = append(files, newFile("cc_toolchain", GeneratedBuildFileName, "")) // Creates a //cc_toolchain package.
|
||||||
files = append(files, newFile("cc_toolchain", "constants.bzl", config.BazelCcToolchainVars(cfg)))
|
files = append(files, newFile("cc_toolchain", "constants.bzl", cc_config.BazelCcToolchainVars(cfg)))
|
||||||
|
|
||||||
|
files = append(files, newFile("java_toolchain", GeneratedBuildFileName, "")) // Creates a //java_toolchain package.
|
||||||
|
files = append(files, newFile("java_toolchain", "constants.bzl", java_config.BazelJavaToolchainVars(cfg)))
|
||||||
|
|
||||||
files = append(files, newFile("metrics", "converted_modules.txt", strings.Join(metrics.convertedModules, "\n")))
|
files = append(files, newFile("metrics", "converted_modules.txt", strings.Join(metrics.convertedModules, "\n")))
|
||||||
|
|
||||||
|
@@ -94,6 +94,14 @@ func TestCreateBazelFiles_Bp2Build_CreatesDefaultFiles(t *testing.T) {
|
|||||||
dir: "cc_toolchain",
|
dir: "cc_toolchain",
|
||||||
basename: "constants.bzl",
|
basename: "constants.bzl",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
dir: "java_toolchain",
|
||||||
|
basename: GeneratedBuildFileName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dir: "java_toolchain",
|
||||||
|
basename: "constants.bzl",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
dir: "metrics",
|
dir: "metrics",
|
||||||
basename: "converted_modules.txt",
|
basename: "converted_modules.txt",
|
||||||
|
@@ -11,7 +11,6 @@ bootstrap_go_package {
|
|||||||
"soong-starlark-format",
|
"soong-starlark-format",
|
||||||
],
|
],
|
||||||
srcs: [
|
srcs: [
|
||||||
"bp2build.go",
|
|
||||||
"clang.go",
|
"clang.go",
|
||||||
"global.go",
|
"global.go",
|
||||||
"tidy.go",
|
"tidy.go",
|
||||||
@@ -33,7 +32,6 @@ bootstrap_go_package {
|
|||||||
"arm64_linux_host.go",
|
"arm64_linux_host.go",
|
||||||
],
|
],
|
||||||
testSrcs: [
|
testSrcs: [
|
||||||
"bp2build_test.go",
|
|
||||||
"tidy_test.go",
|
"tidy_test.go",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
@@ -98,28 +98,28 @@ func init() {
|
|||||||
pctx.SourcePathVariable("Arm64GccRoot",
|
pctx.SourcePathVariable("Arm64GccRoot",
|
||||||
"prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
|
"prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
|
||||||
|
|
||||||
exportStringListStaticVariable("Arm64Ldflags", arm64Ldflags)
|
exportedVars.ExportStringListStaticVariable("Arm64Ldflags", arm64Ldflags)
|
||||||
exportStringListStaticVariable("Arm64Lldflags", arm64Lldflags)
|
exportedVars.ExportStringListStaticVariable("Arm64Lldflags", arm64Lldflags)
|
||||||
|
|
||||||
exportStringListStaticVariable("Arm64Cflags", arm64Cflags)
|
exportedVars.ExportStringListStaticVariable("Arm64Cflags", arm64Cflags)
|
||||||
exportStringListStaticVariable("Arm64Cppflags", arm64Cppflags)
|
exportedVars.ExportStringListStaticVariable("Arm64Cppflags", arm64Cppflags)
|
||||||
|
|
||||||
exportedVariableReferenceDictVars.Set("Arm64ArchVariantCflags", arm64ArchVariantCflagsVar)
|
exportedVars.ExportVariableReferenceDict("Arm64ArchVariantCflags", arm64ArchVariantCflagsVar)
|
||||||
exportedVariableReferenceDictVars.Set("Arm64CpuVariantCflags", arm64CpuVariantCflagsVar)
|
exportedVars.ExportVariableReferenceDict("Arm64CpuVariantCflags", arm64CpuVariantCflagsVar)
|
||||||
exportedVariableReferenceDictVars.Set("Arm64CpuVariantLdflags", arm64CpuVariantLdflags)
|
exportedVars.ExportVariableReferenceDict("Arm64CpuVariantLdflags", arm64CpuVariantLdflags)
|
||||||
|
|
||||||
exportStringListStaticVariable("Arm64Armv8ACflags", arm64ArchVariantCflags["armv8-a"])
|
exportedVars.ExportStringListStaticVariable("Arm64Armv8ACflags", arm64ArchVariantCflags["armv8-a"])
|
||||||
exportStringListStaticVariable("Arm64Armv8ABranchProtCflags", arm64ArchVariantCflags["armv8-a-branchprot"])
|
exportedVars.ExportStringListStaticVariable("Arm64Armv8ABranchProtCflags", arm64ArchVariantCflags["armv8-a-branchprot"])
|
||||||
exportStringListStaticVariable("Arm64Armv82ACflags", arm64ArchVariantCflags["armv8-2a"])
|
exportedVars.ExportStringListStaticVariable("Arm64Armv82ACflags", arm64ArchVariantCflags["armv8-2a"])
|
||||||
exportStringListStaticVariable("Arm64Armv82ADotprodCflags", arm64ArchVariantCflags["armv8-2a-dotprod"])
|
exportedVars.ExportStringListStaticVariable("Arm64Armv82ADotprodCflags", arm64ArchVariantCflags["armv8-2a-dotprod"])
|
||||||
|
|
||||||
exportStringListStaticVariable("Arm64CortexA53Cflags", arm64CpuVariantCflags["cortex-a53"])
|
exportedVars.ExportStringListStaticVariable("Arm64CortexA53Cflags", arm64CpuVariantCflags["cortex-a53"])
|
||||||
exportStringListStaticVariable("Arm64CortexA55Cflags", arm64CpuVariantCflags["cortex-a55"])
|
exportedVars.ExportStringListStaticVariable("Arm64CortexA55Cflags", arm64CpuVariantCflags["cortex-a55"])
|
||||||
exportStringListStaticVariable("Arm64KryoCflags", arm64CpuVariantCflags["kryo"])
|
exportedVars.ExportStringListStaticVariable("Arm64KryoCflags", arm64CpuVariantCflags["kryo"])
|
||||||
exportStringListStaticVariable("Arm64ExynosM1Cflags", arm64CpuVariantCflags["exynos-m1"])
|
exportedVars.ExportStringListStaticVariable("Arm64ExynosM1Cflags", arm64CpuVariantCflags["exynos-m1"])
|
||||||
exportStringListStaticVariable("Arm64ExynosM2Cflags", arm64CpuVariantCflags["exynos-m2"])
|
exportedVars.ExportStringListStaticVariable("Arm64ExynosM2Cflags", arm64CpuVariantCflags["exynos-m2"])
|
||||||
|
|
||||||
exportStringListStaticVariable("Arm64FixCortexA53Ldflags", []string{"-Wl,--fix-cortex-a53-843419"})
|
exportedVars.ExportStringListStaticVariable("Arm64FixCortexA53Ldflags", []string{"-Wl,--fix-cortex-a53-843419"})
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@@ -178,41 +178,41 @@ func init() {
|
|||||||
pctx.SourcePathVariable("ArmGccRoot", "prebuilts/gcc/${HostPrebuiltTag}/arm/arm-linux-androideabi-${armGccVersion}")
|
pctx.SourcePathVariable("ArmGccRoot", "prebuilts/gcc/${HostPrebuiltTag}/arm/arm-linux-androideabi-${armGccVersion}")
|
||||||
|
|
||||||
// Just exported. Not created as a Ninja static variable.
|
// Just exported. Not created as a Ninja static variable.
|
||||||
exportedStringVars.Set("ArmClangTriple", clangTriple)
|
exportedVars.ExportString("ArmClangTriple", clangTriple)
|
||||||
|
|
||||||
exportStringListStaticVariable("ArmLdflags", armLdflags)
|
exportedVars.ExportStringListStaticVariable("ArmLdflags", armLdflags)
|
||||||
exportStringListStaticVariable("ArmLldflags", armLldflags)
|
exportedVars.ExportStringListStaticVariable("ArmLldflags", armLldflags)
|
||||||
|
|
||||||
exportStringListStaticVariable("ArmFixCortexA8LdFlags", armFixCortexA8LdFlags)
|
exportedVars.ExportStringListStaticVariable("ArmFixCortexA8LdFlags", armFixCortexA8LdFlags)
|
||||||
exportStringListStaticVariable("ArmNoFixCortexA8LdFlags", armNoFixCortexA8LdFlags)
|
exportedVars.ExportStringListStaticVariable("ArmNoFixCortexA8LdFlags", armNoFixCortexA8LdFlags)
|
||||||
|
|
||||||
// Clang cflags
|
// Clang cflags
|
||||||
exportStringListStaticVariable("ArmToolchainCflags", armToolchainCflags)
|
exportedVars.ExportStringListStaticVariable("ArmToolchainCflags", armToolchainCflags)
|
||||||
exportStringListStaticVariable("ArmCflags", armCflags)
|
exportedVars.ExportStringListStaticVariable("ArmCflags", armCflags)
|
||||||
exportStringListStaticVariable("ArmCppflags", armCppflags)
|
exportedVars.ExportStringListStaticVariable("ArmCppflags", armCppflags)
|
||||||
|
|
||||||
// Clang ARM vs. Thumb instruction set cflags
|
// Clang ARM vs. Thumb instruction set cflags
|
||||||
exportStringListStaticVariable("ArmArmCflags", armArmCflags)
|
exportedVars.ExportStringListStaticVariable("ArmArmCflags", armArmCflags)
|
||||||
exportStringListStaticVariable("ArmThumbCflags", armThumbCflags)
|
exportedVars.ExportStringListStaticVariable("ArmThumbCflags", armThumbCflags)
|
||||||
|
|
||||||
exportedVariableReferenceDictVars.Set("ArmArchVariantCflags", armArchVariantCflagsVar)
|
exportedVars.ExportVariableReferenceDict("ArmArchVariantCflags", armArchVariantCflagsVar)
|
||||||
exportedVariableReferenceDictVars.Set("ArmCpuVariantCflags", armCpuVariantCflagsVar)
|
exportedVars.ExportVariableReferenceDict("ArmCpuVariantCflags", armCpuVariantCflagsVar)
|
||||||
|
|
||||||
// Clang arch variant cflags
|
// Clang arch variant cflags
|
||||||
exportStringListStaticVariable("ArmArmv7ACflags", armArchVariantCflags["armv7-a"])
|
exportedVars.ExportStringListStaticVariable("ArmArmv7ACflags", armArchVariantCflags["armv7-a"])
|
||||||
exportStringListStaticVariable("ArmArmv7ANeonCflags", armArchVariantCflags["armv7-a-neon"])
|
exportedVars.ExportStringListStaticVariable("ArmArmv7ANeonCflags", armArchVariantCflags["armv7-a-neon"])
|
||||||
exportStringListStaticVariable("ArmArmv8ACflags", armArchVariantCflags["armv8-a"])
|
exportedVars.ExportStringListStaticVariable("ArmArmv8ACflags", armArchVariantCflags["armv8-a"])
|
||||||
exportStringListStaticVariable("ArmArmv82ACflags", armArchVariantCflags["armv8-2a"])
|
exportedVars.ExportStringListStaticVariable("ArmArmv82ACflags", armArchVariantCflags["armv8-2a"])
|
||||||
|
|
||||||
// Clang cpu variant cflags
|
// Clang cpu variant cflags
|
||||||
exportStringListStaticVariable("ArmGenericCflags", armCpuVariantCflags[""])
|
exportedVars.ExportStringListStaticVariable("ArmGenericCflags", armCpuVariantCflags[""])
|
||||||
exportStringListStaticVariable("ArmCortexA7Cflags", armCpuVariantCflags["cortex-a7"])
|
exportedVars.ExportStringListStaticVariable("ArmCortexA7Cflags", armCpuVariantCflags["cortex-a7"])
|
||||||
exportStringListStaticVariable("ArmCortexA8Cflags", armCpuVariantCflags["cortex-a8"])
|
exportedVars.ExportStringListStaticVariable("ArmCortexA8Cflags", armCpuVariantCflags["cortex-a8"])
|
||||||
exportStringListStaticVariable("ArmCortexA15Cflags", armCpuVariantCflags["cortex-a15"])
|
exportedVars.ExportStringListStaticVariable("ArmCortexA15Cflags", armCpuVariantCflags["cortex-a15"])
|
||||||
exportStringListStaticVariable("ArmCortexA53Cflags", armCpuVariantCflags["cortex-a53"])
|
exportedVars.ExportStringListStaticVariable("ArmCortexA53Cflags", armCpuVariantCflags["cortex-a53"])
|
||||||
exportStringListStaticVariable("ArmCortexA55Cflags", armCpuVariantCflags["cortex-a55"])
|
exportedVars.ExportStringListStaticVariable("ArmCortexA55Cflags", armCpuVariantCflags["cortex-a55"])
|
||||||
exportStringListStaticVariable("ArmKraitCflags", armCpuVariantCflags["krait"])
|
exportedVars.ExportStringListStaticVariable("ArmKraitCflags", armCpuVariantCflags["krait"])
|
||||||
exportStringListStaticVariable("ArmKryoCflags", armCpuVariantCflags["kryo"])
|
exportedVars.ExportStringListStaticVariable("ArmKryoCflags", armCpuVariantCflags["kryo"])
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@@ -1,324 +0,0 @@
|
|||||||
// Copyright 2021 Google Inc. All rights reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"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
|
|
||||||
|
|
||||||
testCases := []struct {
|
|
||||||
description string
|
|
||||||
config android.Config
|
|
||||||
stringScope exportedStringVariables
|
|
||||||
stringListScope exportedStringListVariables
|
|
||||||
configVars exportedConfigDependingVariables
|
|
||||||
toExpand string
|
|
||||||
expectedValues []string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
description: "no expansion for non-interpolated value",
|
|
||||||
toExpand: "foo",
|
|
||||||
expectedValues: []string{"foo"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "single level expansion for string var",
|
|
||||||
stringScope: exportedStringVariables{
|
|
||||||
"foo": "bar",
|
|
||||||
},
|
|
||||||
toExpand: "${foo}",
|
|
||||||
expectedValues: []string{"bar"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "single level expansion with short-name for string var",
|
|
||||||
stringScope: exportedStringVariables{
|
|
||||||
"foo": "bar",
|
|
||||||
},
|
|
||||||
toExpand: "${config.foo}",
|
|
||||||
expectedValues: []string{"bar"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "single level expansion string list var",
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"foo": []string{"bar"},
|
|
||||||
},
|
|
||||||
toExpand: "${foo}",
|
|
||||||
expectedValues: []string{"bar"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "mixed level expansion for string list var",
|
|
||||||
stringScope: exportedStringVariables{
|
|
||||||
"foo": "${bar}",
|
|
||||||
"qux": "hello",
|
|
||||||
},
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"bar": []string{"baz", "${qux}"},
|
|
||||||
},
|
|
||||||
toExpand: "${foo}",
|
|
||||||
expectedValues: []string{"baz hello"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "double level expansion",
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"foo": []string{"${bar}"},
|
|
||||||
"bar": []string{"baz"},
|
|
||||||
},
|
|
||||||
toExpand: "${foo}",
|
|
||||||
expectedValues: []string{"baz"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "double level expansion with a literal",
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"a": []string{"${b}", "c"},
|
|
||||||
"b": []string{"d"},
|
|
||||||
},
|
|
||||||
toExpand: "${a}",
|
|
||||||
expectedValues: []string{"d c"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "double level expansion, with two variables in a string",
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"a": []string{"${b} ${c}"},
|
|
||||||
"b": []string{"d"},
|
|
||||||
"c": []string{"e"},
|
|
||||||
},
|
|
||||||
toExpand: "${a}",
|
|
||||||
expectedValues: []string{"d e"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "triple level expansion with two variables in a string",
|
|
||||||
stringListScope: exportedStringListVariables{
|
|
||||||
"a": []string{"${b} ${c}"},
|
|
||||||
"b": []string{"${c}", "${d}"},
|
|
||||||
"c": []string{"${d}"},
|
|
||||||
"d": []string{"foo"},
|
|
||||||
},
|
|
||||||
toExpand: "${a}",
|
|
||||||
expectedValues: []string{"foo foo foo"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
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() },
|
|
||||||
},
|
|
||||||
config: android_arm64_config,
|
|
||||||
toExpand: "${a}-${b}",
|
|
||||||
expectedValues: []string{"android-arm64"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "double level multi type expansion",
|
|
||||||
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" },
|
|
||||||
},
|
|
||||||
config: android_arm64_config,
|
|
||||||
toExpand: "${const}/${platform}/${foo}",
|
|
||||||
expectedValues: []string{"const/android-arm64/foo"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
|
||||||
t.Run(testCase.description, func(t *testing.T) {
|
|
||||||
output, _ := expandVar(testCase.config, testCase.toExpand, testCase.stringScope, testCase.stringListScope, testCase.configVars)
|
|
||||||
if len(output) != len(testCase.expectedValues) {
|
|
||||||
t.Errorf("Expected %d values, got %d", len(testCase.expectedValues), len(output))
|
|
||||||
}
|
|
||||||
for i, actual := range output {
|
|
||||||
expectedValue := testCase.expectedValues[i]
|
|
||||||
if actual != expectedValue {
|
|
||||||
t.Errorf("Actual value '%s' doesn't match expected value '%s'", actual, expectedValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBazelToolchainVars(t *testing.T) {
|
|
||||||
testCases := []struct {
|
|
||||||
name string
|
|
||||||
config android.Config
|
|
||||||
vars []bazelVarExporter
|
|
||||||
expectedOut string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "exports strings",
|
|
||||||
vars: []bazelVarExporter{
|
|
||||||
exportedStringVariables{
|
|
||||||
"a": "b",
|
|
||||||
"c": "d",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
|
|
||||||
|
|
||||||
_a = "b"
|
|
||||||
|
|
||||||
_c = "d"
|
|
||||||
|
|
||||||
constants = struct(
|
|
||||||
a = _a,
|
|
||||||
c = _c,
|
|
||||||
)`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exports string lists",
|
|
||||||
vars: []bazelVarExporter{
|
|
||||||
exportedStringListVariables{
|
|
||||||
"a": []string{"b1", "b2"},
|
|
||||||
"c": []string{"d1", "d2"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
|
|
||||||
|
|
||||||
_a = [
|
|
||||||
"b1",
|
|
||||||
"b2",
|
|
||||||
]
|
|
||||||
|
|
||||||
_c = [
|
|
||||||
"d1",
|
|
||||||
"d2",
|
|
||||||
]
|
|
||||||
|
|
||||||
constants = struct(
|
|
||||||
a = _a,
|
|
||||||
c = _c,
|
|
||||||
)`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exports string lists dicts",
|
|
||||||
vars: []bazelVarExporter{
|
|
||||||
exportedStringListDictVariables{
|
|
||||||
"a": map[string][]string{"b1": []string{"b2"}},
|
|
||||||
"c": map[string][]string{"d1": []string{"d2"}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
|
|
||||||
|
|
||||||
_a = {
|
|
||||||
"b1": ["b2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
_c = {
|
|
||||||
"d1": ["d2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
constants = struct(
|
|
||||||
a = _a,
|
|
||||||
c = _c,
|
|
||||||
)`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exports dict with var refs",
|
|
||||||
vars: []bazelVarExporter{
|
|
||||||
exportedVariableReferenceDictVariables{
|
|
||||||
"a": map[string]string{"b1": "${b2}"},
|
|
||||||
"c": map[string]string{"d1": "${config.d2}"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
|
|
||||||
|
|
||||||
_a = {
|
|
||||||
"b1": _b2,
|
|
||||||
}
|
|
||||||
|
|
||||||
_c = {
|
|
||||||
"d1": _d2,
|
|
||||||
}
|
|
||||||
|
|
||||||
constants = struct(
|
|
||||||
a = _a,
|
|
||||||
c = _c,
|
|
||||||
)`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "sorts across types with variable references last",
|
|
||||||
vars: []bazelVarExporter{
|
|
||||||
exportedStringVariables{
|
|
||||||
"b": "b-val",
|
|
||||||
"d": "d-val",
|
|
||||||
},
|
|
||||||
exportedStringListVariables{
|
|
||||||
"c": []string{"c-val"},
|
|
||||||
"e": []string{"e-val"},
|
|
||||||
},
|
|
||||||
exportedStringListDictVariables{
|
|
||||||
"a": map[string][]string{"a1": []string{"a2"}},
|
|
||||||
"f": map[string][]string{"f1": []string{"f2"}},
|
|
||||||
},
|
|
||||||
exportedVariableReferenceDictVariables{
|
|
||||||
"aa": map[string]string{"b1": "${b}"},
|
|
||||||
"cc": map[string]string{"d1": "${config.d}"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedOut: `# GENERATED FOR BAZEL FROM SOONG. DO NOT EDIT.
|
|
||||||
|
|
||||||
_a = {
|
|
||||||
"a1": ["a2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
_b = "b-val"
|
|
||||||
|
|
||||||
_c = ["c-val"]
|
|
||||||
|
|
||||||
_d = "d-val"
|
|
||||||
|
|
||||||
_e = ["e-val"]
|
|
||||||
|
|
||||||
_f = {
|
|
||||||
"f1": ["f2"],
|
|
||||||
}
|
|
||||||
|
|
||||||
_aa = {
|
|
||||||
"b1": _b,
|
|
||||||
}
|
|
||||||
|
|
||||||
_cc = {
|
|
||||||
"d1": _d,
|
|
||||||
}
|
|
||||||
|
|
||||||
constants = struct(
|
|
||||||
a = _a,
|
|
||||||
b = _b,
|
|
||||||
c = _c,
|
|
||||||
d = _d,
|
|
||||||
e = _e,
|
|
||||||
f = _f,
|
|
||||||
aa = _aa,
|
|
||||||
cc = _cc,
|
|
||||||
)`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range testCases {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
out := bazelToolchainVars(tc.config, tc.vars...)
|
|
||||||
if out != tc.expectedOut {
|
|
||||||
t.Errorf("Expected \n%s, got \n%s", tc.expectedOut, out)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@@ -23,6 +23,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
pctx = android.NewPackageContext("android/soong/cc/config")
|
||||||
|
exportedVars = android.NewExportedVariables(pctx)
|
||||||
|
|
||||||
// Flags used by lots of devices. Putting them in package static variables
|
// 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
|
// will save bytes in build.ninja so they aren't repeated for every file
|
||||||
commonGlobalCflags = []string{
|
commonGlobalCflags = []string{
|
||||||
@@ -296,20 +299,28 @@ var (
|
|||||||
WarningAllowedOldProjects = []string{}
|
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() {
|
func init() {
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=")
|
commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=")
|
||||||
}
|
}
|
||||||
|
|
||||||
exportStringListStaticVariable("CommonGlobalConlyflags", commonGlobalConlyflags)
|
exportedVars.ExportStringListStaticVariable("CommonGlobalConlyflags", commonGlobalConlyflags)
|
||||||
exportStringListStaticVariable("DeviceGlobalCppflags", deviceGlobalCppflags)
|
exportedVars.ExportStringListStaticVariable("DeviceGlobalCppflags", deviceGlobalCppflags)
|
||||||
exportStringListStaticVariable("DeviceGlobalLdflags", deviceGlobalLdflags)
|
exportedVars.ExportStringListStaticVariable("DeviceGlobalLdflags", deviceGlobalLdflags)
|
||||||
exportStringListStaticVariable("DeviceGlobalLldflags", deviceGlobalLldflags)
|
exportedVars.ExportStringListStaticVariable("DeviceGlobalLldflags", deviceGlobalLldflags)
|
||||||
exportStringListStaticVariable("HostGlobalCppflags", hostGlobalCppflags)
|
exportedVars.ExportStringListStaticVariable("HostGlobalCppflags", hostGlobalCppflags)
|
||||||
exportStringListStaticVariable("HostGlobalLdflags", hostGlobalLdflags)
|
exportedVars.ExportStringListStaticVariable("HostGlobalLdflags", hostGlobalLdflags)
|
||||||
exportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags)
|
exportedVars.ExportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags)
|
||||||
|
|
||||||
// Export the static default CommonGlobalCflags to Bazel.
|
// Export the static default CommonGlobalCflags to Bazel.
|
||||||
// TODO(187086342): handle cflags that are set in VariableFuncs.
|
// TODO(187086342): handle cflags that are set in VariableFuncs.
|
||||||
@@ -320,7 +331,7 @@ func init() {
|
|||||||
"-ftrivial-auto-var-init=zero",
|
"-ftrivial-auto-var-init=zero",
|
||||||
"-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang",
|
"-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 {
|
pctx.VariableFunc("CommonGlobalCflags", func(ctx android.PackageVarContext) string {
|
||||||
flags := commonGlobalCflags
|
flags := commonGlobalCflags
|
||||||
@@ -349,17 +360,17 @@ func init() {
|
|||||||
|
|
||||||
// Export the static default DeviceGlobalCflags to Bazel.
|
// Export the static default DeviceGlobalCflags to Bazel.
|
||||||
// TODO(187086342): handle cflags that are set in VariableFuncs.
|
// 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 {
|
pctx.VariableFunc("DeviceGlobalCflags", func(ctx android.PackageVarContext) string {
|
||||||
return strings.Join(deviceGlobalCflags, " ")
|
return strings.Join(deviceGlobalCflags, " ")
|
||||||
})
|
})
|
||||||
|
|
||||||
exportStringListStaticVariable("HostGlobalCflags", hostGlobalCflags)
|
exportedVars.ExportStringListStaticVariable("HostGlobalCflags", hostGlobalCflags)
|
||||||
exportStringListStaticVariable("NoOverrideGlobalCflags", noOverrideGlobalCflags)
|
exportedVars.ExportStringListStaticVariable("NoOverrideGlobalCflags", noOverrideGlobalCflags)
|
||||||
exportStringListStaticVariable("NoOverrideExternalGlobalCflags", noOverrideExternalGlobalCflags)
|
exportedVars.ExportStringListStaticVariable("NoOverrideExternalGlobalCflags", noOverrideExternalGlobalCflags)
|
||||||
exportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
|
exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
|
||||||
exportStringListStaticVariable("ExternalCflags", extraExternalCflags)
|
exportedVars.ExportStringListStaticVariable("ExternalCflags", extraExternalCflags)
|
||||||
|
|
||||||
// Everything in these lists is a crime against abstraction and dependency tracking.
|
// Everything in these lists is a crime against abstraction and dependency tracking.
|
||||||
// Do not add anything to this list.
|
// Do not add anything to this list.
|
||||||
@@ -374,11 +385,11 @@ func init() {
|
|||||||
"frameworks/native/opengl/include",
|
"frameworks/native/opengl/include",
|
||||||
"frameworks/av/include",
|
"frameworks/av/include",
|
||||||
}
|
}
|
||||||
exportedStringListVars.Set("CommonGlobalIncludes", commonGlobalIncludes)
|
exportedVars.ExportStringList("CommonGlobalIncludes", commonGlobalIncludes)
|
||||||
pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I", commonGlobalIncludes)
|
pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I", commonGlobalIncludes)
|
||||||
|
|
||||||
exportStringStaticVariable("CLANG_DEFAULT_VERSION", ClangDefaultVersion)
|
exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_VERSION", ClangDefaultVersion)
|
||||||
exportStringStaticVariable("CLANG_DEFAULT_SHORT_VERSION", ClangDefaultShortVersion)
|
exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_SHORT_VERSION", ClangDefaultShortVersion)
|
||||||
|
|
||||||
pctx.StaticVariableWithEnvOverride("ClangBase", "LLVM_PREBUILTS_BASE", ClangDefaultBase)
|
pctx.StaticVariableWithEnvOverride("ClangBase", "LLVM_PREBUILTS_BASE", ClangDefaultBase)
|
||||||
pctx.StaticVariableWithEnvOverride("ClangVersion", "LLVM_PREBUILTS_VERSION", ClangDefaultVersion)
|
pctx.StaticVariableWithEnvOverride("ClangVersion", "LLVM_PREBUILTS_VERSION", ClangDefaultVersion)
|
||||||
@@ -418,7 +429,7 @@ func init() {
|
|||||||
pctx.StaticVariableWithEnvOverride("REAbiLinkerExecStrategy", "RBE_ABI_LINKER_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
|
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 {
|
func ClangPath(ctx android.PathContext, file string) android.SourcePath {
|
||||||
type clangToolKey string
|
type clangToolKey string
|
||||||
|
@@ -91,26 +91,26 @@ func init() {
|
|||||||
pctx.SourcePathVariable("X86_64GccRoot",
|
pctx.SourcePathVariable("X86_64GccRoot",
|
||||||
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86_64GccVersion}")
|
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86_64GccVersion}")
|
||||||
|
|
||||||
exportStringListStaticVariable("X86_64ToolchainCflags", []string{"-m64"})
|
exportedVars.ExportStringListStaticVariable("X86_64ToolchainCflags", []string{"-m64"})
|
||||||
exportStringListStaticVariable("X86_64ToolchainLdflags", []string{"-m64"})
|
exportedVars.ExportStringListStaticVariable("X86_64ToolchainLdflags", []string{"-m64"})
|
||||||
|
|
||||||
exportStringListStaticVariable("X86_64Ldflags", x86_64Ldflags)
|
exportedVars.ExportStringListStaticVariable("X86_64Ldflags", x86_64Ldflags)
|
||||||
exportStringListStaticVariable("X86_64Lldflags", x86_64Ldflags)
|
exportedVars.ExportStringListStaticVariable("X86_64Lldflags", x86_64Ldflags)
|
||||||
|
|
||||||
// Clang cflags
|
// Clang cflags
|
||||||
exportStringListStaticVariable("X86_64Cflags", x86_64Cflags)
|
exportedVars.ExportStringListStaticVariable("X86_64Cflags", x86_64Cflags)
|
||||||
exportStringListStaticVariable("X86_64Cppflags", x86_64Cppflags)
|
exportedVars.ExportStringListStaticVariable("X86_64Cppflags", x86_64Cppflags)
|
||||||
|
|
||||||
// Yasm flags
|
// Yasm flags
|
||||||
exportStringListStaticVariable("X86_64YasmFlags", []string{
|
exportedVars.ExportStringListStaticVariable("X86_64YasmFlags", []string{
|
||||||
"-f elf64",
|
"-f elf64",
|
||||||
"-m amd64",
|
"-m amd64",
|
||||||
})
|
})
|
||||||
|
|
||||||
// Extended cflags
|
// Extended cflags
|
||||||
|
|
||||||
exportedStringListDictVars.Set("X86_64ArchVariantCflags", x86_64ArchVariantCflags)
|
exportedVars.ExportStringListDict("X86_64ArchVariantCflags", x86_64ArchVariantCflags)
|
||||||
exportedStringListDictVars.Set("X86_64ArchFeatureCflags", x86_64ArchFeatureCflags)
|
exportedVars.ExportStringListDict("X86_64ArchFeatureCflags", x86_64ArchFeatureCflags)
|
||||||
|
|
||||||
// Architecture variant cflags
|
// Architecture variant cflags
|
||||||
for variant, cflags := range x86_64ArchVariantCflags {
|
for variant, cflags := range x86_64ArchVariantCflags {
|
||||||
|
@@ -98,25 +98,25 @@ func init() {
|
|||||||
pctx.SourcePathVariable("X86GccRoot",
|
pctx.SourcePathVariable("X86GccRoot",
|
||||||
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86GccVersion}")
|
"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86GccVersion}")
|
||||||
|
|
||||||
exportStringListStaticVariable("X86ToolchainCflags", []string{"-m32"})
|
exportedVars.ExportStringListStaticVariable("X86ToolchainCflags", []string{"-m32"})
|
||||||
exportStringListStaticVariable("X86ToolchainLdflags", []string{"-m32"})
|
exportedVars.ExportStringListStaticVariable("X86ToolchainLdflags", []string{"-m32"})
|
||||||
|
|
||||||
exportStringListStaticVariable("X86Ldflags", x86Ldflags)
|
exportedVars.ExportStringListStaticVariable("X86Ldflags", x86Ldflags)
|
||||||
exportStringListStaticVariable("X86Lldflags", x86Ldflags)
|
exportedVars.ExportStringListStaticVariable("X86Lldflags", x86Ldflags)
|
||||||
|
|
||||||
// Clang cflags
|
// Clang cflags
|
||||||
exportStringListStaticVariable("X86Cflags", x86Cflags)
|
exportedVars.ExportStringListStaticVariable("X86Cflags", x86Cflags)
|
||||||
exportStringListStaticVariable("X86Cppflags", x86Cppflags)
|
exportedVars.ExportStringListStaticVariable("X86Cppflags", x86Cppflags)
|
||||||
|
|
||||||
// Yasm flags
|
// Yasm flags
|
||||||
exportStringListStaticVariable("X86YasmFlags", []string{
|
exportedVars.ExportStringListStaticVariable("X86YasmFlags", []string{
|
||||||
"-f elf32",
|
"-f elf32",
|
||||||
"-m x86",
|
"-m x86",
|
||||||
})
|
})
|
||||||
|
|
||||||
// Extended cflags
|
// Extended cflags
|
||||||
exportedStringListDictVars.Set("X86ArchVariantCflags", x86ArchVariantCflags)
|
exportedVars.ExportStringListDict("X86ArchVariantCflags", x86ArchVariantCflags)
|
||||||
exportedStringListDictVars.Set("X86ArchFeatureCflags", x86ArchFeatureCflags)
|
exportedVars.ExportStringListDict("X86ArchFeatureCflags", x86ArchFeatureCflags)
|
||||||
|
|
||||||
// Architecture variant cflags
|
// Architecture variant cflags
|
||||||
for variant, cflags := range x86ArchVariantCflags {
|
for variant, cflags := range x86ArchVariantCflags {
|
||||||
|
@@ -121,40 +121,40 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
exportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
|
exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion)
|
||||||
exportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
|
exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion)
|
||||||
|
|
||||||
// Most places use the full GCC version. A few only use up to the first two numbers.
|
// 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 {
|
if p := strings.Split(linuxGccVersion, "."); len(p) > 2 {
|
||||||
exportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
|
exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], "."))
|
||||||
} else {
|
} else {
|
||||||
exportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
|
exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
exportSourcePathVariable("LinuxGccRoot",
|
exportedVars.ExportSourcePathVariable("LinuxGccRoot",
|
||||||
"prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}")
|
"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)
|
exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags)
|
||||||
exportStringListStaticVariable("LinuxLdflags", linuxLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags)
|
||||||
exportStringListStaticVariable("LinuxLldflags", linuxLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags)
|
||||||
exportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
|
exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags)
|
||||||
exportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags)
|
||||||
exportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags)
|
||||||
exportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
|
exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags)
|
||||||
exportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags)
|
||||||
exportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
|
exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags)
|
||||||
|
|
||||||
exportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags)
|
||||||
exportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags)
|
||||||
exportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags)
|
||||||
exportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags)
|
||||||
exportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags)
|
||||||
exportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
|
exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags)
|
||||||
// Yasm flags
|
// Yasm flags
|
||||||
exportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
|
exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"})
|
||||||
exportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
|
exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"})
|
||||||
}
|
}
|
||||||
|
|
||||||
type toolchainLinux struct {
|
type toolchainLinux struct {
|
||||||
|
@@ -26,7 +26,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
pctx = android.NewPackageContext("android/soong/java/config")
|
pctx = android.NewPackageContext("android/soong/java/config")
|
||||||
|
exportedVars = android.NewExportedVariables(pctx)
|
||||||
|
|
||||||
LegacyCorePlatformBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"}
|
LegacyCorePlatformBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"}
|
||||||
LegacyCorePlatformSystemModules = "legacy-core-platform-api-stubs-system-modules"
|
LegacyCorePlatformSystemModules = "legacy-core-platform-api-stubs-system-modules"
|
||||||
@@ -53,25 +54,40 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
var (
|
||||||
JavaVmFlags = `-XX:OnError="cat hs_err_pid%p.log" -XX:CICompilerCount=6 -XX:+UseDynamicNumberOfGCThreads`
|
JavacVmFlags = strings.Join(javacVmFlagsList, " ")
|
||||||
JavacVmFlags = `-J-XX:OnError="cat hs_err_pid%p.log" -J-XX:CICompilerCount=6 -J-XX:+UseDynamicNumberOfGCThreads -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1`
|
javaVmFlagsList = []string{
|
||||||
|
`-XX:OnError="cat hs_err_pid%p.log"`,
|
||||||
|
"-XX:CICompilerCount=6",
|
||||||
|
"-XX:+UseDynamicNumberOfGCThreads",
|
||||||
|
}
|
||||||
|
javacVmFlagsList = []string{
|
||||||
|
`-J-XX:OnError="cat hs_err_pid%p.log"`,
|
||||||
|
"-J-XX:CICompilerCount=6",
|
||||||
|
"-J-XX:+UseDynamicNumberOfGCThreads",
|
||||||
|
"-J-XX:+TieredCompilation",
|
||||||
|
"-J-XX:TieredStopAtLevel=1",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
pctx.Import("github.com/google/blueprint/bootstrap")
|
pctx.Import("github.com/google/blueprint/bootstrap")
|
||||||
|
|
||||||
pctx.StaticVariable("JavacHeapSize", "2048M")
|
exportedVars.ExportStringStaticVariable("JavacHeapSize", "2048M")
|
||||||
pctx.StaticVariable("JavacHeapFlags", "-J-Xmx${JavacHeapSize}")
|
exportedVars.ExportStringStaticVariable("JavacHeapFlags", "-J-Xmx${JavacHeapSize}")
|
||||||
|
|
||||||
// ErrorProne can use significantly more memory than javac alone, give it a higher heap
|
// ErrorProne can use significantly more memory than javac alone, give it a higher heap
|
||||||
// size (b/221480398).
|
// size (b/221480398).
|
||||||
pctx.StaticVariable("ErrorProneHeapSize", "4096M")
|
exportedVars.ExportStringStaticVariable("ErrorProneHeapSize", "4096M")
|
||||||
pctx.StaticVariable("ErrorProneHeapFlags", "-J-Xmx${ErrorProneHeapSize}")
|
exportedVars.ExportStringStaticVariable("ErrorProneHeapFlags", "-J-Xmx${ErrorProneHeapSize}")
|
||||||
|
|
||||||
pctx.StaticVariable("DexFlags", "-JXX:OnError='cat hs_err_pid%p.log' -JXX:CICompilerCount=6 -JXX:+UseDynamicNumberOfGCThreads")
|
exportedVars.ExportStringListStaticVariable("DexFlags", []string{
|
||||||
|
`-JXX:OnError="cat hs_err_pid%p.log"`,
|
||||||
|
"-JXX:CICompilerCount=6",
|
||||||
|
"-JXX:+UseDynamicNumberOfGCThreads",
|
||||||
|
})
|
||||||
|
|
||||||
pctx.StaticVariable("CommonJdkFlags", strings.Join([]string{
|
exportedVars.ExportStringListStaticVariable("CommonJdkFlags", []string{
|
||||||
`-Xmaxerrs 9999999`,
|
`-Xmaxerrs 9999999`,
|
||||||
`-encoding UTF-8`,
|
`-encoding UTF-8`,
|
||||||
`-sourcepath ""`,
|
`-sourcepath ""`,
|
||||||
@@ -85,10 +101,10 @@ func init() {
|
|||||||
|
|
||||||
// b/65004097: prevent using java.lang.invoke.StringConcatFactory when using -target 1.9
|
// b/65004097: prevent using java.lang.invoke.StringConcatFactory when using -target 1.9
|
||||||
`-XDstringConcat=inline`,
|
`-XDstringConcat=inline`,
|
||||||
}, " "))
|
})
|
||||||
|
|
||||||
pctx.StaticVariable("JavaVmFlags", JavaVmFlags)
|
exportedVars.ExportStringListStaticVariable("JavaVmFlags", javaVmFlagsList)
|
||||||
pctx.StaticVariable("JavacVmFlags", JavacVmFlags)
|
exportedVars.ExportStringListStaticVariable("JavacVmFlags", javacVmFlagsList)
|
||||||
|
|
||||||
pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS)
|
pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS)
|
||||||
|
|
||||||
@@ -184,6 +200,10 @@ func init() {
|
|||||||
hostJNIToolVariableWithSdkToolsPrebuilt("SignapkJniLibrary", "libconscrypt_openjdk_jni")
|
hostJNIToolVariableWithSdkToolsPrebuilt("SignapkJniLibrary", "libconscrypt_openjdk_jni")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BazelJavaToolchainVars(config android.Config) string {
|
||||||
|
return android.BazelToolchainVars(config, exportedVars)
|
||||||
|
}
|
||||||
|
|
||||||
func hostBinToolVariableWithSdkToolsPrebuilt(name, tool string) {
|
func hostBinToolVariableWithSdkToolsPrebuilt(name, tool string) {
|
||||||
pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
|
pctx.VariableFunc(name, func(ctx android.PackageVarContext) string {
|
||||||
if ctx.Config().AlwaysUsePrebuiltSdks() {
|
if ctx.Config().AlwaysUsePrebuiltSdks() {
|
||||||
|
@@ -16,8 +16,6 @@ package config
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/android"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -31,23 +29,23 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Wrapper that grabs value of val late so it can be initialized by a later module's init function
|
// Wrapper that grabs value of val late so it can be initialized by a later module's init function
|
||||||
func errorProneVar(name string, val *[]string, sep string) {
|
func errorProneVar(val *[]string, sep string) func() string {
|
||||||
pctx.VariableFunc(name, func(android.PackageVarContext) string {
|
return func() string {
|
||||||
return strings.Join(*val, sep)
|
return strings.Join(*val, sep)
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
errorProneVar("ErrorProneClasspath", &ErrorProneClasspath, ":")
|
exportedVars.ExportVariableFuncVariable("ErrorProneClasspath", errorProneVar(&ErrorProneClasspath, ":"))
|
||||||
errorProneVar("ErrorProneChecksError", &ErrorProneChecksError, " ")
|
exportedVars.ExportVariableFuncVariable("ErrorProneChecksError", errorProneVar(&ErrorProneChecksError, " "))
|
||||||
errorProneVar("ErrorProneChecksWarning", &ErrorProneChecksWarning, " ")
|
exportedVars.ExportVariableFuncVariable("ErrorProneChecksWarning", errorProneVar(&ErrorProneChecksWarning, " "))
|
||||||
errorProneVar("ErrorProneChecksDefaultDisabled", &ErrorProneChecksDefaultDisabled, " ")
|
exportedVars.ExportVariableFuncVariable("ErrorProneChecksDefaultDisabled", errorProneVar(&ErrorProneChecksDefaultDisabled, " "))
|
||||||
errorProneVar("ErrorProneChecksOff", &ErrorProneChecksOff, " ")
|
exportedVars.ExportVariableFuncVariable("ErrorProneChecksOff", errorProneVar(&ErrorProneChecksOff, " "))
|
||||||
errorProneVar("ErrorProneFlags", &ErrorProneFlags, " ")
|
exportedVars.ExportVariableFuncVariable("ErrorProneFlags", errorProneVar(&ErrorProneFlags, " "))
|
||||||
pctx.StaticVariable("ErrorProneChecks", strings.Join([]string{
|
exportedVars.ExportStringListStaticVariable("ErrorProneChecks", []string{
|
||||||
"${ErrorProneChecksOff}",
|
"${ErrorProneChecksOff}",
|
||||||
"${ErrorProneChecksError}",
|
"${ErrorProneChecksError}",
|
||||||
"${ErrorProneChecksWarning}",
|
"${ErrorProneChecksWarning}",
|
||||||
"${ErrorProneChecksDefaultDisabled}",
|
"${ErrorProneChecksDefaultDisabled}",
|
||||||
}, " "))
|
})
|
||||||
}
|
}
|
||||||
|
@@ -39,21 +39,26 @@ func PrintBool(item bool) string {
|
|||||||
|
|
||||||
// PrintsStringList returns a Starlark-compatible string of a list of Strings/Labels.
|
// PrintsStringList returns a Starlark-compatible string of a list of Strings/Labels.
|
||||||
func PrintStringList(items []string, indentLevel int) string {
|
func PrintStringList(items []string, indentLevel int) string {
|
||||||
return PrintList(items, indentLevel, `"%s"`)
|
return PrintList(items, indentLevel, func(s string) string {
|
||||||
|
if strings.Contains(s, "\"") {
|
||||||
|
return `'''%s'''`
|
||||||
|
}
|
||||||
|
return `"%s"`
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrintList returns a Starlark-compatible string of list formmated as requested.
|
// PrintList returns a Starlark-compatible string of list formmated as requested.
|
||||||
func PrintList(items []string, indentLevel int, formatString string) string {
|
func PrintList(items []string, indentLevel int, formatString func(string) string) string {
|
||||||
if len(items) == 0 {
|
if len(items) == 0 {
|
||||||
return "[]"
|
return "[]"
|
||||||
} else if len(items) == 1 {
|
} else if len(items) == 1 {
|
||||||
return fmt.Sprintf("["+formatString+"]", items[0])
|
return fmt.Sprintf("["+formatString(items[0])+"]", items[0])
|
||||||
}
|
}
|
||||||
list := make([]string, 0, len(items)+2)
|
list := make([]string, 0, len(items)+2)
|
||||||
list = append(list, "[")
|
list = append(list, "[")
|
||||||
innerIndent := Indention(indentLevel + 1)
|
innerIndent := Indention(indentLevel + 1)
|
||||||
for _, item := range items {
|
for _, item := range items {
|
||||||
list = append(list, fmt.Sprintf(`%s`+formatString+`,`, innerIndent, item))
|
list = append(list, fmt.Sprintf(`%s`+formatString(item)+`,`, innerIndent, item))
|
||||||
}
|
}
|
||||||
list = append(list, Indention(indentLevel)+"]")
|
list = append(list, Indention(indentLevel)+"]")
|
||||||
return strings.Join(list, "\n")
|
return strings.Join(list, "\n")
|
||||||
|
@@ -18,6 +18,10 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func simpleFormat(s string) string {
|
||||||
|
return "%s"
|
||||||
|
}
|
||||||
|
|
||||||
func TestPrintEmptyStringList(t *testing.T) {
|
func TestPrintEmptyStringList(t *testing.T) {
|
||||||
in := []string{}
|
in := []string{}
|
||||||
indentLevel := 0
|
indentLevel := 0
|
||||||
@@ -54,7 +58,7 @@ func TestPrintMultiElementStringList(t *testing.T) {
|
|||||||
func TestPrintEmptyList(t *testing.T) {
|
func TestPrintEmptyList(t *testing.T) {
|
||||||
in := []string{}
|
in := []string{}
|
||||||
indentLevel := 0
|
indentLevel := 0
|
||||||
out := PrintList(in, indentLevel, "%s")
|
out := PrintList(in, indentLevel, simpleFormat)
|
||||||
expectedOut := "[]"
|
expectedOut := "[]"
|
||||||
if out != expectedOut {
|
if out != expectedOut {
|
||||||
t.Errorf("Expected %q, got %q", expectedOut, out)
|
t.Errorf("Expected %q, got %q", expectedOut, out)
|
||||||
@@ -64,7 +68,7 @@ func TestPrintEmptyList(t *testing.T) {
|
|||||||
func TestPrintSingleElementList(t *testing.T) {
|
func TestPrintSingleElementList(t *testing.T) {
|
||||||
in := []string{"1"}
|
in := []string{"1"}
|
||||||
indentLevel := 0
|
indentLevel := 0
|
||||||
out := PrintList(in, indentLevel, "%s")
|
out := PrintList(in, indentLevel, simpleFormat)
|
||||||
expectedOut := `[1]`
|
expectedOut := `[1]`
|
||||||
if out != expectedOut {
|
if out != expectedOut {
|
||||||
t.Errorf("Expected %q, got %q", expectedOut, out)
|
t.Errorf("Expected %q, got %q", expectedOut, out)
|
||||||
@@ -74,7 +78,7 @@ func TestPrintSingleElementList(t *testing.T) {
|
|||||||
func TestPrintMultiElementList(t *testing.T) {
|
func TestPrintMultiElementList(t *testing.T) {
|
||||||
in := []string{"1", "2"}
|
in := []string{"1", "2"}
|
||||||
indentLevel := 0
|
indentLevel := 0
|
||||||
out := PrintList(in, indentLevel, "%s")
|
out := PrintList(in, indentLevel, simpleFormat)
|
||||||
expectedOut := `[
|
expectedOut := `[
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
@@ -87,7 +91,7 @@ func TestPrintMultiElementList(t *testing.T) {
|
|||||||
func TestListWithNonZeroIndent(t *testing.T) {
|
func TestListWithNonZeroIndent(t *testing.T) {
|
||||||
in := []string{"1", "2"}
|
in := []string{"1", "2"}
|
||||||
indentLevel := 1
|
indentLevel := 1
|
||||||
out := PrintList(in, indentLevel, "%s")
|
out := PrintList(in, indentLevel, simpleFormat)
|
||||||
expectedOut := `[
|
expectedOut := `[
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
|
Reference in New Issue
Block a user