diff --git a/cc/cc.go b/cc/cc.go index 24f68285c..2e094d007 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -2193,13 +2193,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { }, depTag, RewriteSnapshotLib(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) } - for _, lib := range deps.LateStaticLibs { - depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency} - actx.AddVariationDependencies([]blueprint.Variation{ - {Mutator: "link", Variation: "static"}, - }, depTag, RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) - } - // shared lib names without the #version suffix var sharedLibNames []string @@ -2225,6 +2218,13 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false) } + for _, lib := range deps.LateStaticLibs { + depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency} + actx.AddVariationDependencies([]blueprint.Variation{ + {Mutator: "link", Variation: "static"}, + }, depTag, RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) + } + for _, lib := range deps.LateSharedLibs { if inList(lib, sharedLibNames) { // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...) diff --git a/cc/cc_test.go b/cc/cc_test.go index e0fae5ad9..2d0d78b86 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -4231,3 +4231,152 @@ func TestIncludeDirsExporting(t *testing.T) { ) }) } + +func TestIncludeDirectoryOrdering(t *testing.T) { + bp := ` + cc_library { + name: "libfoo", + srcs: ["foo.c"], + local_include_dirs: ["local_include_dirs"], + export_include_dirs: ["export_include_dirs"], + export_system_include_dirs: ["export_system_include_dirs"], + static_libs: ["libstatic1", "libstatic2"], + whole_static_libs: ["libwhole1", "libwhole2"], + shared_libs: ["libshared1", "libshared2"], + header_libs: ["libheader1", "libheader2"], + target: { + android: { + shared_libs: ["libandroid"], + local_include_dirs: ["android_local_include_dirs"], + export_include_dirs: ["android_export_include_dirs"], + }, + android_arm: { + shared_libs: ["libandroid_arm"], + local_include_dirs: ["android_arm_local_include_dirs"], + export_include_dirs: ["android_arm_export_include_dirs"], + }, + linux: { + shared_libs: ["liblinux"], + local_include_dirs: ["linux_local_include_dirs"], + export_include_dirs: ["linux_export_include_dirs"], + }, + }, + multilib: { + lib32: { + shared_libs: ["lib32"], + local_include_dirs: ["lib32_local_include_dirs"], + export_include_dirs: ["lib32_export_include_dirs"], + }, + }, + arch: { + arm: { + shared_libs: ["libarm"], + local_include_dirs: ["arm_local_include_dirs"], + export_include_dirs: ["arm_export_include_dirs"], + }, + }, + stl: "libc++", + sdk_version: "20", + } + + cc_library_headers { + name: "libheader1", + export_include_dirs: ["libheader1"], + sdk_version: "20", + stl: "none", + } + + cc_library_headers { + name: "libheader2", + export_include_dirs: ["libheader2"], + sdk_version: "20", + stl: "none", + } + ` + + libs := []string{ + "libstatic1", + "libstatic2", + "libwhole1", + "libwhole2", + "libshared1", + "libshared2", + "libandroid", + "libandroid_arm", + "liblinux", + "lib32", + "libarm", + } + + for _, lib := range libs { + bp += fmt.Sprintf(` + cc_library { + name: "%s", + export_include_dirs: ["%s"], + sdk_version: "20", + stl: "none", + } + `, lib, lib) + } + + ctx := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) + // Use the arm variant instead of the arm64 variant so that it gets headers from + // ndk_libandroid_support to test LateStaticLibs. + cflags := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_sdk_static").Output("obj/foo.o").Args["cFlags"] + + var includes []string + flags := strings.Split(cflags, " ") + for i, flag := range flags { + if strings.Contains(flag, "Cflags") { + includes = append(includes, flag) + } else if strings.HasPrefix(flag, "-I") { + includes = append(includes, strings.TrimPrefix(flag, "-I")) + } else if flag == "-isystem" { + includes = append(includes, flags[i+1]) + } + } + + want := []string{ + "${config.ArmClangThumbCflags}", + "${config.ArmClangCflags}", + "${config.CommonClangGlobalCflags}", + "${config.DeviceClangGlobalCflags}", + "${config.ClangExternalCflags}", + "${config.ArmToolchainClangCflags}", + "${config.ArmClangArmv7ANeonCflags}", + "${config.ArmClangGenericCflags}", + "export_include_dirs", + "linux_export_include_dirs", + "android_export_include_dirs", + "arm_export_include_dirs", + "lib32_export_include_dirs", + "android_arm_export_include_dirs", + "android_arm_local_include_dirs", + "lib32_local_include_dirs", + "arm_local_include_dirs", + "android_local_include_dirs", + "linux_local_include_dirs", + "local_include_dirs", + ".", + "libheader1", + "libheader2", + "libwhole1", + "libwhole2", + "libstatic1", + "libstatic2", + "libshared1", + "libshared2", + "liblinux", + "libandroid", + "libarm", + "lib32", + "libandroid_arm", + "defaults/cc/common/ndk_libc++_shared", + "defaults/cc/common/ndk_libandroid_support", + "out/soong/ndk/sysroot/usr/include", + "out/soong/ndk/sysroot/usr/include/arm-linux-androideabi", + "${config.NoOverrideClangGlobalCflags}", + } + + android.AssertArrayString(t, "includes", want, includes) +} diff --git a/cc/stl.go b/cc/stl.go index 75921c6ff..06dc840e8 100644 --- a/cc/stl.go +++ b/cc/stl.go @@ -199,7 +199,9 @@ func (stl *stl) deps(ctx BaseModuleContext, deps Deps) Deps { deps.StaticLibs = append(deps.StaticLibs, stl.Properties.SelectedStl, "ndk_libc++abi") } if needsLibAndroidSupport(ctx) { - deps.StaticLibs = append(deps.StaticLibs, "ndk_libandroid_support") + // Use LateStaticLibs for ndk_libandroid_support so that its include directories + // come after ndk_libc++_static or ndk_libc++_shared. + deps.LateStaticLibs = append(deps.LateStaticLibs, "ndk_libandroid_support") } deps.StaticLibs = append(deps.StaticLibs, "ndk_libunwind") default: diff --git a/cc/testing.go b/cc/testing.go index bee170f1d..80cc0ef67 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -34,6 +34,7 @@ func RegisterRequiredBuildComponentsForTest(ctx android.RegistrationContext) { ctx.RegisterModuleType("cc_object", ObjectFactory) ctx.RegisterModuleType("cc_genrule", genRuleFactory) ctx.RegisterModuleType("ndk_prebuilt_shared_stl", NdkPrebuiltSharedStlFactory) + ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory) ctx.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) } @@ -403,7 +404,7 @@ func commonDefaultModules() string { cc_library { name: "ndk_libunwind", - sdk_version: "current", + sdk_version: "minimum", stl: "none", system_shared_libs: [], } @@ -428,6 +429,12 @@ func commonDefaultModules() string { ndk_prebuilt_shared_stl { name: "ndk_libc++_shared", + export_include_dirs: ["ndk_libc++_shared"], + } + + ndk_prebuilt_static_stl { + name: "ndk_libandroid_support", + export_include_dirs: ["ndk_libandroid_support"], } cc_library_static { @@ -578,9 +585,11 @@ var PrepareForTestWithCcDefaultModules = android.GroupFixturePreparers( // Additional files needed in tests that disallow non-existent source. android.MockFS{ - "defaults/cc/common/libc.map.txt": nil, - "defaults/cc/common/libdl.map.txt": nil, - "defaults/cc/common/libm.map.txt": nil, + "defaults/cc/common/libc.map.txt": nil, + "defaults/cc/common/libdl.map.txt": nil, + "defaults/cc/common/libm.map.txt": nil, + "defaults/cc/common/ndk_libandroid_support": nil, + "defaults/cc/common/ndk_libc++_shared": nil, }.AddToFixture(), // Place the default cc test modules that are common to all platforms in a location that will not