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

Commit eb2d6d1f authored by Liz Kammer's avatar Liz Kammer
Browse files

Propagate headers from bazel to mixed builds

Bug: 208503274
Test: mixed_libc.sh
Change-Id: I0be57f2a22f48be3a919208db4034d2bd03c18c0
parent b0d167cb
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -412,11 +412,9 @@ var (
		"libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610.
		"libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610.


		// Depends on libprotobuf-cpp-*
		// Depends on libprotobuf-cpp-*
		"libadb_crypto", "libadb_crypto_static", "libadb_pairing_connection",
		"libadb_pairing_connection",
		"libadb_pairing_connection_static",
		"libadb_pairing_connection_static",
		"libadb_pairing_server", "libadb_pairing_server_static",
		"libadb_pairing_server", "libadb_pairing_server_static",
		"libadb_protos_static", "libadb_protos",
		"libapp_processes_protos_lite",
	}
	}


	// Used for quicker lookups
	// Used for quicker lookups
+9 −4
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@ type CcInfo struct {
	CcStaticLibraryFiles []string
	CcStaticLibraryFiles []string
	Includes             []string
	Includes             []string
	SystemIncludes       []string
	SystemIncludes       []string
	Headers              []string
	// Archives owned by the current target (not by its dependencies). These will
	// Archives owned by the current target (not by its dependencies). These will
	// be a subset of OutputFiles. (or static libraries, this will be equal to OutputFiles,
	// be a subset of OutputFiles. (or static 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).
@@ -105,6 +106,7 @@ cc_info = providers(target)["CcInfo"]


includes = cc_info.compilation_context.includes.to_list()
includes = cc_info.compilation_context.includes.to_list()
system_includes = cc_info.compilation_context.system_includes.to_list()
system_includes = cc_info.compilation_context.system_includes.to_list()
headers = [f.path for f in cc_info.compilation_context.headers.to_list()]


ccObjectFiles = []
ccObjectFiles = []
staticLibraries = []
staticLibraries = []
@@ -145,6 +147,7 @@ returns = [
  ccObjectFiles,
  ccObjectFiles,
  includes,
  includes,
  system_includes,
  system_includes,
  headers,
  rootStaticArchives,
  rootStaticArchives,
  rootDynamicLibraries,
  rootDynamicLibraries,
  [toc_file]
  [toc_file]
@@ -161,7 +164,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 := 8; len(splitString) != expectedLen {
	if expectedLen := 9; 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]
@@ -172,15 +175,17 @@ func (g getCcInfoType) ParseResult(rawString string) (CcInfo, error) {
	ccObjects = splitOrEmpty(ccObjectsString, ", ")
	ccObjects = splitOrEmpty(ccObjectsString, ", ")
	includes := splitOrEmpty(splitString[3], ", ")
	includes := splitOrEmpty(splitString[3], ", ")
	systemIncludes := splitOrEmpty(splitString[4], ", ")
	systemIncludes := splitOrEmpty(splitString[4], ", ")
	rootStaticArchives := splitOrEmpty(splitString[5], ", ")
	headers := splitOrEmpty(splitString[5], ", ")
	rootDynamicLibraries := splitOrEmpty(splitString[6], ", ")
	rootStaticArchives := splitOrEmpty(splitString[6], ", ")
	tocFile := splitString[7] // NOTE: Will be the empty string if there wasn't
	rootDynamicLibraries := splitOrEmpty(splitString[7], ", ")
	tocFile := splitString[8] // NOTE: Will be the empty string if there wasn't
	return CcInfo{
	return CcInfo{
		OutputFiles:          outputFiles,
		OutputFiles:          outputFiles,
		CcObjectFiles:        ccObjects,
		CcObjectFiles:        ccObjects,
		CcStaticLibraryFiles: ccStaticLibraries,
		CcStaticLibraryFiles: ccStaticLibraries,
		Includes:             includes,
		Includes:             includes,
		SystemIncludes:       systemIncludes,
		SystemIncludes:       systemIncludes,
		Headers:              headers,
		RootStaticArchives:   rootStaticArchives,
		RootStaticArchives:   rootStaticArchives,
		RootDynamicLibraries: rootDynamicLibraries,
		RootDynamicLibraries: rootDynamicLibraries,
		TocFile:              tocFile,
		TocFile:              tocFile,
+9 −6
Original line number Original line Diff line number Diff line
@@ -71,13 +71,14 @@ 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{},
				CcStaticLibraryFiles: []string{},
				CcStaticLibraryFiles: []string{},
				Includes:             []string{},
				Includes:             []string{},
				SystemIncludes:       []string{},
				SystemIncludes:       []string{},
				Headers:              []string{},
				RootStaticArchives:   []string{},
				RootStaticArchives:   []string{},
				RootDynamicLibraries: []string{},
				RootDynamicLibraries: []string{},
				TocFile:              "",
				TocFile:              "",
@@ -85,13 +86,14 @@ func TestGetCcInfoParseResults(t *testing.T) {
		},
		},
		{
		{
			description: "only output",
			description: "only output",
			input:       "test|||||||",
			input:       "test||||||||",
			expectedOutput: CcInfo{
			expectedOutput: CcInfo{
				OutputFiles:          []string{"test"},
				OutputFiles:          []string{"test"},
				CcObjectFiles:        []string{},
				CcObjectFiles:        []string{},
				CcStaticLibraryFiles: []string{},
				CcStaticLibraryFiles: []string{},
				Includes:             []string{},
				Includes:             []string{},
				SystemIncludes:       []string{},
				SystemIncludes:       []string{},
				Headers:              []string{},
				RootStaticArchives:   []string{},
				RootStaticArchives:   []string{},
				RootDynamicLibraries: []string{},
				RootDynamicLibraries: []string{},
				TocFile:              "",
				TocFile:              "",
@@ -99,13 +101,14 @@ func TestGetCcInfoParseResults(t *testing.T) {
		},
		},
		{
		{
			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|lib.so.toc",
			input:       "out1, out2|static_lib1, static_lib2|object1, object2|., dir/subdir|system/dir, system/other/dir|dir/subdir/hdr.h|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"},
				CcStaticLibraryFiles: []string{"static_lib1", "static_lib2"},
				CcStaticLibraryFiles: []string{"static_lib1", "static_lib2"},
				Includes:             []string{".", "dir/subdir"},
				Includes:             []string{".", "dir/subdir"},
				SystemIncludes:       []string{"system/dir", "system/other/dir"},
				SystemIncludes:       []string{"system/dir", "system/other/dir"},
				Headers:              []string{"dir/subdir/hdr.h"},
				RootStaticArchives:   []string{"rootstaticarchive1"},
				RootStaticArchives:   []string{"rootstaticarchive1"},
				RootDynamicLibraries: []string{"rootdynamiclibrary1"},
				RootDynamicLibraries: []string{"rootdynamiclibrary1"},
				TocFile:              "lib.so.toc",
				TocFile:              "lib.so.toc",
@@ -115,13 +118,13 @@ func TestGetCcInfoParseResults(t *testing.T) {
			description:          "too few result splits",
			description:          "too few result splits",
			input:                "|",
			input:                "|",
			expectedOutput:       CcInfo{},
			expectedOutput:       CcInfo{},
			expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 8, []string{"", ""}),
			expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 9, []string{"", ""}),
		},
		},
		{
		{
			description:          "too many result splits",
			description:          "too many result splits",
			input:                strings.Repeat("|", 8),
			input:                strings.Repeat("|", 50),
			expectedOutput:       CcInfo{},
			expectedOutput:       CcInfo{},
			expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 8, make([]string, 9)),
			expectedErrorMessage: fmt.Sprintf("Expected %d items, got %q", 9, make([]string, 51)),
		},
		},
	}
	}
	for _, tc := range testCases {
	for _, tc := range testCases {
+14 −5
Original line number Original line Diff line number Diff line
@@ -257,12 +257,14 @@ cc_library {
				CcObjectFiles:        []string{"foo.o"},
				CcObjectFiles:        []string{"foo.o"},
				Includes:             []string{"include"},
				Includes:             []string{"include"},
				SystemIncludes:       []string{"system_include"},
				SystemIncludes:       []string{"system_include"},
				Headers:              []string{"foo.h"},
				RootDynamicLibraries: []string{"foo.so"},
				RootDynamicLibraries: []string{"foo.so"},
			},
			},
			"//foo/bar:bar_bp2build_cc_library_static": cquery.CcInfo{
			"//foo/bar:bar_bp2build_cc_library_static": cquery.CcInfo{
				CcObjectFiles:      []string{"foo.o"},
				CcObjectFiles:      []string{"foo.o"},
				Includes:           []string{"include"},
				Includes:           []string{"include"},
				SystemIncludes:     []string{"system_include"},
				SystemIncludes:     []string{"system_include"},
				Headers:            []string{"foo.h"},
				RootStaticArchives: []string{"foo.a"},
				RootStaticArchives: []string{"foo.a"},
			},
			},
		},
		},
@@ -278,18 +280,25 @@ cc_library {
	expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.a"}
	expectedOutputFiles := []string{"outputbase/execroot/__main__/foo.a"}
	android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())
	android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings())


	flagExporter := ctx.ModuleProvider(staticFoo, FlagExporterInfoProvider).(FlagExporterInfo)
	android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
	android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
	android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
	android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)

	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("")
	outputFiles, err = sharedFoo.(android.OutputFileProducer).OutputFiles("")
	if err != nil {
	if err != nil {
		t.Errorf("Unexpected error getting cc_object outputfiles %s", err)
		t.Errorf("Unexpected error getting cc_library 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())


	entries := android.AndroidMkEntriesForTest(t, ctx, sharedFoo)[0]
	flagExporter = ctx.ModuleProvider(sharedFoo, FlagExporterInfoProvider).(FlagExporterInfo)
	expectedFlags := []string{"-Ioutputbase/execroot/__main__/include", "-isystem outputbase/execroot/__main__/system_include"}
	android.AssertPathsRelativeToTopEquals(t, "exported include dirs", []string{"outputbase/execroot/__main__/include"}, flagExporter.IncludeDirs)
	gotFlags := entries.EntryMap["LOCAL_EXPORT_CFLAGS"]
	android.AssertPathsRelativeToTopEquals(t, "exported system include dirs", []string{"outputbase/execroot/__main__/system_include"}, flagExporter.SystemIncludeDirs)
	android.AssertDeepEquals(t, "androidmk exported cflags", expectedFlags, gotFlags)
	android.AssertPathsRelativeToTopEquals(t, "exported headers", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.GeneratedHeaders)
	android.AssertPathsRelativeToTopEquals(t, "deps", []string{"outputbase/execroot/__main__/foo.h"}, flagExporter.Deps)
}
}


func TestLibraryVersionScript(t *testing.T) {
func TestLibraryVersionScript(t *testing.T) {
+4 −0
Original line number Original line Diff line number Diff line
@@ -384,9 +384,13 @@ func flagExporterInfoFromCcInfo(ctx android.ModuleContext, ccInfo cquery.CcInfo)


	includes := android.PathsForBazelOut(ctx, ccInfo.Includes)
	includes := android.PathsForBazelOut(ctx, ccInfo.Includes)
	systemIncludes := android.PathsForBazelOut(ctx, ccInfo.SystemIncludes)
	systemIncludes := android.PathsForBazelOut(ctx, ccInfo.SystemIncludes)
	headers := android.PathsForBazelOut(ctx, ccInfo.Headers)


	return FlagExporterInfo{
	return FlagExporterInfo{
		IncludeDirs:       android.FirstUniquePaths(includes),
		IncludeDirs:       android.FirstUniquePaths(includes),
		SystemIncludeDirs: android.FirstUniquePaths(systemIncludes),
		SystemIncludeDirs: android.FirstUniquePaths(systemIncludes),
		GeneratedHeaders:  headers,
		// necessary to ensure generated headers are considered implicit deps of dependent actions
		Deps: headers,
	}
	}
}
}