From e266787aed74a6b2f3368f9eee4d263386074c9f Mon Sep 17 00:00:00 2001 From: Alix Date: Mon, 24 Apr 2023 14:57:32 +0000 Subject: [PATCH] bp2build conversion for rscript srcs in cc modules Bazel does not support using .rscrip/.fs files as cc srcs. For a module foo with foo srcs, Bp2build will create a bazel target of rule class rscript_to_cpp with name foo_renderscript which will have only the renderscript files as srcs. Bp2build will also create a target foo with the expected cc rule class. The foo target will have all other src files as srcs and will also have the target foo_renderscript as another src. Bug: 210509914 Test: bp2build testing & b build target rstest-latency Change-Id: Ifdc55051a3595f5fcf54eab8b59e11e9351e141c --- android/allowlists/allowlists.go | 8 +++++ bp2build/cc_binary_conversion_test.go | 32 +++++++++++++++++ bp2build/cc_library_shared_conversion_test.go | 30 ++++++++++++++++ bp2build/cc_library_static_conversion_test.go | 30 ++++++++++++++++ cc/bp2build.go | 24 ++++++++++--- cc/config/global.go | 11 +++--- cc/rs.go | 35 ++++++++++++++++++- 7 files changed, 159 insertions(+), 11 deletions(-) diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 34a6860e9..aff74067d 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -131,6 +131,7 @@ var ( "external/brotli": Bp2BuildDefaultTrue, "external/bsdiff": Bp2BuildDefaultTrueRecursively, "external/bzip2": Bp2BuildDefaultTrueRecursively, + "external/clang/lib": Bp2BuildDefaultTrue, "external/conscrypt": Bp2BuildDefaultTrue, "external/e2fsprogs": Bp2BuildDefaultTrueRecursively, "external/eigen": Bp2BuildDefaultTrueRecursively, @@ -796,6 +797,13 @@ var ( // for platform_compat_config "process-compat-config", + + // cc_* modules with rscript srcs + "rstest-latency", + "libRScpp_static", + "rs-headers", + "rs_script_api", + "libRSDispatch", } Bp2buildModuleTypeAlwaysConvertList = []string{ diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go index ab6e4a558..18cb9e116 100644 --- a/bp2build/cc_binary_conversion_test.go +++ b/bp2build/cc_binary_conversion_test.go @@ -1182,3 +1182,35 @@ cc_binary { }, }) } + +func TestCCBinaryRscriptSrc(t *testing.T) { + runCcBinaryTests(t, ccBinaryBp2buildTestCase{ + description: `cc_binary with rscript files in sources`, + blueprint: ` +{rule_name} { + name : "foo", + srcs : [ + "ccSrc.cc", + "rsSrc.rscript", + ], + include_build_directory: false, +} +`, + targets: []testBazelTarget{ + {"rscript_to_cpp", "foo_renderscript", AttrNameToString{ + "srcs": `["rsSrc.rscript"]`, + }}, + {"cc_binary", "foo", AttrNameToString{ + "absolute_includes": `[ + "frameworks/rs", + "frameworks/rs/cpp", + ]`, + "local_includes": `["."]`, + "srcs": `[ + "ccSrc.cc", + "foo_renderscript", + ]`, + }}, + }, + }) +} diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go index a16cfb3d5..2d61d5355 100644 --- a/bp2build/cc_library_shared_conversion_test.go +++ b/bp2build/cc_library_shared_conversion_test.go @@ -1555,3 +1555,33 @@ cc_library_shared { }, }) } + +func TestCCLibrarySharedRscriptSrc(t *testing.T) { + runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Description: ``, + Blueprint: ` +cc_library_shared{ + name : "foo", + srcs : [ + "ccSrc.cc", + "rsSrc.rscript", + ], + include_build_directory: false, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("rscript_to_cpp", "foo_renderscript", AttrNameToString{ + "srcs": `["rsSrc.rscript"]`, + }), + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "absolute_includes": `[ + "frameworks/rs", + "frameworks/rs/cpp", + ]`, + "local_includes": `["."]`, + "srcs": `[ + "ccSrc.cc", + "foo_renderscript", + ]`, + })}}) +} diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index b473f279a..18225dfa2 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -2185,3 +2185,33 @@ cc_library_static { }, }) } + +func TestCCLibraryStaticRscriptSrc(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Description: `cc_library_static with rscript files in sources`, + Blueprint: ` +cc_library_static{ + name : "foo", + srcs : [ + "ccSrc.cc", + "rsSrc.rscript", + ], + include_build_directory: false, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("rscript_to_cpp", "foo_renderscript", AttrNameToString{ + "srcs": `["rsSrc.rscript"]`, + }), + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "absolute_includes": `[ + "frameworks/rs", + "frameworks/rs/cpp", + ]`, + "local_includes": `["."]`, + "srcs": `[ + "ccSrc.cc", + "foo_renderscript", + ]`, + })}}) +} diff --git a/cc/bp2build.go b/cc/bp2build.go index d09cdcd3f..1c5b832ea 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -38,7 +38,10 @@ const ( protoSrcPartition = "proto" aidlSrcPartition = "aidl" syspropSrcPartition = "sysprop" - yaccSrcPartition = "yacc" + + yaccSrcPartition = "yacc" + + rScriptSrcPartition = "renderScript" stubsSuffix = "_stub_libs_current" ) @@ -149,8 +152,9 @@ func groupSrcsByExtension(ctx android.BazelConversionPathContext, srcs bazel.Lab // 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"}}, + lSrcPartition: bazel.LabelPartition{Extensions: []string{".l"}}, + llSrcPartition: bazel.LabelPartition{Extensions: []string{".ll"}}, + rScriptSrcPartition: bazel.LabelPartition{Extensions: []string{".fs", ".rscript"}}, // 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}, @@ -412,6 +416,8 @@ type compilerAttributes struct { yaccGenLocationHeader bazel.BoolAttribute yaccGenPositionHeader bazel.BoolAttribute + rsSrcs bazel.LabelListAttribute + hdrs bazel.LabelListAttribute rtti bazel.BoolAttribute @@ -426,8 +432,9 @@ type compilerAttributes struct { includes BazelIncludes - protoSrcs bazel.LabelListAttribute - aidlSrcs bazel.LabelListAttribute + protoSrcs bazel.LabelListAttribute + aidlSrcs bazel.LabelListAttribute + rscriptSrcs bazel.LabelListAttribute stubsSymbolFile *string stubsVersions bazel.StringListAttribute @@ -582,6 +589,7 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i ca.yaccSrc = bazel.MakeLabelAttribute(yacc.Value.Includes[0].Label) } ca.syspropSrcs = partitionedSrcs[syspropSrcPartition] + ca.rscriptSrcs = partitionedSrcs[rScriptSrcPartition] ca.absoluteIncludes.DeduplicateAxesFromBase() ca.localIncludes.DeduplicateAxesFromBase() @@ -903,6 +911,12 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) compilerAttrs.absoluteIncludes.Prepend = true compilerAttrs.hdrs.Prepend = true + convertedRsSrcs, rsAbsIncludes, rsLocalIncludes := bp2buildRScript(ctx, module, compilerAttrs) + (&compilerAttrs).srcs.Add(&convertedRsSrcs) + (&compilerAttrs).absoluteIncludes.Append(rsAbsIncludes) + (&compilerAttrs).localIncludes.Append(rsLocalIncludes) + (&compilerAttrs).localIncludes.Value = android.FirstUniqueStrings(compilerAttrs.localIncludes.Value) + features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(bp2buildSanitizerFeatures(ctx, module)) features = features.Append(bp2buildLtoFeatures(ctx, module)) features = features.Append(convertHiddenVisibilityToFeatureBase(ctx, module)) diff --git a/cc/config/global.go b/cc/config/global.go index 8ff5f55d7..e450ba7ba 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -448,11 +448,12 @@ func init() { pctx.StaticVariable("RSLLVMPrebuiltsPath", "${RSClangBase}/${HostPrebuiltTag}/${RSClangVersion}/bin") pctx.StaticVariable("RSIncludePath", "${RSLLVMPrebuiltsPath}/../lib64/clang/${RSReleaseVersion}/include") - pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I", - []string{ - "external/clang/lib/Headers", - "frameworks/rs/script_api/include", - }) + rsGlobalIncludes := []string{ + "external/clang/lib/Headers", + "frameworks/rs/script_api/include", + } + pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I", rsGlobalIncludes) + exportedVars.ExportStringList("RsGlobalIncludes", rsGlobalIncludes) pctx.VariableFunc("CcWrapper", func(ctx android.PackageVarContext) string { if override := ctx.Config().Getenv("CC_WRAPPER"); override != "" { diff --git a/cc/rs.go b/cc/rs.go index fbc86e2a0..65072591f 100644 --- a/cc/rs.go +++ b/cc/rs.go @@ -15,11 +15,12 @@ package cc import ( - "android/soong/android" "path/filepath" "runtime" "strings" + "android/soong/android" + "android/soong/bazel" "github.com/google/blueprint" ) @@ -132,3 +133,35 @@ func rsFlags(ctx ModuleContext, flags Flags, properties *BaseCompilerProperties) return flags } + +type rscriptAttributes struct { + // Renderscript source files + Srcs bazel.LabelListAttribute +} + +func bp2buildRScript(ctx android.Bp2buildMutatorContext, m *Module, ca compilerAttributes) (bazel.LabelAttribute, bazel.StringListAttribute, bazel.StringListAttribute) { + var rscriptAttrs rscriptAttributes + var rsAbsIncludes bazel.StringListAttribute + var localIncludes bazel.StringListAttribute + var rsModuleName string + var convertedRsSrcsLabel bazel.LabelAttribute + + if !ca.rscriptSrcs.IsEmpty() { + rscriptAttrs.Srcs = ca.rscriptSrcs + rsModuleName = m.Name() + "_renderscript" + + localIncludes.Value = []string{"."} + rsAbsIncludes.Value = []string{"frameworks/rs", "frameworks/rs/cpp"} + convertedRsSrcsLabel = bazel.LabelAttribute{Value: &bazel.Label{Label: rsModuleName}} + + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{ + Rule_class: "rscript_to_cpp", + Bzl_load_location: "//build/bazel/rules/cc:rscript_to_cpp.bzl", + }, + android.CommonAttributes{Name: rsModuleName}, + &rscriptAttrs) + } + + return convertedRsSrcsLabel, rsAbsIncludes, localIncludes +}