github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/vendor_public_library.go (about)

     1  // Copyright 2018 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  
    15  package cc
    16  
    17  import (
    18  	"strings"
    19  	"sync"
    20  
    21  	"android/soong/android"
    22  )
    23  
    24  var (
    25  	vendorPublicLibrarySuffix = ".vendorpublic"
    26  
    27  	vendorPublicLibraries     = []string{}
    28  	vendorPublicLibrariesLock sync.Mutex
    29  )
    30  
    31  // Creates a stub shared library for a vendor public library. Vendor public libraries
    32  // are vendor libraries (owned by them and installed to /vendor partition) that are
    33  // exposed to Android apps via JNI. The libraries are made public by being listed in
    34  // /vendor/etc/public.libraries.txt.
    35  //
    36  // This stub library is a build-time only artifact that provides symbols that are
    37  // exposed from a vendor public library.
    38  //
    39  // Example:
    40  //
    41  // vendor_public_library {
    42  //     name: "libfoo",
    43  //     symbol_file: "libfoo.map.txt",
    44  //     export_public_headers: ["libfoo_headers"],
    45  // }
    46  //
    47  // cc_headers {
    48  //     name: "libfoo_headers",
    49  //     export_include_dirs: ["include"],
    50  // }
    51  //
    52  type vendorPublicLibraryProperties struct {
    53  	// Relative path to the symbol map.
    54  	Symbol_file *string
    55  
    56  	// Whether the system library uses symbol versions.
    57  	Unversioned *bool
    58  
    59  	// list of header libs to re-export include directories from.
    60  	Export_public_headers []string `android:"arch_variant"`
    61  }
    62  
    63  type vendorPublicLibraryStubDecorator struct {
    64  	*libraryDecorator
    65  
    66  	Properties vendorPublicLibraryProperties
    67  
    68  	versionScriptPath android.ModuleGenPath
    69  }
    70  
    71  func (stub *vendorPublicLibraryStubDecorator) Name(name string) string {
    72  	return name + vendorPublicLibrarySuffix
    73  }
    74  
    75  func (stub *vendorPublicLibraryStubDecorator) compilerInit(ctx BaseModuleContext) {
    76  	stub.baseCompiler.compilerInit(ctx)
    77  
    78  	name := ctx.baseModuleName()
    79  	if strings.HasSuffix(name, vendorPublicLibrarySuffix) {
    80  		ctx.PropertyErrorf("name", "Do not append %q manually, just use the base name", vendorPublicLibrarySuffix)
    81  	}
    82  
    83  	vendorPublicLibrariesLock.Lock()
    84  	defer vendorPublicLibrariesLock.Unlock()
    85  	for _, lib := range vendorPublicLibraries {
    86  		if lib == name {
    87  			return
    88  		}
    89  	}
    90  	vendorPublicLibraries = append(vendorPublicLibraries, name)
    91  }
    92  
    93  func (stub *vendorPublicLibraryStubDecorator) compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags {
    94  	flags = stub.baseCompiler.compilerFlags(ctx, flags, deps)
    95  	return addStubLibraryCompilerFlags(flags)
    96  }
    97  
    98  func (stub *vendorPublicLibraryStubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
    99  	objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), "current", "")
   100  	stub.versionScriptPath = versionScript
   101  	return objs
   102  }
   103  
   104  func (stub *vendorPublicLibraryStubDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
   105  	headers := stub.Properties.Export_public_headers
   106  	deps.HeaderLibs = append(deps.HeaderLibs, headers...)
   107  	deps.ReexportHeaderLibHeaders = append(deps.ReexportHeaderLibHeaders, headers...)
   108  	return deps
   109  }
   110  
   111  func (stub *vendorPublicLibraryStubDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
   112  	stub.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), vendorPublicLibrarySuffix)
   113  	return stub.libraryDecorator.linkerFlags(ctx, flags)
   114  }
   115  
   116  func (stub *vendorPublicLibraryStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
   117  	objs Objects) android.Path {
   118  	if !Bool(stub.Properties.Unversioned) {
   119  		linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String()
   120  		flags.LdFlags = append(flags.LdFlags, linkerScriptFlag)
   121  	}
   122  	return stub.libraryDecorator.link(ctx, flags, deps, objs)
   123  }
   124  
   125  func vendorPublicLibraryFactory() android.Module {
   126  	module, library := NewLibrary(android.DeviceSupported)
   127  	library.BuildOnlyShared()
   128  	module.stl = nil
   129  	module.sanitize = nil
   130  	library.StripProperties.Strip.None = BoolPtr(true)
   131  
   132  	stub := &vendorPublicLibraryStubDecorator{
   133  		libraryDecorator: library,
   134  	}
   135  	module.compiler = stub
   136  	module.linker = stub
   137  	module.installer = nil
   138  
   139  	module.AddProperties(
   140  		&stub.Properties,
   141  		&library.MutatedProperties,
   142  		&library.flagExporter.Properties)
   143  
   144  	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
   145  	return module
   146  }
   147  
   148  func init() {
   149  	android.RegisterModuleType("vendor_public_library", vendorPublicLibraryFactory)
   150  }