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

@@ -1879,76 +1879,78 @@ func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
// not set, only emit if gnu_extensions is disabled. the default (gnu+17 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
// is set in the toolchain.) // is set in the toolchain.)
{cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""}, {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
{cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "cpp_std_default_no_gnu", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""}, {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
// experimental defaults to gnu++2a // experimental defaults to gnu++2a
{cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"}, {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "cpp_std_experimental"},
{cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"}, {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "cpp_std_experimental_no_gnu", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"}, {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "cpp_std_experimental"},
// Explicitly setting a c++ std does not use replace gnu++ std even if // Explicitly setting a c++ std does not use replace gnu++ std even if
// gnu_extensions is true. // gnu_extensions is true.
// "c++11", // "c++11",
{cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"}, {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
{cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"}, {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"}, {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
// "c++17", // "c++17",
{cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"}, {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
{cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"}, {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
// "c++2a", // "c++2a",
{cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"}, {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
{cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"}, {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"}, {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
// "c++98", // "c++98",
{cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"}, {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
{cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"}, {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"}, {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
// gnu++ is replaced with c++ if gnu_extensions is explicitly false. // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
// "gnu++11", // "gnu++11",
{cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"}, {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
{cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"}, {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"}, {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
// "gnu++17", // "gnu++17",
{cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"}, {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
{cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c_std_default_no_gnu"},
{cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"}, {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
// some c_std test cases // some c_std test cases
{c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu17"}, {c_std: "experimental", gnu_extensions: "", bazel_c_std: "c_std_experimental"},
{c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c17"}, {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "cpp_std_default_no_gnu", bazel_c_std: "c_std_experimental_no_gnu"},
{c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu17"}, {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "c_std_experimental"},
{c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"}, {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
{c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"}, {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
{c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"}, {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
} }
for i, tc := range testCases { for i, tc := range testCases {
name_prefix := fmt.Sprintf("a_%v", i) name := fmt.Sprintf("cpp std: %q, c std: %q, gnu_extensions: %q", tc.cpp_std, tc.c_std, tc.gnu_extensions)
cppStdProp := "" t.Run(name, func(t *testing.T) {
if tc.cpp_std != "" { name_prefix := fmt.Sprintf("a_%v", i)
cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std) cppStdProp := ""
} if tc.cpp_std != "" {
cStdProp := "" cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
if tc.c_std != "" { }
cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std) cStdProp := ""
} if tc.c_std != "" {
gnuExtensionsProp := "" cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
if tc.gnu_extensions != "" { }
gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions) gnuExtensionsProp := ""
} if tc.gnu_extensions != "" {
attrs := attrNameToString{} gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
if tc.bazel_cpp_std != "" { }
attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std) attrs := attrNameToString{}
} if tc.bazel_cpp_std != "" {
if tc.bazel_c_std != "" { attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std) }
} if tc.bazel_c_std != "" {
attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
}
runCcLibraryTestCase(t, bp2buildTestCase{ runCcLibraryTestCase(t, bp2buildTestCase{
description: fmt.Sprintf( description: fmt.Sprintf(
"cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
moduleTypeUnderTest: "cc_library", moduleTypeUnderTest: "cc_library",
moduleTypeUnderTestFactory: cc.LibraryFactory, moduleTypeUnderTestFactory: cc.LibraryFactory,
blueprint: soongCcLibraryPreamble + fmt.Sprintf(` blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
cc_library { cc_library {
name: "%s_full", name: "%s_full",
%s // cpp_std: *string %s // cpp_std: *string
@@ -1957,15 +1959,15 @@ cc_library {
include_build_directory: false, include_build_directory: false,
} }
`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs), expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
}) })
runCcLibraryStaticTestCase(t, bp2buildTestCase{ runCcLibraryStaticTestCase(t, bp2buildTestCase{
description: fmt.Sprintf( description: fmt.Sprintf(
"cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
moduleTypeUnderTest: "cc_library_static", moduleTypeUnderTest: "cc_library_static",
moduleTypeUnderTestFactory: cc.LibraryStaticFactory, moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
blueprint: soongCcLibraryPreamble + fmt.Sprintf(` blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
cc_library_static { cc_library_static {
name: "%s_static", name: "%s_static",
%s // cpp_std: *string %s // cpp_std: *string
@@ -1974,17 +1976,17 @@ cc_library_static {
include_build_directory: false, include_build_directory: false,
} }
`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
expectedBazelTargets: []string{ expectedBazelTargets: []string{
makeBazelTarget("cc_library_static", name_prefix+"_static", attrs), makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
}, },
}) })
runCcLibrarySharedTestCase(t, bp2buildTestCase{ runCcLibrarySharedTestCase(t, bp2buildTestCase{
description: fmt.Sprintf( description: fmt.Sprintf(
"cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
moduleTypeUnderTest: "cc_library_shared", moduleTypeUnderTest: "cc_library_shared",
moduleTypeUnderTestFactory: cc.LibrarySharedFactory, moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
blueprint: soongCcLibraryPreamble + fmt.Sprintf(` blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
cc_library_shared { cc_library_shared {
name: "%s_shared", name: "%s_shared",
%s // cpp_std: *string %s // cpp_std: *string
@@ -1993,9 +1995,10 @@ cc_library_shared {
include_build_directory: false, include_build_directory: false,
} }
`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
expectedBazelTargets: []string{ expectedBazelTargets: []string{
makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs), makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
}, },
})
}) })
} }
} }

View File

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

View File

@@ -372,6 +372,11 @@ func init() {
exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags) exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags)
exportedVars.ExportStringListStaticVariable("ExternalCflags", extraExternalCflags) 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. // 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.
commonGlobalIncludes := []string{ commonGlobalIncludes := []string{