diff options
author | Dan Albert <danalbert@google.com> | 2016-06-17 16:45:24 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2016-07-28 00:42:05 -0700 |
commit | 914449fca8c749588e28dfdfafc3226aa407c47e (patch) | |
tree | 1f70761b0869ff651676ced2293b530dd7f3e3e6 /cc/cc.go | |
parent | fb8f9a800ed42e548893b13ebc3840fc31aaae94 (diff) | |
download | build_soong-914449fca8c749588e28dfdfafc3226aa407c47e.tar.gz build_soong-914449fca8c749588e28dfdfafc3226aa407c47e.tar.bz2 build_soong-914449fca8c749588e28dfdfafc3226aa407c47e.zip |
Generate NDK sysroots from the platform build.
The list of migrated libraries is currently empty. Libraries will be
migrated as follow up patches.
Test: Migrated libc to this system and everything still builds.
build.ninja shows libraries being built and used and headers are
collected for the sysroot.
Bug: http://b/27533932
Change-Id: Iaba00543c1390f432befe0eed768ed3fbb8a9b96
Diffstat (limited to 'cc/cc.go')
-rw-r--r-- | cc/cc.go | 115 |
1 files changed, 97 insertions, 18 deletions
@@ -58,6 +58,7 @@ func init() { // the Go initialization order because this package depends on common, so common's init // functions will run first. android.RegisterBottomUpMutator("link", linkageMutator) + android.RegisterBottomUpMutator("ndk_api", ndkApiMutator) android.RegisterBottomUpMutator("test_per_src", testPerSrcMutator) android.RegisterBottomUpMutator("deps", depsMutator) @@ -70,6 +71,10 @@ func init() { var ( HostPrebuiltTag = pctx.VariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS) + + // These libraries have migrated over to the new ndk_library, which is added + // as a variation dependency via depsMutator. + ndkMigratedLibs = []string{} ) // Flags used by lots of devices. Putting them in package static variables will save bytes in @@ -555,6 +560,8 @@ var ( crtBeginDepTag = dependencyTag{name: "crtbegin"} crtEndDepTag = dependencyTag{name: "crtend"} reuseObjTag = dependencyTag{name: "reuse objects"} + ndkStubDepTag = dependencyTag{name: "ndk stub", library: true} + ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true} ) // Module contains the properties and members used by all C/C++ module types, and implements @@ -883,20 +890,40 @@ func (c *Module) depsMutator(actx android.BottomUpMutatorContext) { c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, deps.SharedLibs...) c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, deps.LateSharedLibs...) + variantNdkLibs := []string{} + variantLateNdkLibs := []string{} if ctx.sdk() { - version := "." + ctx.sdkVersion() - - rewriteNdkLibs := func(list []string) []string { - for i, entry := range list { + version := ctx.sdkVersion() + + // Rewrites the names of shared libraries into the names of the NDK + // libraries where appropriate. This returns two slices. + // + // The first is a list of non-variant shared libraries (either rewritten + // NDK libraries to the modules in prebuilts/ndk, or not rewritten + // because they are not NDK libraries). + // + // The second is a list of ndk_library modules. These need to be + // separated because they are a variation dependency and must be added + // in a different manner. + rewriteNdkLibs := func(list []string) ([]string, []string) { + variantLibs := []string{} + nonvariantLibs := []string{} + for _, entry := range list { if inList(entry, ndkPrebuiltSharedLibraries) { - list[i] = "ndk_" + entry + version + if !inList(entry, ndkMigratedLibs) { + nonvariantLibs = append(nonvariantLibs, entry+".ndk."+version) + } else { + variantLibs = append(variantLibs, entry+ndkLibrarySuffix) + } + } else { + nonvariantLibs = append(variantLibs, entry) } } - return list + return nonvariantLibs, variantLibs } - deps.SharedLibs = rewriteNdkLibs(deps.SharedLibs) - deps.LateSharedLibs = rewriteNdkLibs(deps.LateSharedLibs) + deps.SharedLibs, variantNdkLibs = rewriteNdkLibs(deps.SharedLibs) + deps.LateSharedLibs, variantLateNdkLibs = rewriteNdkLibs(deps.LateSharedLibs) } actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, wholeStaticDepTag, @@ -935,6 +962,12 @@ func (c *Module) depsMutator(actx android.BottomUpMutatorContext) { if deps.CrtEnd != "" { actx.AddDependency(c, crtEndDepTag, deps.CrtEnd) } + + version := ctx.sdkVersion() + actx.AddVariationDependencies([]blueprint.Variation{ + {"ndk_api", version}, {"link", "shared"}}, ndkStubDepTag, variantNdkLibs...) + actx.AddVariationDependencies([]blueprint.Variation{ + {"ndk_api", version}, {"link", "shared"}}, ndkLateStubDepTag, variantLateNdkLibs...) } func depsMutator(ctx android.BottomUpMutatorContext) { @@ -990,6 +1023,11 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // These are allowed, but don't set sdk_version return true } + if _, ok := to.linker.(*stubLinker); ok { + // These aren't real libraries, but are the stub shared libraries that are included in + // the NDK. + return true + } return to.Properties.Sdk_version != "" } @@ -1073,9 +1111,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var depPtr *android.Paths switch tag { - case sharedDepTag, sharedExportDepTag: + case ndkStubDepTag, sharedDepTag, sharedExportDepTag: depPtr = &depPaths.SharedLibs - case lateSharedDepTag: + case lateSharedDepTag, ndkLateStubDepTag: depPtr = &depPaths.LateSharedLibs case staticDepTag, staticExportDepTag: depPtr = &depPaths.StaticLibs @@ -1190,6 +1228,30 @@ func (compiler *baseCompiler) flags(ctx ModuleContext, flags Flags) Flags { }...) } + if ctx.sdk() { + // The NDK headers are installed to a common sysroot. While a more + // typical Soong approach would be to only make the headers for the + // library you're using available, we're trying to emulate the NDK + // behavior here, and the NDK always has all the NDK headers available. + flags.GlobalFlags = append(flags.GlobalFlags, + "-isystem "+getCurrentIncludePath(ctx).String(), + "-isystem "+getCurrentIncludePath(ctx).Join(ctx, toolchain.ClangTriple()).String()) + + // Traditionally this has come from android/api-level.h, but with the + // libc headers unified it must be set by the build system since we + // don't have per-API level copies of that header now. + flags.GlobalFlags = append(flags.GlobalFlags, + "-D__ANDROID_API__="+ctx.sdkVersion()) + + // Until the full NDK has been migrated to using ndk_headers, we still + // need to add the legacy sysroot includes to get the full set of + // headers. + legacyIncludes := fmt.Sprintf( + "prebuilts/ndk/current/platforms/android-%s/arch-%s/usr/include", + ctx.sdkVersion(), ctx.Arch().ArchType.String()) + flags.GlobalFlags = append(flags.GlobalFlags, "-isystem "+legacyIncludes) + } + instructionSet := compiler.Properties.Instruction_set if flags.RequiredInstructionSet != "" { instructionSet = flags.RequiredInstructionSet @@ -1310,11 +1372,22 @@ func (compiler *baseCompiler) flags(ctx ModuleContext, flags Flags) Flags { return flags } +func ndkPathDeps(ctx ModuleContext) android.Paths { + if ctx.sdk() { + // The NDK sysroot timestamp file depends on all the NDK sysroot files + // (headers and libraries). + return android.Paths{getNdkSysrootTimestampFile(ctx)} + } + return nil +} + func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Paths { + pathDeps := deps.GeneratedHeaders + pathDeps = append(pathDeps, ndkPathDeps(ctx)...) // Compile files listed in c.Properties.Srcs into objects objFiles := compiler.compileObjs(ctx, flags, "", compiler.Properties.Srcs, compiler.Properties.Exclude_srcs, - deps.GeneratedSources, deps.GeneratedHeaders) + deps.GeneratedSources, pathDeps) if ctx.Failed() { return nil @@ -1595,14 +1668,17 @@ func (library *libraryCompiler) compile(ctx ModuleContext, flags Flags, deps Pat objFiles = library.baseCompiler.compile(ctx, flags, deps) library.reuseObjFiles = objFiles + pathDeps := deps.GeneratedHeaders + pathDeps = append(pathDeps, ndkPathDeps(ctx)...) + if library.linker.static() { objFiles = append(objFiles, library.compileObjs(ctx, flags, android.DeviceStaticLibrary, library.Properties.Static.Srcs, library.Properties.Static.Exclude_srcs, - nil, deps.GeneratedHeaders)...) + nil, pathDeps)...) } else { objFiles = append(objFiles, library.compileObjs(ctx, flags, android.DeviceSharedLibrary, library.Properties.Shared.Srcs, library.Properties.Shared.Exclude_srcs, - nil, deps.GeneratedHeaders)...) + nil, pathDeps)...) } return objFiles @@ -1626,6 +1702,10 @@ type libraryLinker struct { // For whole_static_libs objFiles android.Paths + + // Uses the module's name if empty, but can be overridden. Does not include + // shlib suffix. + libName string } var _ linker = (*libraryLinker)(nil) @@ -1646,7 +1726,10 @@ func (library *libraryLinker) props() []interface{} { } func (library *libraryLinker) getLibName(ctx ModuleContext) string { - name := ctx.ModuleName() + name := library.libName + if name == "" { + name = ctx.ModuleName() + } if ctx.Host() && Bool(library.Properties.Unique_host_soname) { if !strings.HasSuffix(name, "-host") { @@ -2634,10 +2717,6 @@ func ndkPrebuiltLibraryFactory() (blueprint.Module, []interface{}) { func (ndk *ndkPrebuiltLibraryLinker) link(ctx ModuleContext, flags Flags, deps PathDeps, objFiles android.Paths) android.Path { // A null build step, but it sets up the output path. - if !strings.HasPrefix(ctx.ModuleName(), "ndk_lib") { - ctx.ModuleErrorf("NDK prebuilts must have an ndk_lib prefixed name") - } - ndk.exportIncludes(ctx, "-isystem") return ndkPrebuiltModuleToPath(ctx, flags.Toolchain, flags.Toolchain.ShlibSuffix(), |