Merge changes from topic "mixed-build-cc-library-shared" am: 4aeaf37bb7

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

Change-Id: If277cd41ec3244e25aec1cedb3890f7fbc058eca
This commit is contained in:
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux
2021-09-17 14:39:12 +00:00
committed by Automerger Merge Worker
4 changed files with 34 additions and 29 deletions

View File

@@ -25,6 +25,7 @@ type CcInfo struct {
// be a subset of OutputFiles. (or shared libraries, this will be equal to OutputFiles, // be a subset of OutputFiles. (or shared libraries, this will be equal to OutputFiles,
// but general cc_library will also have dynamic libraries in output files). // but general cc_library will also have dynamic libraries in output files).
RootDynamicLibraries []string RootDynamicLibraries []string
TocFile string
} }
type getOutputFilesRequestType struct{} type getOutputFilesRequestType struct{}
@@ -127,6 +128,11 @@ if shared_info_tag in providers(target):
for lib in shared_info.linker_input.libraries: for lib in shared_info.linker_input.libraries:
rootDynamicLibraries += [lib.dynamic_library.path] rootDynamicLibraries += [lib.dynamic_library.path]
toc_file = ""
toc_file_tag = "//build/bazel/rules:generate_toc.bzl%CcTocInfo"
if toc_file_tag in providers(target):
toc_file = providers(target)[toc_file_tag].toc.path
returns = [ returns = [
outputFiles, outputFiles,
staticLibraries, staticLibraries,
@@ -134,10 +140,10 @@ returns = [
includes, includes,
system_includes, system_includes,
rootStaticArchives, rootStaticArchives,
rootDynamicLibraries rootDynamicLibraries,
] ]
return "|".join([", ".join(r) for r in returns])` return "|".join([", ".join(r) for r in returns] + [toc_file])`
} }
// ParseResult returns a value obtained by parsing the result of the request's Starlark function. // ParseResult returns a value obtained by parsing the result of the request's Starlark function.
@@ -148,7 +154,7 @@ func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) {
var ccObjects []string var ccObjects []string
splitString := strings.Split(rawString, "|") splitString := strings.Split(rawString, "|")
if expectedLen := 7; len(splitString) != expectedLen { if expectedLen := 8; len(splitString) != expectedLen {
return CcInfo{}, fmt.Errorf("Expected %d items, got %q", expectedLen, splitString) return CcInfo{}, fmt.Errorf("Expected %d items, got %q", expectedLen, splitString)
} }
outputFilesString := splitString[0] outputFilesString := splitString[0]
@@ -161,6 +167,7 @@ func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) {
systemIncludes := splitOrEmpty(splitString[4], ", ") systemIncludes := splitOrEmpty(splitString[4], ", ")
rootStaticArchives := splitOrEmpty(splitString[5], ", ") rootStaticArchives := splitOrEmpty(splitString[5], ", ")
rootDynamicLibraries := splitOrEmpty(splitString[6], ", ") rootDynamicLibraries := splitOrEmpty(splitString[6], ", ")
tocFile := splitString[7] // NOTE: Will be the empty string if there wasn't
return CcInfo{ return CcInfo{
OutputFiles: outputFiles, OutputFiles: outputFiles,
CcObjectFiles: ccObjects, CcObjectFiles: ccObjects,
@@ -169,6 +176,7 @@ func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) {
SystemIncludes: systemIncludes, SystemIncludes: systemIncludes,
RootStaticArchives: rootStaticArchives, RootStaticArchives: rootStaticArchives,
RootDynamicLibraries: rootDynamicLibraries, RootDynamicLibraries: rootDynamicLibraries,
TocFile: tocFile,
}, nil }, nil
} }

View File

