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

     1  // Copyright 2017 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  	"path/filepath"
    19  	"strings"
    20  
    21  	"android/soong/android"
    22  )
    23  
    24  var (
    25  	llndkLibrarySuffix = ".llndk"
    26  	llndkHeadersSuffix = ".llndk"
    27  )
    28  
    29  // Creates a stub shared library based on the provided version file.
    30  //
    31  // Example:
    32  //
    33  // llndk_library {
    34  //     name: "libfoo",
    35  //     symbol_file: "libfoo.map.txt",
    36  //     export_include_dirs: ["include_vndk"],
    37  // }
    38  //
    39  type llndkLibraryProperties struct {
    40  	// Relative path to the symbol map.
    41  	// An example file can be seen here: TODO(danalbert): Make an example.
    42  	Symbol_file *string
    43  
    44  	// Whether to export any headers as -isystem instead of -I. Mainly for use by
    45  	// bionic/libc.
    46  	Export_headers_as_system *bool
    47  
    48  	// Which headers to process with versioner. This really only handles
    49  	// bionic/libc/include right now.
    50  	Export_preprocessed_headers []string
    51  
    52  	// Whether the system library uses symbol versions.
    53  	Unversioned *bool
    54  
    55  	// whether this module can be directly depended upon by libs that are installed to /vendor.
    56  	// When set to false, this module can only be depended on by VNDK libraries, not vendor
    57  	// libraries. This effectively hides this module from vendors. Default value is true.
    58  	Vendor_available *bool
    59  
    60  	// list of llndk headers to re-export include directories from.
    61  	Export_llndk_headers []string `android:"arch_variant"`
    62  }
    63  
    64  type llndkStubDecorator struct {
    65  	*libraryDecorator
    66  
    67  	Properties llndkLibraryProperties
    68  
    69  	exportHeadersTimestamp android.OptionalPath
    70  	versionScriptPath      android.ModuleGenPath
    71  }
    72  
    73  func (stub *llndkStubDecorator) compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags {
    74  	flags = stub.baseCompiler.compilerFlags(ctx, flags, deps)
    75  	return addStubLibraryCompilerFlags(flags)
    76  }
    77  
    78  func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
    79  	vndk_ver := ctx.DeviceConfig().VndkVersion()
    80  	if vndk_ver == "current" {
    81  		platform_vndk_ver := ctx.DeviceConfig().PlatformVndkVersion()
    82  		if !inList(platform_vndk_ver, ctx.Config().PlatformVersionCombinedCodenames()) {
    83  			vndk_ver = platform_vndk_ver
    84  		}
    85  	} else if vndk_ver == "" {
    86  		// For non-enforcing devices, use "current"
    87  		vndk_ver = "current"
    88  	}
    89  	objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndk_ver, "--vndk")
    90  	stub.versionScriptPath = versionScript
    91  	return objs
    92  }
    93  
    94  func (stub *llndkStubDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
    95  	headers := addSuffix(stub.Properties.Export_llndk_headers, llndkHeadersSuffix)
    96  	deps.HeaderLibs = append(deps.HeaderLibs, headers...)
    97  	deps.ReexportHeaderLibHeaders = append(deps.ReexportHeaderLibHeaders, headers...)
    98  	return deps
    99  }
   100  
   101  func (stub *llndkStubDecorator) Name(name string) string {
   102  	return name + llndkLibrarySuffix
   103  }
   104  
   105  func (stub *llndkStubDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
   106  	stub.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(),
   107  		llndkLibrarySuffix)
   108  	return stub.libraryDecorator.linkerFlags(ctx, flags)
   109  }
   110  
   111  func (stub *llndkStubDecorator) processHeaders(ctx ModuleContext, srcHeaderDir string, outDir android.ModuleGenPath) android.Path {
   112  	srcDir := android.PathForModuleSrc(ctx, srcHeaderDir)
   113  	srcFiles := ctx.GlobFiles(filepath.Join(srcDir.String(), "**/*.h"), nil)
   114  
   115  	var installPaths []android.WritablePath
   116  	for _, header := range srcFiles {
   117  		headerDir := filepath.Dir(header.String())
   118  		relHeaderDir, err := filepath.Rel(srcDir.String(), headerDir)
   119  		if err != nil {
   120  			ctx.ModuleErrorf("filepath.Rel(%q, %q) failed: %s",
   121  				srcDir.String(), headerDir, err)
   122  			continue
   123  		}
   124  
   125  		installPaths = append(installPaths, outDir.Join(ctx, relHeaderDir, header.Base()))
   126  	}
   127  
   128  	return processHeadersWithVersioner(ctx, srcDir, outDir, srcFiles, installPaths)
   129  }
   130  
   131  func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
   132  	objs Objects) android.Path {
   133  
   134  	if !Bool(stub.Properties.Unversioned) {
   135  		linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String()
   136  		flags.LdFlags = append(flags.LdFlags, linkerScriptFlag)
   137  	}
   138  
   139  	if len(stub.Properties.Export_preprocessed_headers) > 0 {
   140  		genHeaderOutDir := android.PathForModuleGen(ctx, "include")
   141  
   142  		var timestampFiles android.Paths
   143  		for _, dir := range stub.Properties.Export_preprocessed_headers {
   144  			timestampFiles = append(timestampFiles, stub.processHeaders(ctx, dir, genHeaderOutDir))
   145  		}
   146  
   147  		includePrefix := "-I "
   148  		if Bool(stub.Properties.Export_headers_as_system) {
   149  			includePrefix = "-isystem "
   150  		}
   151  
   152  		stub.reexportFlags([]string{includePrefix + " " + genHeaderOutDir.String()})
   153  		stub.reexportDeps(timestampFiles)
   154  	}
   155  
   156  	if Bool(stub.Properties.Export_headers_as_system) {
   157  		stub.exportIncludes(ctx, "-isystem")
   158  		stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{}
   159  	}
   160  
   161  	return stub.libraryDecorator.link(ctx, flags, deps, objs)
   162  }
   163  
   164  func NewLLndkStubLibrary() *Module {
   165  	module, library := NewLibrary(android.DeviceSupported)
   166  	library.BuildOnlyShared()
   167  	module.stl = nil
   168  	module.sanitize = nil
   169  	library.StripProperties.Strip.None = BoolPtr(true)
   170  
   171  	stub := &llndkStubDecorator{
   172  		libraryDecorator: library,
   173  	}
   174  	stub.Properties.Vendor_available = BoolPtr(true)
   175  	module.compiler = stub
   176  	module.linker = stub
   177  	module.installer = nil
   178  
   179  	module.AddProperties(
   180  		&stub.Properties,
   181  		&library.MutatedProperties,
   182  		&library.flagExporter.Properties)
   183  
   184  	return module
   185  }
   186  
   187  func llndkLibraryFactory() android.Module {
   188  	module := NewLLndkStubLibrary()
   189  	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
   190  	return module
   191  }
   192  
   193  type llndkHeadersDecorator struct {
   194  	*libraryDecorator
   195  }
   196  
   197  func (headers *llndkHeadersDecorator) Name(name string) string {
   198  	return name + llndkHeadersSuffix
   199  }
   200  
   201  func llndkHeadersFactory() android.Module {
   202  	module, library := NewLibrary(android.DeviceSupported)
   203  	library.HeaderOnly()
   204  
   205  	decorator := &llndkHeadersDecorator{
   206  		libraryDecorator: library,
   207  	}
   208  
   209  	module.compiler = nil
   210  	module.linker = decorator
   211  	module.installer = nil
   212  
   213  	module.AddProperties(&library.MutatedProperties, &library.flagExporter.Properties)
   214  
   215  	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
   216  
   217  	return module
   218  }
   219  
   220  func init() {
   221  	android.RegisterModuleType("llndk_library", llndkLibraryFactory)
   222  	android.RegisterModuleType("llndk_headers", llndkHeadersFactory)
   223  }