aboutsummaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2017-02-14 15:28:44 -0800
committerColin Cross <ccross@android.com>2017-02-14 17:52:10 -0800
commita48ab5b20707a313d80ceab0914f7dc49877563c (patch)
treeb5b05884c05735aef7d33098880d856fa21d56d1 /cc
parent581341d4f2752a1f2823173167d30ddb30db5932 (diff)
downloadbuild_soong-a48ab5b20707a313d80ceab0914f7dc49877563c.tar.gz
build_soong-a48ab5b20707a313d80ceab0914f7dc49877563c.tar.bz2
build_soong-a48ab5b20707a313d80ceab0914f7dc49877563c.zip
Build a static library for header-only libraries
library.static() was being used to determine if a library was static, shared, or header only, which resulted in header only libraries behaving like shared libraries, when they should be treated as static libraries with no sources. Explicitly use library.static(), library.shared(), and library.header() instead. Bug: 35228396 Test: builds, manually examine changes to build.ninja and Android.mk Change-Id: I51729992cc6338deda1396b86f12bc9f73e674d8
Diffstat (limited to 'cc')
-rw-r--r--cc/library.go67
-rw-r--r--cc/ndk_library.go2
-rw-r--r--cc/ndk_prebuilt.go2
3 files changed, 45 insertions, 26 deletions
diff --git a/cc/library.go b/cc/library.go
index efaf4408..f7194e46 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -64,7 +64,9 @@ type LibraryProperties struct {
// export headers generated from .proto sources
Export_proto_headers bool
}
+}
+type LibraryMutatedProperties struct {
VariantName string `blueprint:"mutated"`
// Build a static variant
@@ -175,7 +177,8 @@ var _ exportedFlagsProducer = (*flagExporter)(nil)
// libraryDecorator wraps baseCompiler, baseLinker and baseInstaller to provide library-specific
// functionality: static vs. shared linkage, reusing object files for shared libraries
type libraryDecorator struct {
- Properties LibraryProperties
+ Properties LibraryProperties
+ MutatedProperties LibraryMutatedProperties
// For reusing static library objects for shared library
reuseObjects Objects
@@ -213,6 +216,7 @@ func (library *libraryDecorator) linkerProps() []interface{} {
props = append(props, library.baseLinker.linkerProps()...)
return append(props,
&library.Properties,
+ &library.MutatedProperties,
&library.flagExporter.Properties,
&library.stripper.StripProperties,
&library.relocationPacker.Properties)
@@ -230,11 +234,11 @@ func (library *libraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Fla
if library.static() {
flags.CFlags = append(flags.CFlags, library.Properties.Static.Cflags...)
- } else {
+ } else if library.shared() {
flags.CFlags = append(flags.CFlags, library.Properties.Shared.Cflags...)
}
- if !library.static() {
+ if library.shared() {
libName := library.getLibName(ctx)
// GCC for Android assumes that -shared means -Bsymbolic, use -Wl,-shared instead
sharedFlag := "-Wl,-shared"
@@ -303,7 +307,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
srcs := android.PathsForModuleSrc(ctx, library.Properties.Static.Srcs)
objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceStaticLibrary,
srcs, library.baseCompiler.deps))
- } else {
+ } else if library.shared() {
srcs := android.PathsForModuleSrc(ctx, library.Properties.Shared.Srcs)
objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceSharedLibrary,
srcs, library.baseCompiler.deps))
@@ -324,7 +328,8 @@ type libraryInterface interface {
buildShared() bool
// Sets whether a specific variant is static or shared
- setStatic(bool)
+ setStatic()
+ setShared()
}
func (library *libraryDecorator) getLibName(ctx ModuleContext) string {
@@ -339,7 +344,7 @@ func (library *libraryDecorator) getLibName(ctx ModuleContext) string {
}
}
- return name + library.Properties.VariantName
+ return name + library.MutatedProperties.VariantName
}
func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) {
@@ -362,7 +367,7 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
library.Properties.Static.Whole_static_libs...)
deps.StaticLibs = append(deps.StaticLibs, library.Properties.Static.Static_libs...)
deps.SharedLibs = append(deps.SharedLibs, library.Properties.Static.Shared_libs...)
- } else {
+ } else if library.shared() {
if ctx.toolchain().Bionic() && !Bool(library.baseLinker.Properties.Nocrt) {
if !ctx.sdk() && !ctx.vndk() {
deps.CrtBegin = "crtbegin_so"
@@ -395,13 +400,13 @@ func (library *libraryDecorator) linkStatic(ctx ModuleContext,
library.objects = library.objects.Append(objs)
outputFile := android.PathForModuleOut(ctx,
- ctx.ModuleName()+library.Properties.VariantName+staticLibraryExtension)
+ ctx.ModuleName()+library.MutatedProperties.VariantName+staticLibraryExtension)
builderFlags := flagsToBuilderFlags(flags)
TransformObjToStaticLib(ctx, library.objects.objFiles, builderFlags, outputFile, objs.tidyFiles)
library.coverageOutputFile = TransformCoverageFilesToLib(ctx, library.objects, builderFlags,
- ctx.ModuleName()+library.Properties.VariantName)
+ ctx.ModuleName()+library.MutatedProperties.VariantName)
library.wholeStaticMissingDeps = ctx.GetMissingDependencies()
@@ -522,7 +527,7 @@ func (library *libraryDecorator) link(ctx ModuleContext,
objs = objs.Append(deps.Objs)
var out android.Path
- if library.static() {
+ if library.static() || library.header() {
out = library.linkStatic(ctx, flags, deps, objs)
} else {
out = library.linkShared(ctx, flags, deps, objs)
@@ -555,12 +560,12 @@ func (library *libraryDecorator) link(ctx ModuleContext,
}
func (library *libraryDecorator) buildStatic() bool {
- return library.Properties.BuildStatic &&
+ return library.MutatedProperties.BuildStatic &&
(library.Properties.Static.Enabled == nil || *library.Properties.Static.Enabled)
}
func (library *libraryDecorator) buildShared() bool {
- return library.Properties.BuildShared &&
+ return library.MutatedProperties.BuildShared &&
(library.Properties.Shared.Enabled == nil || *library.Properties.Shared.Enabled)
}
@@ -587,31 +592,45 @@ func (library *libraryDecorator) install(ctx ModuleContext, file android.Path) {
}
func (library *libraryDecorator) static() bool {
- return library.Properties.VariantIsStatic
+ return library.MutatedProperties.VariantIsStatic
+}
+
+func (library *libraryDecorator) shared() bool {
+ return library.MutatedProperties.VariantIsShared
+}
+
+func (library *libraryDecorator) header() bool {
+ return !library.static() && !library.shared()
+}
+
+func (library *libraryDecorator) setStatic() {
+ library.MutatedProperties.VariantIsStatic = true
+ library.MutatedProperties.VariantIsShared = false
}
-func (library *libraryDecorator) setStatic(static bool) {
- library.Properties.VariantIsStatic = static
+func (library *libraryDecorator) setShared() {
+ library.MutatedProperties.VariantIsStatic = false
+ library.MutatedProperties.VariantIsShared = true
}
func (library *libraryDecorator) BuildOnlyStatic() {
- library.Properties.BuildShared = false
+ library.MutatedProperties.BuildShared = false
}
func (library *libraryDecorator) BuildOnlyShared() {
- library.Properties.BuildStatic = false
+ library.MutatedProperties.BuildStatic = false
}
func (library *libraryDecorator) HeaderOnly() {
- library.Properties.BuildShared = false
- library.Properties.BuildStatic = false
+ library.MutatedProperties.BuildShared = false
+ library.MutatedProperties.BuildStatic = false
}
func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
module := newModule(hod, android.MultilibBoth)
library := &libraryDecorator{
- Properties: LibraryProperties{
+ MutatedProperties: LibraryMutatedProperties{
BuildShared: true,
BuildStatic: true,
},
@@ -637,8 +656,8 @@ func linkageMutator(mctx android.BottomUpMutatorContext) {
static := modules[0].(*Module)
shared := modules[1].(*Module)
- static.linker.(libraryInterface).setStatic(true)
- shared.linker.(libraryInterface).setStatic(false)
+ static.linker.(libraryInterface).setStatic()
+ shared.linker.(libraryInterface).setShared()
if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
sharedCompiler := shared.compiler.(*libraryDecorator)
@@ -652,10 +671,10 @@ func linkageMutator(mctx android.BottomUpMutatorContext) {
}
} else if library.buildStatic() {
modules = mctx.CreateLocalVariations("static")
- modules[0].(*Module).linker.(libraryInterface).setStatic(true)
+ modules[0].(*Module).linker.(libraryInterface).setStatic()
} else if library.buildShared() {
modules = mctx.CreateLocalVariations("shared")
- modules[0].(*Module).linker.(libraryInterface).setStatic(false)
+ modules[0].(*Module).linker.(libraryInterface).setShared()
}
}
}
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index da3d5c7b..6ebd0c46 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -335,7 +335,7 @@ func newStubLibrary() (*Module, []interface{}) {
module.linker = stub
module.installer = stub
- return module, []interface{}{&stub.properties}
+ return module, []interface{}{&stub.properties, &library.MutatedProperties}
}
func ndkLibraryFactory() (blueprint.Module, []interface{}) {
diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go
index 676d63d0..f1bd3b52 100644
--- a/cc/ndk_prebuilt.go
+++ b/cc/ndk_prebuilt.go
@@ -194,7 +194,7 @@ func (ndk *ndkPrebuiltStlLinker) link(ctx ModuleContext, flags Flags,
libName := strings.TrimPrefix(ctx.ModuleName(), "ndk_")
libExt := flags.Toolchain.ShlibSuffix()
- if ndk.Properties.BuildStatic {
+ if ndk.static() {
libExt = staticLibraryExtension
}