Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e28a176a authored by Christopher Parsons's avatar Christopher Parsons Committed by Gerrit Code Review
Browse files

Merge "Rollforward "Split asm and c flags and srcs in...""

parents 3169bca9 990c4f4f
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -220,15 +220,7 @@ var (
	// Per-module denylist to opt modules out of mixed builds. Such modules will
	// still be generated via bp2build.
	mixedBuildsDisabledList = []string{
		"libc_common",                      // cparsons@ cc_library_static, depends on //bionic/libc:libc_nopthread
		"libc_common_static",               // cparsons@ cc_library_static, depends on //bionic/libc:libc_common
		"libc_common_shared",               // cparsons@ cc_library_static, depends on //bionic/libc:libc_common
		"libc_netbsd",                      // lberki@, cc_library_static, version script assignment of 'LIBC_PRIVATE' to symbol 'SHA1Final' failed: symbol not defined
		"libc_nopthread",                   // cparsons@ cc_library_static, version script assignment of 'LIBC' to symbol 'memcmp' failed: symbol not defined
		"libc_openbsd",                     // ruperts@, cc_library_static, OK for bp2build but error: duplicate symbol: strcpy for mixed builds
		"libarm-optimized-routines-string", // jingwen@, cc_library_static, OK for bp2build but b/186615213 (asflags not handled in  bp2build), version script assignment of 'LIBC' to symbol 'memcmp' failed: symbol not defined (also for memrchr, strnlen)
		"fmtlib_ndk",                       // http://b/187040371, cc_library_static, OK for bp2build but format-inl.h:11:10: fatal error: 'cassert' file not found for mixed builds
		"libc_nomalloc",                    // cc_library_static, OK for bp2build but ld.lld: error: undefined symbol: pthread_mutex_lock (and others)
		"libc_common_shared", // cparsons@ cc_library_static, version script assignment of 'LIBC' to symbol '__cxa_atexit' failed: symbol not defined
	}

	// Used for quicker lookups
+48 −0
Original line number Diff line number Diff line
@@ -137,6 +137,54 @@ func SubtractStrings(haystack []string, needle []string) []string {
	return strings
}

// Return all needles in a given haystack, where needleFn is true for needles.
func FilterLabelList(haystack LabelList, needleFn func(string) bool) LabelList {
	var includes []Label

	for _, inc := range haystack.Includes {
		if needleFn(inc.Label) {
			includes = append(includes, inc)
		}
	}
	return LabelList{Includes: includes, Excludes: haystack.Excludes}
}

// Return all needles in a given haystack, where needleFn is true for needles.
func FilterLabelListAttribute(haystack LabelListAttribute, needleFn func(string) bool) LabelListAttribute {
	var result LabelListAttribute

	result.Value = FilterLabelList(haystack.Value, needleFn)

	for arch := range PlatformArchMap {
		result.SetValueForArch(arch, FilterLabelList(haystack.GetValueForArch(arch), needleFn))
	}

	for os := range PlatformOsMap {
		result.SetValueForOS(os, FilterLabelList(haystack.GetValueForOS(os), needleFn))
	}

	return result
}

// Subtract needle from haystack
func SubtractBazelLabelListAttribute(haystack LabelListAttribute, needle LabelListAttribute) LabelListAttribute {
	var result LabelListAttribute

	for arch := range PlatformArchMap {
		result.SetValueForArch(arch,
			SubtractBazelLabelList(haystack.GetValueForArch(arch), needle.GetValueForArch(arch)))
	}

	for os := range PlatformOsMap {
		result.SetValueForOS(os,
			SubtractBazelLabelList(haystack.GetValueForOS(os), needle.GetValueForOS(os)))
	}

	result.Value = SubtractBazelLabelList(haystack.Value, needle.Value)

	return result
}

// Subtract needle from haystack
func SubtractBazelLabels(haystack []Label, needle []Label) []Label {
	// This is really a set
+6 −4
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ cc_library {
        "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
        "//conditions:default": [],
    }),
    srcs = ["math/cosf.c"],
    srcs_c = ["math/cosf.c"],
)`},
	})
}
@@ -620,7 +620,7 @@ cc_library {

func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
	runCcLibraryTestCase(t, bp2buildTestCase{
		description:                        "cc_library cppflags goes into copts",
		description:                        "cc_library cppflags usage",
		moduleTypeUnderTest:                "cc_library",
		moduleTypeUnderTestFactory:         cc.LibraryFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
@@ -656,10 +656,12 @@ func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
    name = "a",
    copts = [
        "-Wall",
        "-fsigned-char",
        "-pedantic",
        "-Ifoo/bar",
        "-I$(BINDIR)/foo/bar",
    ],
    cppflags = [
        "-fsigned-char",
        "-pedantic",
    ] + select({
        "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
        "//conditions:default": [],
+21 −21
Original line number Diff line number Diff line
@@ -651,7 +651,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = [
    srcs_c = [
        "common.c",
        "foo-a.c",
    ],
@@ -683,7 +683,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": ["foo-arm.c"],
        "//conditions:default": [],
    }),
@@ -720,7 +720,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": ["for-arm.c"],
        "//conditions:default": ["not-for-arm.c"],
    }),
@@ -759,7 +759,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": [
            "for-arm.c",
            "not-for-x86.c",
@@ -814,7 +814,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": [
            "for-arm.c",
            "not-for-arm64.c",
@@ -910,7 +910,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": ["for-lib32.c"],
        "//build/bazel/platforms/arch:x86": ["for-lib32.c"],
        "//conditions:default": ["not-for-lib32.c"],
@@ -949,7 +949,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": [
            "for-lib32.c",
            "not-for-lib64.c",
@@ -1021,7 +1021,7 @@ cc_library_static {
        "-I$(BINDIR)/.",
    ],
    linkstatic = True,
    srcs = ["common.c"] + select({
    srcs_c = ["common.c"] + select({
        "//build/bazel/platforms/arch:arm": [
            "for-arm.c",
            "for-lib32.c",
@@ -1075,10 +1075,10 @@ func TestCcLibraryStaticArchSrcsExcludeSrcsGeneratedFiles(t *testing.T) {
		moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
		depsMutators:                       []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
		filesystem: map[string]string{
			"common.c":             "",
			"for-x86.c":            "",
			"not-for-x86.c":        "",
			"not-for-everything.c": "",
			"common.cpp":             "",
			"for-x86.cpp":            "",
			"not-for-x86.cpp":        "",
			"not-for-everything.cpp": "",
			"dep/Android.bp": `
