1// 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 "android/soong/android" 19) 20 21// 22// Device libraries shipped with gcc 23// 24 25func init() { 26 android.RegisterModuleType("toolchain_library", ToolchainLibraryFactory) 27} 28 29type toolchainLibraryProperties struct { 30 // the prebuilt toolchain library, as a path from the top of the source tree 31 Src *string `android:"arch_variant"` 32 33 // Repack the archive with only the selected objects. 34 Repack_objects_to_keep []string `android:"arch_variant"` 35} 36 37type toolchainLibraryDecorator struct { 38 *libraryDecorator 39 40 stripper 41 42 Properties toolchainLibraryProperties 43} 44 45func (*toolchainLibraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { 46 // toolchain libraries can't have any dependencies 47 return deps 48} 49 50func (library *toolchainLibraryDecorator) linkerProps() []interface{} { 51 var props []interface{} 52 props = append(props, library.libraryDecorator.linkerProps()...) 53 return append(props, &library.Properties, &library.stripper.StripProperties) 54} 55 56// toolchain_library is used internally by the build tool to link the specified 57// static library in src property to the device libraries that are shipped with 58// gcc. 59func ToolchainLibraryFactory() android.Module { 60 module, library := NewLibrary(android.HostAndDeviceSupported) 61 library.BuildOnlyStatic() 62 toolchainLibrary := &toolchainLibraryDecorator{ 63 libraryDecorator: library, 64 } 65 module.compiler = toolchainLibrary 66 module.linker = toolchainLibrary 67 module.stl = nil 68 module.sanitize = nil 69 module.installer = nil 70 module.Properties.Sdk_version = StringPtr("current") 71 return module.Init() 72} 73 74func (library *toolchainLibraryDecorator) compile(ctx ModuleContext, flags Flags, 75 deps PathDeps) Objects { 76 return Objects{} 77} 78 79func (library *toolchainLibraryDecorator) link(ctx ModuleContext, 80 flags Flags, deps PathDeps, objs Objects) android.Path { 81 82 if library.Properties.Src == nil { 83 ctx.PropertyErrorf("src", "No library source specified") 84 return android.PathForSource(ctx, "") 85 } 86 87 srcPath := android.PathForSource(ctx, *library.Properties.Src) 88 89 if library.stripper.StripProperties.Strip.Keep_symbols_list != nil { 90 fileName := ctx.ModuleName() + staticLibraryExtension 91 outputFile := android.PathForModuleOut(ctx, fileName) 92 buildFlags := flagsToBuilderFlags(flags) 93 library.stripper.stripStaticLib(ctx, srcPath, outputFile, buildFlags) 94 return outputFile 95 } 96 97 if library.Properties.Repack_objects_to_keep != nil { 98 fileName := ctx.ModuleName() + staticLibraryExtension 99 outputFile := android.PathForModuleOut(ctx, fileName) 100 TransformArchiveRepack(ctx, srcPath, outputFile, library.Properties.Repack_objects_to_keep) 101 102 return outputFile 103 } 104 105 return srcPath 106} 107 108func (library *toolchainLibraryDecorator) nativeCoverage() bool { 109 return false 110} 111