Merge "Generate genlex rules from bp2build for cc targets" am: 5731d0fffd

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2092784

Change-Id: I3d5ac491b377fb5da09f4e5a73c93779df210914
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Trevor Radcliffe 2022-05-25 20:07:02 +00:00 committed by Automerger Merge Worker
commit c68fbc38e7
8 changed files with 260 additions and 13 deletions

View file

@ -310,7 +310,6 @@ var (
Bp2buildModuleDoNotConvertList = []string{
// cc bugs
"libsepol", // TODO(b/207408632): Unsupported case of .l sources in cc library rules
"libactivitymanager_aidl", // TODO(b/207426160): Unsupported use of aidl sources (via Dactivity_manager_procstate_aidl) in a cc_library
"gen-kotlin-build-file.py", // TODO(b/198619163) module has same name as source
"libgtest_ndk_c++", "libgtest_main_ndk_c++", // TODO(b/201816222): Requires sdk_version support.
@ -363,15 +362,14 @@ var (
"libtombstoned_client_rust_bridge_code", "libtombstoned_client_wrapper", // rust conversions are not supported
// unconverted deps
"CarHTMLViewer", // depends on unconverted modules android.car-stubs, car-ui-lib
"abb", // depends on unconverted modules: libcmd, libbinder
"adb", // depends on unconverted modules: AdbWinApi, libandroidfw, libopenscreen-discovery, libopenscreen-platform-impl, libusb, bin2c_fastdeployagent, AdbWinUsbApi
"android_icu4j_srcgen", // depends on unconverted modules: currysrc
"android_icu4j_srcgen_binary", // depends on unconverted modules: android_icu4j_srcgen, currysrc
"apex_manifest_proto_java", // b/210751803, depends on libprotobuf-java-full
"art-script", // depends on unconverted modules: dalvikvm, dex2oat
"bin2c_fastdeployagent", // depends on unconverted modules: deployagent
"chkcon", "sefcontext_compile", // depends on unconverted modules: libsepol
"CarHTMLViewer", // depends on unconverted modules android.car-stubs, car-ui-lib
"abb", // depends on unconverted modules: libcmd, libbinder
"adb", // depends on unconverted modules: AdbWinApi, libandroidfw, libopenscreen-discovery, libopenscreen-platform-impl, libusb, bin2c_fastdeployagent, AdbWinUsbApi
"android_icu4j_srcgen", // depends on unconverted modules: currysrc
"android_icu4j_srcgen_binary", // depends on unconverted modules: android_icu4j_srcgen, currysrc
"apex_manifest_proto_java", // b/210751803, depends on libprotobuf-java-full
"art-script", // depends on unconverted modules: dalvikvm, dex2oat
"bin2c_fastdeployagent", // depends on unconverted modules: deployagent
"com.android.runtime", // depends on unconverted modules: bionic-linker-config, linkerconfig
"conv_linker_config", // depends on unconverted modules: linker_config_proto
"currysrc", // depends on unconverted modules: currysrc_org.eclipse, guavalib, jopt-simple-4.9

View file

@ -628,7 +628,7 @@ func addCommandForPyBinaryRunfilesDir(oldCommand string, zipperCommandPath, zipF
}
func isSymlinkAction(a action) bool {
return a.Mnemonic == "Symlink" || a.Mnemonic == "SolibSymlink"
return a.Mnemonic == "Symlink" || a.Mnemonic == "SolibSymlink" || a.Mnemonic == "ExecutableSymlink"
}
func isTemplateExpandAction(a action) bool {

View file

@ -86,7 +86,7 @@ func runCcHostBinaryTestCase(t *testing.T, tc ccBinaryBp2buildTestCase) {
testCase := tc
for i, tar := range testCase.targets {
switch tar.typ {
case "cc_binary", "proto_library", "cc_lite_proto_library":
case "cc_binary", "proto_library", "cc_lite_proto_library", "genlex":
tar.attrs["target_compatible_with"] = `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
@ -505,3 +505,49 @@ func TestCcBinaryStaticProto(t *testing.T) {
},
})
}
func TestCcBinaryConvertLex(t *testing.T) {
runCcBinaryTests(t, ccBinaryBp2buildTestCase{
description: `.l and .ll sources converted to .c and .cc`,
blueprint: `
{rule_name} {
name: "foo",
srcs: ["foo.c", "bar.cc", "foo1.l", "foo2.l", "bar1.ll", "bar2.ll"],
lex: { flags: ["--foo_opt", "--bar_opt"] },
include_build_directory: false,
}
`,
targets: []testBazelTarget{
{"genlex", "foo_genlex_l", attrNameToString{
"srcs": `[
"foo1.l",
"foo2.l",
]`,
"lexopts": `[
"--foo_opt",
"--bar_opt",
]`,
}},
{"genlex", "foo_genlex_ll", attrNameToString{
"srcs": `[
"bar1.ll",
"bar2.ll",
]`,
"lexopts": `[
"--foo_opt",
"--bar_opt",
]`,
}},
{"cc_binary", "foo", attrNameToString{
"srcs": `[
"bar.cc",
":foo_genlex_ll",
]`,
"srcs_c": `[
"foo.c",
":foo_genlex_l",
]`,
}},
},
})
}

View file

@ -2457,3 +2457,51 @@ func TestCcLibraryEscapeLdflags(t *testing.T) {
}),
})
}
func TestCcLibraryConvertLex(t *testing.T) {
runCcLibraryTestCase(t, bp2buildTestCase{
moduleTypeUnderTest: "cc_library",
moduleTypeUnderTestFactory: cc.LibraryFactory,
filesystem: map[string]string{
"foo.c": "",
"bar.cc": "",
"foo1.l": "",
"bar1.ll": "",
"foo2.l": "",
"bar2.ll": "",
},
blueprint: `cc_library {
name: "foo_lib",
srcs: ["foo.c", "bar.cc", "foo1.l", "foo2.l", "bar1.ll", "bar2.ll"],
lex: { flags: ["--foo_flags"] },
include_build_directory: false,
bazel_module: { bp2build_available: true },
}`,
expectedBazelTargets: append([]string{
makeBazelTarget("genlex", "foo_lib_genlex_l", attrNameToString{
"srcs": `[
"foo1.l",
"foo2.l",
]`,
"lexopts": `["--foo_flags"]`,
}),
makeBazelTarget("genlex", "foo_lib_genlex_ll", attrNameToString{
"srcs": `[
"bar1.ll",
"bar2.ll",
]`,
"lexopts": `["--foo_flags"]`,
}),
},
makeCcLibraryTargets("foo_lib", attrNameToString{
"srcs": `[
"bar.cc",
":foo_lib_genlex_ll",
]`,
"srcs_c": `[
"foo.c",
":foo_lib_genlex_l",
]`,
})...),
})
}

View file

@ -520,3 +520,52 @@ cc_library_shared {
})},
})
}
func TestCcLibrarySharedConvertLex(t *testing.T) {
runCcLibrarySharedTestCase(t, bp2buildTestCase{
description: "cc_library_shared with lex files",
moduleTypeUnderTest: "cc_library_shared",
moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
filesystem: map[string]string{
"foo.c": "",
"bar.cc": "",
"foo1.l": "",
"bar1.ll": "",
"foo2.l": "",
"bar2.ll": "",
},
blueprint: `cc_library_shared {
name: "foo_lib",
srcs: ["foo.c", "bar.cc", "foo1.l", "foo2.l", "bar1.ll", "bar2.ll"],
lex: { flags: ["--foo_flags"] },
include_build_directory: false,
bazel_module: { bp2build_available: true },
}`,
expectedBazelTargets: []string{
makeBazelTarget("genlex", "foo_lib_genlex_l", attrNameToString{
"srcs": `[
"foo1.l",
"foo2.l",
]`,
"lexopts": `["--foo_flags"]`,
}),
makeBazelTarget("genlex", "foo_lib_genlex_ll", attrNameToString{
"srcs": `[
"bar1.ll",
"bar2.ll",
]`,
"lexopts": `["--foo_flags"]`,
}),
makeBazelTarget("cc_library_shared", "foo_lib", attrNameToString{
"srcs": `[
"bar.cc",
":foo_lib_genlex_ll",
]`,
"srcs_c": `[
"foo.c",
":foo_lib_genlex_l",
]`,
}),
},
})
}

View file

@ -96,3 +96,52 @@ cc_prebuilt_library_static {
expectedErr: fmt.Errorf("Expected at most one source file"),
})
}
func TestCcLibraryStaticConvertLex(t *testing.T) {
runCcLibrarySharedTestCase(t, bp2buildTestCase{
description: "cc_library_static with lex files",
moduleTypeUnderTest: "cc_library_static",
moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
filesystem: map[string]string{
"foo.c": "",
"bar.cc": "",
"foo1.l": "",
"bar1.ll": "",
"foo2.l": "",
"bar2.ll": "",
},
blueprint: `cc_library_static {
name: "foo_lib",
srcs: ["foo.c", "bar.cc", "foo1.l", "foo2.l", "bar1.ll", "bar2.ll"],
lex: { flags: ["--foo_flags"] },
include_build_directory: false,
bazel_module: { bp2build_available: true },
}`,
expectedBazelTargets: []string{
makeBazelTarget("genlex", "foo_lib_genlex_l", attrNameToString{
"srcs": `[
"foo1.l",
"foo2.l",
]`,
"lexopts": `["--foo_flags"]`,
}),
makeBazelTarget("genlex", "foo_lib_genlex_ll", attrNameToString{
"srcs": `[
"bar1.ll",
"bar2.ll",
]`,
"lexopts": `["--foo_flags"]`,
}),
makeBazelTarget("cc_library_static", "foo_lib", attrNameToString{
"srcs": `[
"bar.cc",
":foo_lib_genlex_ll",
]`,
"srcs_c": `[
"foo.c",
":foo_lib_genlex_l",
]`,
}),
},
})
}

View file

@ -29,6 +29,8 @@ import (
const (
cSrcPartition = "c"
asSrcPartition = "as"
lSrcPartition = "l"
llSrcPartition = "ll"
cppSrcPartition = "cpp"
protoSrcPartition = "proto"
)
@ -76,6 +78,12 @@ func groupSrcsByExtension(ctx android.BazelConversionPathContext, srcs bazel.Lab
protoSrcPartition: android.ProtoSrcLabelPartition,
cSrcPartition: bazel.LabelPartition{Extensions: []string{".c"}, LabelMapper: addSuffixForFilegroup("_c_srcs")},
asSrcPartition: bazel.LabelPartition{Extensions: []string{".s", ".S"}, LabelMapper: addSuffixForFilegroup("_as_srcs")},
// TODO(http://b/231968910): If there is ever a filegroup target that
// contains .l or .ll files we will need to find a way to add a
// LabelMapper for these that identifies these filegroups and
// converts them appropriately
lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}},
llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}},
// 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.
cppSrcPartition: bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true},
@ -285,6 +293,11 @@ type compilerAttributes struct {
cppFlags bazel.StringListAttribute
srcs bazel.LabelListAttribute
// Lex sources and options
lSrcs bazel.LabelListAttribute
llSrcs bazel.LabelListAttribute
lexopts bazel.StringListAttribute
hdrs bazel.LabelListAttribute
rtti bazel.BoolAttribute
@ -407,6 +420,8 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i
ca.srcs = partitionedSrcs[cppSrcPartition]
ca.cSrcs = partitionedSrcs[cSrcPartition]
ca.asSrcs = partitionedSrcs[asSrcPartition]
ca.lSrcs = partitionedSrcs[lSrcPartition]
ca.llSrcs = partitionedSrcs[llSrcPartition]
ca.absoluteIncludes.DeduplicateAxesFromBase()
ca.localIncludes.DeduplicateAxesFromBase()
@ -515,7 +530,9 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
var allHdrs []string
if baseCompilerProps, ok := archVariantCompilerProps[axis][config].(*BaseCompilerProperties); ok {
allHdrs = baseCompilerProps.Generated_headers
if baseCompilerProps.Lex != nil {
compilerAttrs.lexopts.SetSelectValue(axis, config, baseCompilerProps.Lex.Flags)
}
(&compilerAttrs).bp2buildForAxisAndConfig(ctx, axis, config, baseCompilerProps)
}
@ -570,6 +587,10 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
(&linkerAttrs).wholeArchiveDeps.Add(protoDep.wholeStaticLib)
(&linkerAttrs).implementationWholeArchiveDeps.Add(protoDep.implementationWholeStaticLib)
convertedLSrcs := bp2BuildLex(ctx, module.Name(), compilerAttrs)
(&compilerAttrs).srcs.Add(&convertedLSrcs.srcName)
(&compilerAttrs).cSrcs.Add(&convertedLSrcs.cSrcName)
return baseAttributes{
compilerAttrs,
linkerAttrs,

View file

@ -18,6 +18,7 @@ import (
"path/filepath"
"strings"
"android/soong/bazel"
"github.com/google/blueprint"
"android/soong/android"
@ -169,6 +170,41 @@ func genLex(ctx android.ModuleContext, lexFile android.Path, outFile android.Mod
})
}
type LexAttrs struct {
Srcs bazel.LabelListAttribute
Lexopts bazel.StringListAttribute
}
type LexNames struct {
cSrcName bazel.LabelAttribute
srcName bazel.LabelAttribute
}
func bp2BuildLex(ctx android.Bp2buildMutatorContext, moduleName string, ca compilerAttributes) LexNames {
names := LexNames{}
if !ca.lSrcs.IsEmpty() {
names.cSrcName = createLexTargetModule(ctx, moduleName+"_genlex_l", ca.lSrcs, ca.lexopts)
}
if !ca.llSrcs.IsEmpty() {
names.srcName = createLexTargetModule(ctx, moduleName+"_genlex_ll", ca.llSrcs, ca.lexopts)
}
return names
}
func createLexTargetModule(ctx android.Bp2buildMutatorContext, name string, srcs bazel.LabelListAttribute, opts bazel.StringListAttribute) bazel.LabelAttribute {
ctx.CreateBazelTargetModule(
bazel.BazelTargetModuleProperties{
Rule_class: "genlex",
Bzl_load_location: "//build/bazel/rules/cc:flex.bzl",
},
android.CommonAttributes{Name: name},
&LexAttrs{
Srcs: srcs,
Lexopts: opts,
})
return bazel.LabelAttribute{Value: &bazel.Label{Label: ":" + name}}
}
func genSysprop(ctx android.ModuleContext, syspropFile android.Path) (android.Path, android.Paths) {
headerFile := android.PathForModuleGen(ctx, "sysprop", "include", syspropFile.Rel()+".h")
publicHeaderFile := android.PathForModuleGen(ctx, "sysprop/public", "include", syspropFile.Rel()+".h")