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

Express no{,_lib}crt via features vs attrs

Given that we can map them directly to disabling the
corresponding Bazel features: `-{link_,use_lib}crt`

Test: Existing (adapted) Unit Tests
Test: bp2build.sh
Change-Id: Ib502f6fb929ace8e86a1001e3cc21f399317500c
parent 92ac6595
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -365,7 +365,7 @@ func TestCcBinaryNocrtTests(t *testing.T) {
		{
		{
			description:   "nocrt: true",
			description:   "nocrt: true",
			soongProperty: `nocrt: true,`,
			soongProperty: `nocrt: true,`,
			bazelAttr:     AttrNameToString{"link_crt": `False`},
			bazelAttr:     AttrNameToString{"features": `["-link_crt"]`},
		},
		},
		{
		{
			description:   "nocrt: false",
			description:   "nocrt: false",
@@ -408,12 +408,12 @@ func TestCcBinaryNo_libcrtTests(t *testing.T) {
		{
		{
			description:   "no_libcrt: true",
			description:   "no_libcrt: true",
			soongProperty: `no_libcrt: true,`,
			soongProperty: `no_libcrt: true,`,
			bazelAttr:     AttrNameToString{"use_libcrt": `False`},
			bazelAttr:     AttrNameToString{"features": `["-use_libcrt"]`},
		},
		},
		{
		{
			description:   "no_libcrt: false",
			description:   "no_libcrt: false",
			soongProperty: `no_libcrt: false,`,
			soongProperty: `no_libcrt: false,`,
			bazelAttr:     AttrNameToString{"use_libcrt": `True`},
			bazelAttr:     AttrNameToString{},
		},
		},
		{
		{
			description: "no_libcrt: not set",
			description: "no_libcrt: not set",
+28 −31
Original line number Original line Diff line number Diff line
@@ -1308,7 +1308,7 @@ cc_library {


func TestCCLibraryNoCrtTrue(t *testing.T) {
func TestCCLibraryNoCrtTrue(t *testing.T) {
	runCcLibraryTestCase(t, Bp2buildTestCase{
	runCcLibraryTestCase(t, Bp2buildTestCase{
		Description:                "cc_library - nocrt: true emits attribute",
		Description:                "cc_library - nocrt: true disables feature",
		ModuleTypeUnderTest:        "cc_library",
		ModuleTypeUnderTest:        "cc_library",
		ModuleTypeUnderTestFactory: cc.LibraryFactory,
		ModuleTypeUnderTestFactory: cc.LibraryFactory,
		Filesystem: map[string]string{
		Filesystem: map[string]string{
@@ -1323,7 +1323,7 @@ cc_library {
}
}
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"link_crt": `False`,
			"features": `["-link_crt"]`,
			"srcs":     `["impl.cpp"]`,
			"srcs":     `["impl.cpp"]`,
		}),
		}),
	},
	},
@@ -1375,7 +1375,13 @@ cc_library {
    include_build_directory: false,
    include_build_directory: false,
}
}
`,
`,
		ExpectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"features": `select({
        "//build/bazel/platforms/arch:arm": ["-link_crt"],
        "//conditions:default": [],
    })`,
			"srcs": `["impl.cpp"]`,
		}),
	})
	})
}
}


@@ -1395,8 +1401,8 @@ cc_library {
}
}
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"features": `["-use_libcrt"]`,
			"srcs":     `["impl.cpp"]`,
			"srcs":     `["impl.cpp"]`,
			"use_libcrt": `False`,
		}),
		}),
	})
	})
}
}
@@ -1446,7 +1452,6 @@ cc_library {
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"srcs": `["impl.cpp"]`,
			"srcs": `["impl.cpp"]`,
			"use_libcrt": `True`,
		}),
		}),
	})
	})
}
}
@@ -1475,10 +1480,10 @@ cc_library {
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"srcs": `["impl.cpp"]`,
			"srcs": `["impl.cpp"]`,
			"use_libcrt": `select({
			"features": `select({
        "//build/bazel/platforms/arch:arm": False,
        "//build/bazel/platforms/arch:arm": ["-use_libcrt"],
        "//build/bazel/platforms/arch:x86": False,
        "//build/bazel/platforms/arch:x86": ["-use_libcrt"],
        "//conditions:default": None,
        "//conditions:default": [],
    })`,
    })`,
		}),
		}),
	})
	})
