blob: cc5ff15bdc274e3a0eb5f257822391a6b3be8138 [file] [log] [blame]
Colin Cross4d9c2d12016-07-29 12:48:20 -07001// Copyright 2016 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17import (
18 "strings"
19
20 "github.com/google/blueprint"
21
22 "android/soong"
23 "android/soong/android"
24)
25
Colin Crossb916a382016-07-29 17:28:03 -070026type LibraryProperties struct {
Colin Cross4d9c2d12016-07-29 12:48:20 -070027 Static struct {
28 Srcs []string `android:"arch_variant"`
29 Exclude_srcs []string `android:"arch_variant"`
30 Cflags []string `android:"arch_variant"`
Colin Cross4d9c2d12016-07-29 12:48:20 -070031
Colin Cross4d9c2d12016-07-29 12:48:20 -070032 Enabled *bool `android:"arch_variant"`
33 Whole_static_libs []string `android:"arch_variant"`
34 Static_libs []string `android:"arch_variant"`
35 Shared_libs []string `android:"arch_variant"`
36 } `android:"arch_variant"`
37 Shared struct {
Colin Crossb916a382016-07-29 17:28:03 -070038 Srcs []string `android:"arch_variant"`
39 Exclude_srcs []string `android:"arch_variant"`
40 Cflags []string `android:"arch_variant"`
41
Colin Cross4d9c2d12016-07-29 12:48:20 -070042 Enabled *bool `android:"arch_variant"`
43 Whole_static_libs []string `android:"arch_variant"`
44 Static_libs []string `android:"arch_variant"`
45 Shared_libs []string `android:"arch_variant"`
46 } `android:"arch_variant"`
47
48 // local file name to pass to the linker as --version_script
49 Version_script *string `android:"arch_variant"`
50 // local file name to pass to the linker as -unexported_symbols_list
51 Unexported_symbols_list *string `android:"arch_variant"`
52 // local file name to pass to the linker as -force_symbols_not_weak_list
53 Force_symbols_not_weak_list *string `android:"arch_variant"`
54 // local file name to pass to the linker as -force_symbols_weak_list
55 Force_symbols_weak_list *string `android:"arch_variant"`
56
57 // rename host libraries to prevent overlap with system installed libraries
58 Unique_host_soname *bool
59
60 VariantName string `blueprint:"mutated"`
Colin Crossb916a382016-07-29 17:28:03 -070061
62 // Build a static variant
63 BuildStatic bool `blueprint:"mutated"`
64 // Build a shared variant
65 BuildShared bool `blueprint:"mutated"`
66 // This variant is shared
67 VariantIsShared bool `blueprint:"mutated"`
68 // This variant is static
69 VariantIsStatic bool `blueprint:"mutated"`
70}
71
72type FlagExporterProperties struct {
73 // list of directories relative to the Blueprints file that will
74 // be added to the include path using -I for any module that links against this module
75 Export_include_dirs []string `android:"arch_variant"`
Colin Cross4d9c2d12016-07-29 12:48:20 -070076}
77
78func init() {
79 soong.RegisterModuleType("cc_library_static", libraryStaticFactory)
80 soong.RegisterModuleType("cc_library_shared", librarySharedFactory)
81 soong.RegisterModuleType("cc_library", libraryFactory)
82 soong.RegisterModuleType("cc_library_host_static", libraryHostStaticFactory)
83 soong.RegisterModuleType("cc_library_host_shared", libraryHostSharedFactory)
84}
85
86// Module factory for combined static + shared libraries, device by default but with possible host
87// support
88func libraryFactory() (blueprint.Module, []interface{}) {
Colin Crossb916a382016-07-29 17:28:03 -070089 module, _ := NewLibrary(android.HostAndDeviceSupported, true, true)
Colin Cross4d9c2d12016-07-29 12:48:20 -070090 return module.Init()
91}
92
93// Module factory for static libraries
94func libraryStaticFactory() (blueprint.Module, []interface{}) {
Colin Crossb916a382016-07-29 17:28:03 -070095 module, _ := NewLibrary(android.HostAndDeviceSupported, false, true)
Colin Cross4d9c2d12016-07-29 12:48:20 -070096 return module.Init()
97}
98
99// Module factory for shared libraries
100func librarySharedFactory() (blueprint.Module, []interface{}) {
Colin Crossb916a382016-07-29 17:28:03 -0700101 module, _ := NewLibrary(android.HostAndDeviceSupported, true, false)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700102 return module.Init()
103}
104
105// Module factory for host static libraries
106func libraryHostStaticFactory() (blueprint.Module, []interface{}) {
Colin Crossb916a382016-07-29 17:28:03 -0700107 module, _ := NewLibrary(android.HostSupported, false, true)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700108 return module.Init()
109}
110
111// Module factory for host shared libraries
112func libraryHostSharedFactory() (blueprint.Module, []interface{}) {
Colin Crossb916a382016-07-29 17:28:03 -0700113 module, _ := NewLibrary(android.HostSupported, true, false)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700114 return module.Init()
115}
116
117type flagExporter struct {
118 Properties FlagExporterProperties
119
120 flags []string
121}
122
123func (f *flagExporter) exportIncludes(ctx ModuleContext, inc string) {
124 includeDirs := android.PathsForModuleSrc(ctx, f.Properties.Export_include_dirs)
125 for _, dir := range includeDirs.Strings() {
126 f.flags = append(f.flags, inc+dir)
127 }
128}
129
130func (f *flagExporter) reexportFlags(flags []string) {
131 f.flags = append(f.flags, flags...)
132}
133
134func (f *flagExporter) exportedFlags() []string {
135 return f.flags
136}
137
138type exportedFlagsProducer interface {
139 exportedFlags() []string
140}
141
142var _ exportedFlagsProducer = (*flagExporter)(nil)
143
Colin Crossb916a382016-07-29 17:28:03 -0700144// libraryDecorator wraps baseCompiler, baseLinker and baseInstaller to provide library-specific
145// functionality: static vs. shared linkage, reusing object files for shared libraries
146type libraryDecorator struct {
147 Properties LibraryProperties
Colin Cross4d9c2d12016-07-29 12:48:20 -0700148
149 // For reusing static library objects for shared library
150 reuseObjFiles android.Paths
Colin Cross4d9c2d12016-07-29 12:48:20 -0700151
Colin Cross4d9c2d12016-07-29 12:48:20 -0700152 flagExporter
153 stripper
Dan Willemsen394e9dc2016-09-14 15:04:48 -0700154 relocationPacker
Colin Cross4d9c2d12016-07-29 12:48:20 -0700155
Colin Cross4d9c2d12016-07-29 12:48:20 -0700156 // If we're used as a whole_static_lib, our missing dependencies need
157 // to be given
158 wholeStaticMissingDeps []string
159
160 // For whole_static_libs
161 objFiles android.Paths
162
163 // Uses the module's name if empty, but can be overridden. Does not include
164 // shlib suffix.
165 libName string
Colin Crossb916a382016-07-29 17:28:03 -0700166
167 sanitize *sanitize
168
169 // Decorated interafaces
170 *baseCompiler
171 *baseLinker
172 *baseInstaller
Colin Cross4d9c2d12016-07-29 12:48:20 -0700173}
174
Colin Crossb916a382016-07-29 17:28:03 -0700175func (library *libraryDecorator) linkerProps() []interface{} {
176 var props []interface{}
177 props = append(props, library.baseLinker.linkerProps()...)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700178 return append(props,
179 &library.Properties,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700180 &library.flagExporter.Properties,
Dan Willemsen394e9dc2016-09-14 15:04:48 -0700181 &library.stripper.StripProperties,
182 &library.relocationPacker.Properties)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700183}
184
Colin Crossb916a382016-07-29 17:28:03 -0700185func (library *libraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
Colin Cross42742b82016-08-01 13:20:05 -0700186 flags = library.baseLinker.linkerFlags(ctx, flags)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700187
Colin Crossb916a382016-07-29 17:28:03 -0700188 // MinGW spits out warnings about -fPIC even for -fpie?!) being ignored because
189 // all code is position independent, and then those warnings get promoted to
190 // errors.
191 if ctx.Os() != android.Windows {
192 flags.CFlags = append(flags.CFlags, "-fPIC")
193 }
194
195 if library.static() {
196 flags.CFlags = append(flags.CFlags, library.Properties.Static.Cflags...)
197 } else {
198 flags.CFlags = append(flags.CFlags, library.Properties.Shared.Cflags...)
199 }
200
Colin Cross4d9c2d12016-07-29 12:48:20 -0700201 if !library.static() {
202 libName := library.getLibName(ctx)
203 // GCC for Android assumes that -shared means -Bsymbolic, use -Wl,-shared instead
204 sharedFlag := "-Wl,-shared"
205 if flags.Clang || ctx.Host() {
206 sharedFlag = "-shared"
207 }
208 var f []string
209 if ctx.Device() {
210 f = append(f,
211 "-nostdlib",
212 "-Wl,--gc-sections",
213 )
214 }
215
216 if ctx.Darwin() {
217 f = append(f,
218 "-dynamiclib",
219 "-single_module",
Colin Cross7d82ab72016-08-25 16:54:53 -0700220 "-read_only_relocs suppress",
Colin Cross4d9c2d12016-07-29 12:48:20 -0700221 "-install_name @rpath/"+libName+flags.Toolchain.ShlibSuffix(),
222 )
223 } else {
224 f = append(f,
225 sharedFlag,
226 "-Wl,-soname,"+libName+flags.Toolchain.ShlibSuffix())
227 }
228
229 flags.LdFlags = append(f, flags.LdFlags...)
230 }
231
232 return flags
233}
234
Colin Crossb916a382016-07-29 17:28:03 -0700235func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Paths {
236 var objFiles android.Paths
237
238 objFiles = library.baseCompiler.compile(ctx, flags, deps)
239 library.reuseObjFiles = objFiles
240
241 pathDeps := deps.GeneratedHeaders
242 pathDeps = append(pathDeps, ndkPathDeps(ctx)...)
243
Colin Cross4d9c2d12016-07-29 12:48:20 -0700244 if library.static() {
Colin Crossb916a382016-07-29 17:28:03 -0700245 objFiles = append(objFiles, compileObjs(ctx, flags, android.DeviceStaticLibrary,
246 library.Properties.Static.Srcs, library.Properties.Static.Exclude_srcs,
247 nil, pathDeps)...)
248 } else {
249 objFiles = append(objFiles, compileObjs(ctx, flags, android.DeviceSharedLibrary,
250 library.Properties.Shared.Srcs, library.Properties.Shared.Exclude_srcs,
251 nil, pathDeps)...)
252 }
253
254 return objFiles
255}
256
257type libraryInterface interface {
258 getWholeStaticMissingDeps() []string
259 static() bool
260 objs() android.Paths
261 reuseObjs() android.Paths
262
263 // Returns true if the build options for the module have selected a static or shared build
264 buildStatic() bool
265 buildShared() bool
266
267 // Sets whether a specific variant is static or shared
268 setStatic(bool)
269}
270
271func (library *libraryDecorator) getLibName(ctx ModuleContext) string {
272 name := library.libName
273 if name == "" {
274 name = ctx.ModuleName()
275 }
276
277 if ctx.Host() && Bool(library.Properties.Unique_host_soname) {
278 if !strings.HasSuffix(name, "-host") {
279 name = name + "-host"
280 }
281 }
282
283 return name + library.Properties.VariantName
284}
285
286func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) {
287 location := InstallInSystem
288 if library.sanitize.inData() {
289 location = InstallInData
290 }
291 library.baseInstaller.location = location
292
293 library.baseLinker.linkerInit(ctx)
Dan Willemsen394e9dc2016-09-14 15:04:48 -0700294
295 library.relocationPacker.packingInit(ctx)
Colin Crossb916a382016-07-29 17:28:03 -0700296}
297
298func (library *libraryDecorator) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
299 deps = library.baseLinker.linkerDeps(ctx, deps)
300
301 if library.static() {
302 deps.WholeStaticLibs = append(deps.WholeStaticLibs,
303 library.Properties.Static.Whole_static_libs...)
Colin Cross4d9c2d12016-07-29 12:48:20 -0700304 deps.StaticLibs = append(deps.StaticLibs, library.Properties.Static.Static_libs...)
305 deps.SharedLibs = append(deps.SharedLibs, library.Properties.Static.Shared_libs...)
306 } else {
307 if ctx.Device() && !Bool(library.baseLinker.Properties.Nocrt) {
308 if !ctx.sdk() {
309 deps.CrtBegin = "crtbegin_so"
310 deps.CrtEnd = "crtend_so"
311 } else {
312 deps.CrtBegin = "ndk_crtbegin_so." + ctx.sdkVersion()
313 deps.CrtEnd = "ndk_crtend_so." + ctx.sdkVersion()
314 }
315 }
316 deps.WholeStaticLibs = append(deps.WholeStaticLibs, library.Properties.Shared.Whole_static_libs...)
317 deps.StaticLibs = append(deps.StaticLibs, library.Properties.Shared.Static_libs...)
318 deps.SharedLibs = append(deps.SharedLibs, library.Properties.Shared.Shared_libs...)
319 }
320
321 return deps
322}
323
Colin Crossb916a382016-07-29 17:28:03 -0700324func (library *libraryDecorator) linkStatic(ctx ModuleContext,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700325 flags Flags, deps PathDeps, objFiles android.Paths) android.Path {
326
327 library.objFiles = append(android.Paths{}, deps.WholeStaticLibObjFiles...)
328 library.objFiles = append(library.objFiles, objFiles...)
329
330 outputFile := android.PathForModuleOut(ctx,
331 ctx.ModuleName()+library.Properties.VariantName+staticLibraryExtension)
332
333 if ctx.Darwin() {
334 TransformDarwinObjToStaticLib(ctx, library.objFiles, flagsToBuilderFlags(flags), outputFile)
335 } else {
336 TransformObjToStaticLib(ctx, library.objFiles, flagsToBuilderFlags(flags), outputFile)
337 }
338
339 library.wholeStaticMissingDeps = ctx.GetMissingDependencies()
340
341 ctx.CheckbuildFile(outputFile)
342
343 return outputFile
344}
345
Colin Crossb916a382016-07-29 17:28:03 -0700346func (library *libraryDecorator) linkShared(ctx ModuleContext,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700347 flags Flags, deps PathDeps, objFiles android.Paths) android.Path {
348
349 var linkerDeps android.Paths
350
351 versionScript := android.OptionalPathForModuleSrc(ctx, library.Properties.Version_script)
352 unexportedSymbols := android.OptionalPathForModuleSrc(ctx, library.Properties.Unexported_symbols_list)
353 forceNotWeakSymbols := android.OptionalPathForModuleSrc(ctx, library.Properties.Force_symbols_not_weak_list)
354 forceWeakSymbols := android.OptionalPathForModuleSrc(ctx, library.Properties.Force_symbols_weak_list)
355 if !ctx.Darwin() {
356 if versionScript.Valid() {
357 flags.LdFlags = append(flags.LdFlags, "-Wl,--version-script,"+versionScript.String())
358 linkerDeps = append(linkerDeps, versionScript.Path())
359 }
360 if unexportedSymbols.Valid() {
361 ctx.PropertyErrorf("unexported_symbols_list", "Only supported on Darwin")
362 }
363 if forceNotWeakSymbols.Valid() {
364 ctx.PropertyErrorf("force_symbols_not_weak_list", "Only supported on Darwin")
365 }
366 if forceWeakSymbols.Valid() {
367 ctx.PropertyErrorf("force_symbols_weak_list", "Only supported on Darwin")
368 }
369 } else {
370 if versionScript.Valid() {
371 ctx.PropertyErrorf("version_script", "Not supported on Darwin")
372 }
373 if unexportedSymbols.Valid() {
374 flags.LdFlags = append(flags.LdFlags, "-Wl,-unexported_symbols_list,"+unexportedSymbols.String())
375 linkerDeps = append(linkerDeps, unexportedSymbols.Path())
376 }
377 if forceNotWeakSymbols.Valid() {
378 flags.LdFlags = append(flags.LdFlags, "-Wl,-force_symbols_not_weak_list,"+forceNotWeakSymbols.String())
379 linkerDeps = append(linkerDeps, forceNotWeakSymbols.Path())
380 }
381 if forceWeakSymbols.Valid() {
382 flags.LdFlags = append(flags.LdFlags, "-Wl,-force_symbols_weak_list,"+forceWeakSymbols.String())
383 linkerDeps = append(linkerDeps, forceWeakSymbols.Path())
384 }
385 }
386
387 fileName := library.getLibName(ctx) + flags.Toolchain.ShlibSuffix()
388 outputFile := android.PathForModuleOut(ctx, fileName)
389 ret := outputFile
390
391 builderFlags := flagsToBuilderFlags(flags)
392
Dan Willemsen394e9dc2016-09-14 15:04:48 -0700393 if library.relocationPacker.needsPacking(ctx) {
394 packedOutputFile := outputFile
395 outputFile = android.PathForModuleOut(ctx, "unpacked", fileName)
396 library.relocationPacker.pack(ctx, outputFile, packedOutputFile, builderFlags)
397 }
398
Colin Cross4d9c2d12016-07-29 12:48:20 -0700399 if library.stripper.needsStrip(ctx) {
400 strippedOutputFile := outputFile
401 outputFile = android.PathForModuleOut(ctx, "unstripped", fileName)
402 library.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags)
403 }
404
405 sharedLibs := deps.SharedLibs
406 sharedLibs = append(sharedLibs, deps.LateSharedLibs...)
407
Dan Albertd015c4a2016-08-10 14:34:08 -0700408 // TODO(danalbert): Clean this up when soong supports prebuilts.
409 if strings.HasPrefix(ctx.selectedStl(), "ndk_libc++") {
410 libDir := getNdkStlLibDir(ctx, flags.Toolchain, "libc++")
411
412 if strings.HasSuffix(ctx.selectedStl(), "_shared") {
413 deps.StaticLibs = append(deps.StaticLibs,
414 libDir.Join(ctx, "libandroid_support.a"))
415 } else {
416 deps.StaticLibs = append(deps.StaticLibs,
417 libDir.Join(ctx, "libc++abi.a"),
418 libDir.Join(ctx, "libandroid_support.a"))
419 }
420
421 if ctx.Arch().ArchType == android.Arm {
422 deps.StaticLibs = append(deps.StaticLibs,
423 libDir.Join(ctx, "libunwind.a"))
424 }
425 }
426
Colin Cross4d9c2d12016-07-29 12:48:20 -0700427 TransformObjToDynamicBinary(ctx, objFiles, sharedLibs,
428 deps.StaticLibs, deps.LateStaticLibs, deps.WholeStaticLibs,
429 linkerDeps, deps.CrtBegin, deps.CrtEnd, false, builderFlags, outputFile)
430
431 return ret
432}
433
Colin Crossb916a382016-07-29 17:28:03 -0700434func (library *libraryDecorator) link(ctx ModuleContext,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700435 flags Flags, deps PathDeps, objFiles android.Paths) android.Path {
436
437 objFiles = append(objFiles, deps.ObjFiles...)
438
439 var out android.Path
440 if library.static() {
441 out = library.linkStatic(ctx, flags, deps, objFiles)
442 } else {
443 out = library.linkShared(ctx, flags, deps, objFiles)
444 }
445
446 library.exportIncludes(ctx, "-I")
447 library.reexportFlags(deps.ReexportedFlags)
448
449 return out
450}
451
Colin Crossb916a382016-07-29 17:28:03 -0700452func (library *libraryDecorator) buildStatic() bool {
453 return library.Properties.BuildStatic &&
Colin Cross4d9c2d12016-07-29 12:48:20 -0700454 (library.Properties.Static.Enabled == nil || *library.Properties.Static.Enabled)
455}
456
Colin Crossb916a382016-07-29 17:28:03 -0700457func (library *libraryDecorator) buildShared() bool {
458 return library.Properties.BuildShared &&
Colin Cross4d9c2d12016-07-29 12:48:20 -0700459 (library.Properties.Shared.Enabled == nil || *library.Properties.Shared.Enabled)
460}
461
Colin Crossb916a382016-07-29 17:28:03 -0700462func (library *libraryDecorator) getWholeStaticMissingDeps() []string {
Colin Cross4d9c2d12016-07-29 12:48:20 -0700463 return library.wholeStaticMissingDeps
464}
465
Colin Crossb916a382016-07-29 17:28:03 -0700466func (library *libraryDecorator) objs() android.Paths {
Colin Cross4d9c2d12016-07-29 12:48:20 -0700467 return library.objFiles
468}
469
Colin Crossb916a382016-07-29 17:28:03 -0700470func (library *libraryDecorator) reuseObjs() android.Paths {
471 return library.reuseObjFiles
Colin Cross4d9c2d12016-07-29 12:48:20 -0700472}
473
Colin Crossb916a382016-07-29 17:28:03 -0700474func (library *libraryDecorator) install(ctx ModuleContext, file android.Path) {
475 if !ctx.static() {
Colin Cross4d9c2d12016-07-29 12:48:20 -0700476 library.baseInstaller.install(ctx, file)
477 }
478}
479
Colin Crossb916a382016-07-29 17:28:03 -0700480func (library *libraryDecorator) static() bool {
481 return library.Properties.VariantIsStatic
Colin Cross4d9c2d12016-07-29 12:48:20 -0700482}
483
Colin Crossb916a382016-07-29 17:28:03 -0700484func (library *libraryDecorator) setStatic(static bool) {
485 library.Properties.VariantIsStatic = static
486}
487
488func NewLibrary(hod android.HostOrDeviceSupported, shared, static bool) (*Module, *libraryDecorator) {
Colin Cross4d9c2d12016-07-29 12:48:20 -0700489 module := newModule(hod, android.MultilibBoth)
490
Colin Crossb916a382016-07-29 17:28:03 -0700491 library := &libraryDecorator{
492 Properties: LibraryProperties{
493 BuildShared: shared,
494 BuildStatic: static,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700495 },
Colin Crossb916a382016-07-29 17:28:03 -0700496 baseCompiler: NewBaseCompiler(),
497 baseLinker: NewBaseLinker(),
498 baseInstaller: NewBaseInstaller("lib", "lib64", InstallInSystem),
499 sanitize: module.sanitize,
Colin Cross4d9c2d12016-07-29 12:48:20 -0700500 }
501
Colin Crossb916a382016-07-29 17:28:03 -0700502 module.compiler = library
503 module.linker = library
504 module.installer = library
505
506 return module, library
507}
508
509func linkageMutator(mctx android.BottomUpMutatorContext) {
510 if m, ok := mctx.Module().(*Module); ok && m.linker != nil {
511 if library, ok := m.linker.(libraryInterface); ok {
512 var modules []blueprint.Module
513 if library.buildStatic() && library.buildShared() {
514 modules = mctx.CreateLocalVariations("static", "shared")
515 static := modules[0].(*Module)
516 shared := modules[1].(*Module)
517
518 static.linker.(libraryInterface).setStatic(true)
519 shared.linker.(libraryInterface).setStatic(false)
520
521 if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
522 sharedCompiler := shared.compiler.(*libraryDecorator)
523 if len(staticCompiler.Properties.Static.Cflags) == 0 &&
524 len(sharedCompiler.Properties.Shared.Cflags) == 0 {
525 // Optimize out compiling common .o files twice for static+shared libraries
526 mctx.AddInterVariantDependency(reuseObjTag, shared, static)
527 sharedCompiler.baseCompiler.Properties.Srcs = nil
528 sharedCompiler.baseCompiler.Properties.Generated_sources = nil
529 }
530 }
531 } else if library.buildStatic() {
532 modules = mctx.CreateLocalVariations("static")
533 modules[0].(*Module).linker.(libraryInterface).setStatic(true)
534 } else if library.buildShared() {
535 modules = mctx.CreateLocalVariations("shared")
536 modules[0].(*Module).linker.(libraryInterface).setStatic(false)
537 }
538 }
539 }
Colin Cross4d9c2d12016-07-29 12:48:20 -0700540}