@@ -71,7 +71,7 @@ func TestGetCcInfoParseResults(t *testing.T) {
}{ }{
{ {
description: "no result", description: "no result",
input: "||||||", input: "|||||||",
expectedOutput: CcInfo{ expectedOutput: CcInfo{
OutputFiles: []string{}, OutputFiles: []string{},
CcObjectFiles: []string{}, CcObjectFiles: []string{},
@@ -80,11 +80,12 @@ func TestGetCcInfoParseResults(t *testing.T) {
SystemIncludes: []string{}, SystemIncludes: []string{},
RootStaticArchives: []string{}, RootStaticArchives: []string{},
RootDynamicLibraries: []string{}, RootDynamicLibraries: []string{},
TocFile: "",
}, },
}, },
{ {
description: "only output", description: "only output",
input: "test||||||", input: "test|||||||",
expectedOutput: CcInfo{ expectedOutput: CcInfo{
OutputFiles: []string{"test"}, OutputFiles: []string{"test"},
CcObjectFiles: []string{}, CcObjectFiles: []string{},
@@ -93,11 +94,12 @@ func TestGetCcInfoParseResults(t *testing.T) {
SystemIncludes: []string{}, SystemIncludes: []string{},
RootStaticArchives: []string{}, RootStaticArchives: []string{},
RootDynamicLibraries: []string{}, RootDynamicLibraries: []string{},
TocFile: "",
}, },
}, },
{ {
description: "all items set", description: "all items set",
input: "out1, out2|static_lib1, static_lib2|object1, object2|., dir/subdir|system/dir, system/other/dir|rootstaticarchive1|rootdynamiclibrary1", input: "out1, out2|static_lib1, static_lib2|object1, object2|., dir/subdir|system/dir, system/other/dir|rootstaticarchive1|rootdynamiclibrary1|lib.so.toc",
expectedOutput: CcInfo{ expectedOutput: CcInfo{
OutputFiles: []string{"out1", "out2"}, OutputFiles: []string{"out1", "out2"},
CcObjectFiles: []string{"object1", "object2"}, CcObjectFiles: []string{"object1", "object2"},
@@ -106,19 +108,20 @@ func TestGetCcInfoParseResults(t *testing.T) {
SystemIncludes: []string{"system/dir", "system/other/dir"}, SystemIncludes: []string{"system/dir", "system/other/dir"},
RootStaticArchives: []string{"rootstaticarchive1"}, RootStaticArchives: []string{"rootstaticarchive1"},
RootDynamicLibraries: []string{"rootdynamiclibrary1"}, RootDynamicLibraries: []string{"rootdynamiclibrary1"},
TocFile: "lib.so.toc",
}, },
}, },
{ {
description: "too few result splits", description: "too few result splits",
input: "|", input: "|",
expectedOutput: CcInfo{}, expectedOutput: CcInfo{},
expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 7, []string{"", ""}), expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 8, []string{"", ""}),
}, },
{ {
description: "too many result splits", description: "too many result splits",
input: strings.Repeat("|", 8), input: strings.Repeat("|", 8),
expectedOutput: CcInfo{}, expectedOutput: CcInfo{},
expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 7, make([]string, 9)), expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 8, make([]string, 9)),
}, },
} }
for _, tc := range testCases { for _, tc := range testCases {

View File

@@ -604,7 +604,10 @@ func (handler *ccLibraryBazelHandler) generateSharedBazelBuildActions(ctx androi
handler.module.linker.(*libraryDecorator).unstrippedOutputFile = outputFilePath handler.module.linker.(*libraryDecorator).unstrippedOutputFile = outputFilePath
tocFile := getTocFile(ctx, label, ccInfo.OutputFiles) var tocFile android.OptionalPath
if len(ccInfo.TocFile) > 0 {
tocFile = android.OptionalPathForPath(android.PathForBazelOut(ctx, ccInfo.TocFile))
}
handler.module.linker.(*libraryDecorator).tocFile = tocFile handler.module.linker.(*libraryDecorator).tocFile = tocFile
ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{ ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{
@@ -617,25 +620,6 @@ func (handler *ccLibraryBazelHandler) generateSharedBazelBuildActions(ctx androi
return true return true
} }
// getTocFile looks for the .so.toc file in the target's output files, if any. The .so.toc file
// contains the table of contents of all symbols of a shared object.
func getTocFile(ctx android.ModuleContext, label string, outputFiles []string) android.OptionalPath {
var tocFile string
for _, file := range outputFiles {
if strings.HasSuffix(file, ".so.toc") {
if tocFile != "" {
ctx.ModuleErrorf("The %s target cannot produce more than 1 .toc file.", label)
}
tocFile = file
// Don't break to validate that there are no multiple .toc files per .so.
}
}
if tocFile == "" {
return android.OptionalPath{}
}
return android.OptionalPathForPath(android.PathForBazelOut(ctx, tocFile))
}
func (handler *ccLibraryBazelHandler) GenerateBazelBuildActions(ctx android.ModuleContext, label string) bool { func (handler *ccLibraryBazelHandler) GenerateBazelBuildActions(ctx android.ModuleContext, label string) bool {
bazelCtx := ctx.Config().BazelContext bazelCtx := ctx.Config().BazelContext
ccInfo, ok, err := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType) ccInfo, ok, err := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType)

View File

@@ -337,19 +337,29 @@ cc_library_shared {
Includes: []string{"include"}, Includes: []string{"include"},
SystemIncludes: []string{"system_include"}, SystemIncludes: []string{"system_include"},
RootDynamicLibraries: []string{"foo.so"}, RootDynamicLibraries: []string{"foo.so"},
TocFile: "foo.so.toc",
}, },
}, },
} }
ctx := testCcWithConfig(t, config) ctx := testCcWithConfig(t, config)
sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module() sharedFoo := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon_shared").Module()
outputFiles, err := sharedFoo.(android.OutputFileProducer).OutputFiles("") producer := sharedFoo.(android.OutputFileProducer)
outputFiles, err := producer.OutputFiles("")
if err != nil { if err != nil {
t.Errorf("Unexpected error getting cc_object outputfiles %s", err) t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
} }
expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.so"} expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.so"}
android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings()) android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
tocFilePath := sharedFoo.(*Module).Toc()
if !tocFilePath.Valid() {
t.Errorf("Invalid tocFilePath: %s", tocFilePath)
}
tocFile := tocFilePath.Path()
expectedToc := "outputbase/execroot/__main__/foo.so.toc"
android.AssertStringEquals(t, "toc file", expectedToc, tocFile.String())
entries := android.AndroidMkEntriesForTest(t, ctx, sharedFoo)[0] entries := android.AndroidMkEntriesForTest(t, ctx, sharedFoo)[0]
expectedFlags := []string{"-Ioutputbase/execroot/__main__/include", "-isystem outputbase/execroot/__main__/system_include"} expectedFlags := []string{"-Ioutputbase/execroot/__main__/include", "-isystem outputbase/execroot/__main__/system_include"}
gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"] gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"]