@@ -1512,17 +1517,15 @@ cc_library {
}
}
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"srcs": `["impl.cpp"]`,
			"features": `select({
			"use_libcrt": `select({
        "//build/bazel/platforms/arch:arm": ["-use_libcrt"],
        "//build/bazel/platforms/os_arch:android_arm": False,
        "//build/bazel/platforms/arch:x86": ["-use_libcrt"],
        "//build/bazel/platforms/os_arch:android_x86": False,
        "//conditions:default": [],
        "//build/bazel/platforms/os_arch:darwin_arm64": False,
    }) + select({
        "//build/bazel/platforms/os_arch:darwin_x86_64": False,
        "//build/bazel/platforms/os:darwin": ["-use_libcrt"],
        "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
        "//conditions:default": [],
        "//build/bazel/platforms/os_arch:linux_musl_x86": False,
        "//build/bazel/platforms/os_arch:windows_x86": False,
        "//conditions:default": None,
    })`,
    })`,
			"srcs": `["impl.cpp"]`,
		}),
		}),
	})
	})
}
}
@@ -1557,16 +1560,10 @@ cc_library {
`,
`,
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
		ExpectedBazelTargets: makeCcLibraryTargets("foo-lib", AttrNameToString{
			"srcs": `["impl.cpp"]`,
			"srcs": `["impl.cpp"]`,
			"use_libcrt": `select({
			"features": `select({
        "//build/bazel/platforms/os_arch:android_arm": False,
        "//build/bazel/platforms/arch:arm": ["-use_libcrt"],
        "//build/bazel/platforms/os_arch:android_x86_64": False,
        "//build/bazel/platforms/arch:x86_64": ["-use_libcrt"],
        "//build/bazel/platforms/os_arch:darwin_arm64": True,
        "//conditions:default": [],
        "//build/bazel/platforms/os_arch:darwin_x86_64": False,
        "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
        "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
        "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
        "//build/bazel/platforms/os_arch:windows_x86_64": False,
        "//conditions:default": None,
    })`,
    })`,
		}),
		}),
	})
	})
+12 −5
Original line number Original line Diff line number Diff line
@@ -15,7 +15,6 @@
package bp2build
package bp2build


