bp2build support for .asm files
Bug: 233948256 Test: ./build/bazel/ci/bp2build.sh Change-Id: I387c2aeb36df004f0e1838a08a4f28b38503d6ed
This commit is contained in:
@@ -132,6 +132,7 @@ var (
|
||||
"external/libevent": Bp2BuildDefaultTrueRecursively,
|
||||
"external/libgav1": Bp2BuildDefaultTrueRecursively,
|
||||
"external/libhevc": Bp2BuildDefaultTrueRecursively,
|
||||
"external/libjpeg-turbo": Bp2BuildDefaultTrueRecursively,
|
||||
"external/libmpeg2": Bp2BuildDefaultTrueRecursively,
|
||||
"external/libpng": Bp2BuildDefaultTrueRecursively,
|
||||
"external/lz4/lib": Bp2BuildDefaultTrue,
|
||||
@@ -263,6 +264,7 @@ var (
|
||||
"prebuilts/gcc":/* recursive = */ true,
|
||||
"prebuilts/build-tools":/* recursive = */ true,
|
||||
"prebuilts/jdk/jdk11":/* recursive = */ false,
|
||||
"prebuilts/misc":/* recursive = */ false, // not recursive because we need bp2build converted build files in prebuilts/misc/common/asm
|
||||
"prebuilts/sdk":/* recursive = */ false,
|
||||
"prebuilts/sdk/current/extras/app-toolkit":/* recursive = */ false,
|
||||
"prebuilts/sdk/current/support":/* recursive = */ false,
|
||||
@@ -378,15 +380,16 @@ var (
|
||||
"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.
|
||||
"linkerconfig", "mdnsd", // TODO(b/202876379): has arch-variant static_executable
|
||||
"linker", // TODO(b/228316882): cc_binary uses link_crt
|
||||
"libdebuggerd", // TODO(b/228314770): support product variable-specific header_libs
|
||||
"versioner", // TODO(b/228313961): depends on prebuilt shared library libclang-cpp_host as a shared library, which does not supply expected providers for a shared library
|
||||
"libspeexresampler", // TODO(b/231995978): Filter out unknown cflags
|
||||
"libjpeg", "libvpx", // TODO(b/233948256): Convert .asm files
|
||||
"linker", // TODO(b/228316882): cc_binary uses link_crt
|
||||
"libdebuggerd", // TODO(b/228314770): support product variable-specific header_libs
|
||||
"versioner", // TODO(b/228313961): depends on prebuilt shared library libclang-cpp_host as a shared library, which does not supply expected providers for a shared library
|
||||
"libspeexresampler", // TODO(b/231995978): Filter out unknown cflags
|
||||
"libvpx", // TODO(b/240756936): Arm neon variant not supported
|
||||
"art_libartbase_headers", // TODO(b/236268577): Header libraries do not support export_shared_libs_headers
|
||||
"apexer_test", // Requires aapt2
|
||||
"apexer_test_host_tools",
|
||||
"host_apex_verifier",
|
||||
"tjbench", // TODO(b/240563612): Stem property
|
||||
|
||||
// java bugs
|
||||
"libbase_ndk", // TODO(b/186826477): fails to link libctscamera2_jni for device (required for CtsCameraTestCases)
|
||||
|
179
bp2build/cc_yasm_conversion_test.go
Normal file
179
bp2build/cc_yasm_conversion_test.go
Normal file
@@ -0,0 +1,179 @@
|
||||
// Copyright 2022 Google Inc. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
package bp2build
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/cc"
|
||||
)
|
||||
|
||||
func runYasmTestCase(t *testing.T, tc bp2buildTestCase) {
|
||||
t.Helper()
|
||||
runBp2BuildTestCase(t, registerYasmModuleTypes, tc)
|
||||
}
|
||||
|
||||
func registerYasmModuleTypes(ctx android.RegistrationContext) {
|
||||
cc.RegisterCCBuildComponents(ctx)
|
||||
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
||||
ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
|
||||
ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
|
||||
ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
|
||||
}
|
||||
|
||||
func TestYasmSimple(t *testing.T) {
|
||||
runYasmTestCase(t, bp2buildTestCase{
|
||||
description: "Simple yasm test",
|
||||
moduleTypeUnderTest: "cc_library",
|
||||
moduleTypeUnderTestFactory: cc.LibraryFactory,
|
||||
filesystem: map[string]string{
|
||||
"main.cpp": "",
|
||||
"myfile.asm": "",
|
||||
},
|
||||
blueprint: `
|
||||
cc_library {
|
||||
name: "foo",
|
||||
srcs: ["main.cpp", "myfile.asm"],
|
||||
}`,
|
||||
expectedBazelTargets: append([]string{
|
||||
makeBazelTarget("yasm", "foo_yasm", map[string]string{
|
||||
"include_dirs": `["."]`,
|
||||
"srcs": `["myfile.asm"]`,
|
||||
}),
|
||||
}, makeCcLibraryTargets("foo", map[string]string{
|
||||
"local_includes": `["."]`,
|
||||
"srcs": `[
|
||||
"main.cpp",
|
||||
":foo_yasm",
|
||||
]`,
|
||||
})...),
|
||||
})
|
||||
}
|
||||
|
||||
func TestYasmWithIncludeDirs(t *testing.T) {
|
||||
runYasmTestCase(t, bp2buildTestCase{
|
||||
description: "Simple yasm test",
|
||||
moduleTypeUnderTest: "cc_library",
|
||||
moduleTypeUnderTestFactory: cc.LibraryFactory,
|
||||
filesystem: map[string]string{
|
||||
"main.cpp": "",
|
||||
"myfile.asm": "",
|
||||
"include1/foo/myinclude.inc": "",
|
||||
"include2/foo/myinclude2.inc": "",
|
||||
},
|
||||
blueprint: `
|
||||
cc_library {
|
||||
name: "foo",
|
||||
local_include_dirs: ["include1/foo"],
|
||||
export_include_dirs: ["include2/foo"],
|
||||
srcs: ["main.cpp", "myfile.asm"],
|
||||
}`,
|
||||
expectedBazelTargets: append([]string{
|
||||
makeBazelTarget("yasm", "foo_yasm", map[string]string{
|
||||
"include_dirs": `[
|
||||
"include1/foo",
|
||||
".",
|
||||
"include2/foo",
|
||||
]`,
|
||||
"srcs": `["myfile.asm"]`,
|
||||
}),
|
||||
}, makeCcLibraryTargets("foo", map[string]string{
|
||||
"local_includes": `[
|
||||
"include1/foo",
|
||||
".",
|
||||
]`,
|
||||
"export_includes": `["include2/foo"]`,
|
||||
"srcs": `[
|
||||
"main.cpp",
|
||||
":foo_yasm",
|
||||
]`,
|
||||
})...),
|
||||
})
|
||||
}
|
||||
|
||||
func TestYasmConditionalBasedOnArch(t *testing.T) {
|
||||
runYasmTestCase(t, bp2buildTestCase{
|
||||
description: "Simple yasm test",
|
||||
moduleTypeUnderTest: "cc_library",
|
||||
moduleTypeUnderTestFactory: cc.LibraryFactory,
|
||||
filesystem: map[string]string{
|
||||
"main.cpp": "",
|
||||
"myfile.asm": "",
|
||||
},
|
||||
blueprint: `
|
||||
cc_library {
|
||||
name: "foo",
|
||||
srcs: ["main.cpp"],
|
||||
arch: {
|
||||
x86: {
|
||||
srcs: ["myfile.asm"],
|
||||
},
|
||||
},
|
||||
}`,
|
||||
expectedBazelTargets: append([]string{
|
||||
makeBazelTarget("yasm", "foo_yasm", map[string]string{
|
||||
"include_dirs": `["."]`,
|
||||
"srcs": `select({
|
||||
"//build/bazel/platforms/arch:x86": ["myfile.asm"],
|
||||
"//conditions:default": [],
|
||||
})`,
|
||||
}),
|
||||
}, makeCcLibraryTargets("foo", map[string]string{
|
||||
"local_includes": `["."]`,
|
||||
"srcs": `["main.cpp"] + select({
|
||||
"//build/bazel/platforms/arch:x86": [":foo_yasm"],
|
||||
"//conditions:default": [],
|
||||
})`,
|
||||
})...),
|
||||
})
|
||||
}
|
||||
|
||||
func TestYasmPartiallyConditional(t *testing.T) {
|
||||
runYasmTestCase(t, bp2buildTestCase{
|
||||
description: "Simple yasm test",
|
||||
moduleTypeUnderTest: "cc_library",
|
||||
moduleTypeUnderTestFactory: cc.LibraryFactory,
|
||||
filesystem: map[string]string{
|
||||
"main.cpp": "",
|
||||
"myfile.asm": "",
|
||||
"mysecondfile.asm": "",
|
||||
},
|
||||
blueprint: `
|
||||
cc_library {
|
||||
name: "foo",
|
||||
srcs: ["main.cpp", "myfile.asm"],
|
||||
arch: {
|
||||
x86: {
|
||||
srcs: ["mysecondfile.asm"],
|
||||
},
|
||||
},
|
||||
}`,
|
||||
expectedBazelTargets: append([]string{
|
||||
makeBazelTarget("yasm", "foo_yasm", map[string]string{
|
||||
"include_dirs": `["."]`,
|
||||
"srcs": `["myfile.asm"] + select({
|
||||
"//build/bazel/platforms/arch:x86": ["mysecondfile.asm"],
|
||||
"//conditions:default": [],
|
||||
})`,
|
||||
}),
|
||||
}, makeCcLibraryTargets("foo", map[string]string{
|
||||
"local_includes": `["."]`,
|
||||
"srcs": `[
|
||||
"main.cpp",
|
||||
":foo_yasm",
|
||||
]`,
|
||||
})...),
|
||||
})
|
||||
}
|
@@ -4,7 +4,7 @@
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@@ -30,6 +30,7 @@ import (
|
||||
const (
|
||||
cSrcPartition = "c"
|
||||
asSrcPartition = "as"
|
||||
asmSrcPartition = "asm"
|
||||
lSrcPartition = "l"
|
||||
llSrcPartition = "ll"
|
||||
cppSrcPartition = "cpp"
|
||||
@@ -81,6 +82,7 @@ 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")},
|
||||
asmSrcPartition: bazel.LabelPartition{Extensions: []string{".asm"}},
|
||||
// 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
|
||||
@@ -289,6 +291,7 @@ type compilerAttributes struct {
|
||||
// Assembly options and sources
|
||||
asFlags bazel.StringListAttribute
|
||||
asSrcs bazel.LabelListAttribute
|
||||
asmSrcs bazel.LabelListAttribute
|
||||
// C options and sources
|
||||
conlyFlags bazel.StringListAttribute
|
||||
cSrcs bazel.LabelListAttribute
|
||||
@@ -447,6 +450,7 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i
|
||||
ca.srcs = partitionedSrcs[cppSrcPartition]
|
||||
ca.cSrcs = partitionedSrcs[cSrcPartition]
|
||||
ca.asSrcs = partitionedSrcs[asSrcPartition]
|
||||
ca.asmSrcs = partitionedSrcs[asmSrcPartition]
|
||||
ca.lSrcs = partitionedSrcs[lSrcPartition]
|
||||
ca.llSrcs = partitionedSrcs[llSrcPartition]
|
||||
|
||||
@@ -527,6 +531,61 @@ func includesFromLabelList(labelList bazel.LabelList) (relative, absolute []stri
|
||||
return relative, absolute
|
||||
}
|
||||
|
||||
type YasmAttributes struct {
|
||||
Srcs bazel.LabelListAttribute
|
||||
Flags bazel.StringListAttribute
|
||||
Include_dirs bazel.StringListAttribute
|
||||
}
|
||||
|
||||
func bp2BuildYasm(ctx android.Bp2buildMutatorContext, m *Module, ca compilerAttributes) *bazel.LabelAttribute {
|
||||
if ca.asmSrcs.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Yasm needs the include directories from both local_includes and
|
||||
// export_include_dirs. We don't care about actually exporting them from the
|
||||
// yasm rule though, because they will also be present on the cc_ rule that
|
||||
// wraps this yasm rule.
|
||||
includes := ca.localIncludes.Clone()
|
||||
bp2BuildPropParseHelper(ctx, m, &FlagExporterProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) {
|
||||
if flagExporterProperties, ok := props.(*FlagExporterProperties); ok {
|
||||
if len(flagExporterProperties.Export_include_dirs) > 0 {
|
||||
x := bazel.StringListAttribute{}
|
||||
x.SetSelectValue(axis, config, flagExporterProperties.Export_include_dirs)
|
||||
includes.Append(x)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
ctx.CreateBazelTargetModule(
|
||||
bazel.BazelTargetModuleProperties{
|
||||
Rule_class: "yasm",
|
||||
Bzl_load_location: "//build/bazel/rules/cc:yasm.bzl",
|
||||
},
|
||||
android.CommonAttributes{Name: m.Name() + "_yasm"},
|
||||
&YasmAttributes{
|
||||
Srcs: ca.asmSrcs,
|
||||
Flags: ca.asFlags,
|
||||
Include_dirs: *includes,
|
||||
})
|
||||
|
||||
// We only want to add a dependency on the _yasm target if there are asm
|
||||
// sources in the current configuration. If there are unconfigured asm
|
||||
// sources, always add the dependency. Otherwise, add the dependency only
|
||||
// on the configuration axes and values that had asm sources.
|
||||
if len(ca.asmSrcs.Value.Includes) > 0 {
|
||||
return bazel.MakeLabelAttribute(":" + m.Name() + "_yasm")
|
||||
}
|
||||
|
||||
ret := &bazel.LabelAttribute{}
|
||||
for _, axis := range ca.asmSrcs.SortedConfigurationAxes() {
|
||||
for config := range ca.asmSrcs.ConfigurableValues[axis] {
|
||||
ret.SetSelectValue(axis, config, bazel.Label{Label: ":" + m.Name() + "_yasm"})
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// bp2BuildParseBaseProps returns all compiler, linker, library attributes of a cc module..
|
||||
func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module) baseAttributes {
|
||||
archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
|
||||
@@ -612,6 +671,8 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
|
||||
(&compilerAttrs).finalize(ctx, implementationHdrs)
|
||||
(&linkerAttrs).finalize(ctx)
|
||||
|
||||
(&compilerAttrs.srcs).Add(bp2BuildYasm(ctx, module, compilerAttrs))
|
||||
|
||||
protoDep := bp2buildProto(ctx, module, compilerAttrs.protoSrcs)
|
||||
|
||||
// bp2buildProto will only set wholeStaticLib or implementationWholeStaticLib, but we don't know
|
||||
|
Reference in New Issue
Block a user