genrule {
	name: "generated_src_other_pkg",
@@ -1119,14 +1119,14 @@ genrule {

cc_library_static {
   name: "foo_static3",
   srcs: ["common.c", "not-for-*.c"],
   exclude_srcs: ["not-for-everything.c"],
   srcs: ["common.cpp", "not-for-*.cpp"],
   exclude_srcs: ["not-for-everything.cpp"],
   generated_sources: ["generated_src", "generated_src_other_pkg"],
   generated_headers: ["generated_hdr", "generated_hdr_other_pkg"],
   arch: {
       x86: {
           srcs: ["for-x86.c"],
           exclude_srcs: ["not-for-x86.c"],
           srcs: ["for-x86.cpp"],
           exclude_srcs: ["not-for-x86.cpp"],
           generated_sources: ["generated_src_x86"],
           generated_headers: ["generated_hdr_other_pkg_x86"],
       },
@@ -1145,14 +1145,14 @@ cc_library_static {
        "//dep:generated_src_other_pkg",
        ":generated_hdr",
        ":generated_src",
        "common.c",
        "common.cpp",
    ] + select({
        "//build/bazel/platforms/arch:x86": [
            "//dep:generated_hdr_other_pkg_x86",
            ":generated_src_x86",
            "for-x86.c",
            "for-x86.cpp",
        ],
        "//conditions:default": ["not-for-x86.c"],
        "//conditions:default": ["not-for-x86.cpp"],
    }),
)`},
	})
@@ -1198,7 +1198,7 @@ cc_library_static {
        "//conditions:default": [],
    }),
    linkstatic = True,
    srcs = ["common.c"],
    srcs_c = ["common.c"],
)`},
	})
}
@@ -1270,7 +1270,7 @@ cc_library_static {
        "//conditions:default": [],
    }),
    linkstatic = True,
    srcs = ["common.c"],
    srcs_c = ["common.c"],
)`},
	})
}
+54 −9
Original line number Diff line number Diff line
@@ -161,15 +161,26 @@ func bp2buildParseStaticOrSharedProps(ctx android.TopDownMutatorContext, props S

// Convenience struct to hold all attributes parsed from compiler properties.
type compilerAttributes struct {
	// Options for all languages
	copts bazel.StringListAttribute
	// Assembly options and sources
	asFlags bazel.StringListAttribute
	asSrcs  bazel.LabelListAttribute
	// C options and sources
	conlyFlags bazel.StringListAttribute
	cSrcs      bazel.LabelListAttribute
	// C++ options and sources
	cppFlags bazel.StringListAttribute
	srcs     bazel.LabelListAttribute
	includes bazel.StringListAttribute
}

// bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes.
func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes {
	var srcs bazel.LabelListAttribute
	var copts bazel.StringListAttribute
	var asFlags bazel.StringListAttribute
	var conlyFlags bazel.StringListAttribute
	var cppFlags bazel.StringListAttribute

	// Creates the -I flags for a directory, while making the directory relative
	// to the exec root for Bazel to work.
@@ -193,15 +204,21 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
		return append(includeDirs, baseCompilerProps.Local_include_dirs...)
	}

	// Parse the list of copts.
	parseCopts := func(baseCompilerProps *BaseCompilerProperties) []string {
		var copts []string
		for _, flag := range append(baseCompilerProps.Cflags, baseCompilerProps.Cppflags...) {
	parseCommandLineFlags := func(soongFlags []string) []string {
		var result []string
		for _, flag := range soongFlags {
			// Soong's cflags can contain spaces, like `-include header.h`. For
			// Bazel's copts, split them up to be compatible with the
			// no_copts_tokenization feature.
			copts = append(copts, strings.Split(flag, " ")...)
			result = append(result, strings.Split(flag, " ")...)
		}
		return result
	}

	// Parse the list of copts.
	parseCopts := func(baseCompilerProps *BaseCompilerProperties) []string {
		var copts []string
		copts = append(copts, parseCommandLineFlags(baseCompilerProps.Cflags)...)
		for _, dir := range parseLocalIncludeDirs(baseCompilerProps) {
			copts = append(copts, includeFlags(dir)...)
		}
@@ -238,6 +255,9 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
		if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
			srcs.Value = parseSrcs(baseCompilerProps)
			copts.Value = parseCopts(baseCompilerProps)
			asFlags.Value = parseCommandLineFlags(baseCompilerProps.Asflags)
			conlyFlags.Value = parseCommandLineFlags(baseCompilerProps.Conlyflags)
			cppFlags.Value = parseCommandLineFlags(baseCompilerProps.Cppflags)

			// Used for arch-specific srcs later.
			baseSrcs = baseCompilerProps.Srcs
@@ -268,6 +288,9 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
			}

			copts.SetValueForArch(arch.Name, parseCopts(baseCompilerProps))
			asFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Asflags))
			conlyFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Conlyflags))
			cppFlags.SetValueForArch(arch.Name, parseCommandLineFlags(baseCompilerProps.Cppflags))
		}
	}

@@ -293,6 +316,9 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
			// TODO(b/186153868): add support for os-specific srcs and exclude_srcs
			srcs.SetValueForOS(os.Name, bazel.SubtractBazelLabelList(srcsList, baseSrcsLabelList))
			copts.SetValueForOS(os.Name, parseCopts(baseCompilerProps))
			asFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Asflags))
			conlyFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Conlyflags))
			cppFlags.SetValueForOS(os.Name, parseCommandLineFlags(baseCompilerProps.Cppflags))
		}
	}

@@ -311,9 +337,28 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
		}
	}

	// Branch srcs into three language-specific groups.
	// C++ is the "catch-all" group, and comprises generated sources because we don't
	// know the language of these sources until the genrule is executed.
	// TODO(b/): Handle language detection of sources in a Bazel rule.
	isCSrc := func(s string) bool {
		return strings.HasSuffix(s, ".c")
	}
	isAsmSrc := func(s string) bool {
		return strings.HasSuffix(s, ".S") || strings.HasSuffix(s, ".s")
	}
	cSrcs := bazel.FilterLabelListAttribute(srcs, isCSrc)
	asSrcs := bazel.FilterLabelListAttribute(srcs, isAsmSrc)
	srcs = bazel.SubtractBazelLabelListAttribute(srcs, cSrcs)
	srcs = bazel.SubtractBazelLabelListAttribute(srcs, asSrcs)
	return compilerAttributes{
		srcs:  srcs,
		copts:      copts,
		srcs:       srcs,
		asFlags:    asFlags,
		asSrcs:     asSrcs,
		cSrcs:      cSrcs,
		conlyFlags: conlyFlags,
		cppFlags:   cppFlags,
	}
}

Loading