import (
import (
	"fmt"
	"testing"
	"testing"


	"android/soong/android"
	"android/soong/android"
@@ -405,7 +404,7 @@ cc_library_shared {


func TestCcLibrarySharedNoCrtTrue(t *testing.T) {
func TestCcLibrarySharedNoCrtTrue(t *testing.T) {
	runCcLibrarySharedTestCase(t, Bp2buildTestCase{
	runCcLibrarySharedTestCase(t, Bp2buildTestCase{
		Description: "cc_library_shared - nocrt: true emits attribute",
		Description: "cc_library_shared - nocrt: true disables feature",
		Filesystem: map[string]string{
		Filesystem: map[string]string{
			"impl.cpp": "",
			"impl.cpp": "",
		},
		},
@@ -419,7 +418,7 @@ cc_library_shared {
`,
`,
		ExpectedBazelTargets: []string{
		ExpectedBazelTargets: []string{
			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
				"link_crt": `False`,
				"features": `["-link_crt"]`,
				"srcs":     `["impl.cpp"]`,
				"srcs":     `["impl.cpp"]`,
			}),
			}),
		},
		},
@@ -428,7 +427,7 @@ cc_library_shared {


func TestCcLibrarySharedNoCrtFalse(t *testing.T) {
func TestCcLibrarySharedNoCrtFalse(t *testing.T) {
	runCcLibrarySharedTestCase(t, Bp2buildTestCase{
	runCcLibrarySharedTestCase(t, Bp2buildTestCase{
		Description: "cc_library_shared - nocrt: false doesn't emit attribute",
		Description: "cc_library_shared - nocrt: false doesn't disable feature",
		Filesystem: map[string]string{
		Filesystem: map[string]string{
			"impl.cpp": "",
			"impl.cpp": "",
		},
		},
@@ -469,7 +468,15 @@ cc_library_shared {
    include_build_directory: false,
    include_build_directory: false,
}
}
`,
`,
		ExpectedErr: fmt.Errorf("module \"foo_shared\": nocrt is not supported for arch variants"),
		ExpectedBazelTargets: []string{
			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
				"features": `select({
        "//build/bazel/platforms/arch:arm": ["-link_crt"],
        "//conditions:default": [],
    })`,
				"srcs": `["impl.cpp"]`,
			}),
		},
	})
	})
}
}


+2 −7
Original line number Original line Diff line number Diff line
@@ -151,7 +151,7 @@ func (binary *binaryDecorator) getStem(ctx BaseModuleContext) string {
// modules common to most binaries, such as bionic libraries.
// modules common to most binaries, such as bionic libraries.
func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
func (binary *binaryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
	deps = binary.baseLinker.linkerDeps(ctx, deps)
	deps = binary.baseLinker.linkerDeps(ctx, deps)
	if !Bool(binary.baseLinker.Properties.Nocrt) {
	if binary.baseLinker.Properties.crt() {
		if binary.static() {
		if binary.static() {
			deps.CrtBegin = ctx.toolchain().CrtBeginStaticBinary()
			deps.CrtBegin = ctx.toolchain().CrtBeginStaticBinary()
			deps.CrtEnd = ctx.toolchain().CrtEndStaticBinary()
			deps.CrtEnd = ctx.toolchain().CrtEndStaticBinary()
@@ -630,8 +630,6 @@ func binaryBp2buildAttrs(ctx android.TopDownMutatorContext, m *Module) binaryAtt
		Local_includes:    baseAttrs.localIncludes,
		Local_includes:    baseAttrs.localIncludes,
		Absolute_includes: baseAttrs.absoluteIncludes,
		Absolute_includes: baseAttrs.absoluteIncludes,
		Linkopts:          baseAttrs.linkopts,
		Linkopts:          baseAttrs.linkopts,
		Link_crt:          baseAttrs.linkCrt,
		Use_libcrt:        baseAttrs.useLibcrt,
		Use_version_lib:   baseAttrs.useVersionLib,
		Use_version_lib:   baseAttrs.useVersionLib,
		Rtti:              baseAttrs.rtti,
		Rtti:              baseAttrs.rtti,
		Stl:               baseAttrs.stl,
		Stl:               baseAttrs.stl,
@@ -695,9 +693,6 @@ type binaryAttributes struct {


	Linkopts                 bazel.StringListAttribute
	Linkopts                 bazel.StringListAttribute
	Additional_linker_inputs bazel.LabelListAttribute
	Additional_linker_inputs bazel.LabelListAttribute

	Link_crt        bazel.BoolAttribute
	Use_libcrt      bazel.BoolAttribute
	Use_version_lib          bazel.BoolAttribute
	Use_version_lib          bazel.BoolAttribute


	Rtti    bazel.BoolAttribute
	Rtti    bazel.BoolAttribute
+7 −12
Original line number Original line Diff line number Diff line
@@ -965,8 +965,6 @@ type linkerAttributes struct {
	systemDynamicDeps                bazel.LabelListAttribute
	systemDynamicDeps                bazel.LabelListAttribute
	usedSystemDynamicDepAsDynamicDep map[string]bool
	usedSystemDynamicDepAsDynamicDep map[string]bool


	linkCrt                       bazel.BoolAttribute
	useLibcrt                     bazel.BoolAttribute
	useVersionLib                 bazel.BoolAttribute
	useVersionLib                 bazel.BoolAttribute
	linkopts                      bazel.StringListAttribute
	linkopts                      bazel.StringListAttribute
	additionalLinkerInputs        bazel.LabelListAttribute
	additionalLinkerInputs        bazel.LabelListAttribute
@@ -1138,6 +1136,13 @@ func (la *linkerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversion
		}
		}
	}
	}


	if !props.libCrt() {
		axisFeatures = append(axisFeatures, "-use_libcrt")
	}
	if !props.crt() {
		axisFeatures = append(axisFeatures, "-link_crt")
	}

	// This must happen before the addition of flags for Version Script and
	// This must happen before the addition of flags for Version Script and
	// Dynamic List, as these flags must be split on spaces and those must not
	// Dynamic List, as these flags must be split on spaces and those must not
	linkerFlags = parseCommandLineFlags(linkerFlags, filterOutClangUnknownCflags)
	linkerFlags = parseCommandLineFlags(linkerFlags, filterOutClangUnknownCflags)
@@ -1157,16 +1162,6 @@ func (la *linkerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversion


	la.additionalLinkerInputs.SetSelectValue(axis, config, additionalLinkerInputs)
	la.additionalLinkerInputs.SetSelectValue(axis, config, additionalLinkerInputs)
	la.linkopts.SetSelectValue(axis, config, linkerFlags)
	la.linkopts.SetSelectValue(axis, config, linkerFlags)
	la.useLibcrt.SetSelectValue(axis, config, props.libCrt())

	// it's very unlikely for nocrt to be arch variant, so bp2build doesn't support it.
	if props.crt() != nil {
		if axis == bazel.NoConfigAxis {
			la.linkCrt.SetSelectValue(axis, config, props.crt())
		} else if axis == bazel.ArchConfigurationAxis {
			ctx.ModuleErrorf("nocrt is not supported for arch variants")
		}
	}


	if axisFeatures != nil {
	if axisFeatures != nil {
		la.features.SetSelectValue(axis, config, axisFeatures)
		la.features.SetSelectValue(axis, config, axisFeatures)
Loading