Do not hardcode default/experimental c{pp}std

Prevent bugs like b/232866078 by using the same values across Bazel and
Soong

Test: bp2build.sh
Change-Id: If257f9f5f8e8a70bbf3a8cf5479758c703c25c3f
This commit is contained in:
Liz Kammer
2022-05-25 23:19:37 -04:00
parent 78ce8c23de
commit a5a29de677
4 changed files with 93 additions and 80 deletions

View File

@@ -429,32 +429,33 @@ func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProper
return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedSrcsLabelList), anySrcs
}
func bp2buildResolveCppStdValue(c_std *string, cpp_std *string, gnu_extensions *bool) (*string, *string) {
var cStdVal, cppStdVal string
func bp2buildStdVal(std *string, prefix string, useGnu bool) *string {
defaultVal := prefix + "_std_default"
// If c{,pp}std properties are not specified, don't generate them in the BUILD file.
// Defaults are handled by the toolchain definition.
// However, if gnu_extensions is false, then the default gnu-to-c version must be specified.
if cpp_std != nil {
cppStdVal = parseCppStd(cpp_std)
} else if gnu_extensions != nil && !*gnu_extensions {
cppStdVal = "c++17"
}
if c_std != nil {
cStdVal = parseCStd(c_std)
} else if gnu_extensions != nil && !*gnu_extensions {
cStdVal = "c99"
stdVal := proptools.StringDefault(std, defaultVal)
if stdVal == "experimental" || stdVal == defaultVal {
if stdVal == "experimental" {
stdVal = prefix + "_std_experimental"
}
if !useGnu {
stdVal += "_no_gnu"
}
} else if !useGnu {
stdVal = gnuToCReplacer.Replace(stdVal)
}
cStdVal, cppStdVal = maybeReplaceGnuToC(gnu_extensions, cStdVal, cppStdVal)
var c_std_prop, cpp_std_prop *string
if cStdVal != "" {
c_std_prop = &cStdVal
}
if cppStdVal != "" {
cpp_std_prop = &cppStdVal
if stdVal == defaultVal {
return nil
}
return &stdVal
}
return c_std_prop, cpp_std_prop
func bp2buildResolveCppStdValue(c_std *string, cpp_std *string, gnu_extensions *bool) (*string, *string) {
useGnu := useGnuExtensions(gnu_extensions)
return bp2buildStdVal(c_std, "c", useGnu), bp2buildStdVal(cpp_std, "cpp", useGnu)
}
// packageFromLabel extracts package from a fully-qualified or relative Label and whether the label

View File

@@ -295,8 +295,12 @@ func addToModuleList(ctx ModuleContext, key android.OnceKey, module string) {
getNamedMapForConfig(ctx.Config(), key).Store(module, true)
}
func useGnuExtensions(gnuExtensions *bool) bool {
return proptools.BoolDefault(gnuExtensions, true)
}
func maybeReplaceGnuToC(gnuExtensions *bool, cStd string, cppStd string) (string, string) {
if gnuExtensions != nil && *gnuExtensions == false {
if !useGnuExtensions(gnuExtensions) {
cStd = gnuToCReplacer.Replace(cStd)
cppStd = gnuToCReplacer.Replace(cppStd)
}

View File

@@ -372,6 +372,11 @@ func init() {
exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
exportedVars.ExportStringListStaticVariable("ExternalCflags", extraExternalCflags)
exportedVars.ExportString("CStdVersion", CStdVersion)
exportedVars.ExportString("CppStdVersion", CppStdVersion)
exportedVars.ExportString("ExperimentalCStdVersion", ExperimentalCStdVersion)
exportedVars.ExportString("ExperimentalCppStdVersion", ExperimentalCppStdVersion)
// Everything in these lists is a crime against abstraction and dependency tracking.
// Do not add anything to this list.
commonGlobalIncludes := []string{