2015-03-18 21:28:46 +01:00
|
|
|
// Copyright 2015 Google Inc. All rights reserved.
|
2015-01-31 02:27:36 +01:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package cc
|
|
|
|
|
|
|
|
// This file contains the module types for compiling C/C++ for Android, and converts the properties
|
|
|
|
// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
|
|
|
|
// is handled in builder.go
|
|
|
|
|
|
|
|
import (
|
2019-05-29 23:40:35 +02:00
|
|
|
"fmt"
|
2019-04-10 07:33:58 +02:00
|
|
|
"io"
|
2016-08-03 23:12:14 +02:00
|
|
|
"strconv"
|
2015-01-31 02:27:36 +01:00
|
|
|
"strings"
|
|
|
|
|
2015-03-24 01:50:24 +01:00
|
|
|
"github.com/google/blueprint"
|
2015-10-29 01:23:31 +01:00
|
|
|
"github.com/google/blueprint/proptools"
|
2015-03-24 01:50:24 +01:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
"android/soong/android"
|
2016-07-29 22:44:28 +02:00
|
|
|
"android/soong/cc/config"
|
2015-03-18 21:28:46 +01:00
|
|
|
"android/soong/genrule"
|
2015-01-31 02:27:36 +01:00
|
|
|
)
|
|
|
|
|
2015-06-17 23:20:06 +02:00
|
|
|
func init() {
|
2019-12-19 20:16:28 +01:00
|
|
|
RegisterCCBuildComponents(android.InitRegistrationContext)
|
2016-01-04 23:34:37 +01:00
|
|
|
|
2019-12-19 20:16:28 +01:00
|
|
|
pctx.Import("android/soong/cc/config")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RegisterCCBuildComponents(ctx android.RegistrationContext) {
|
|
|
|
ctx.RegisterModuleType("cc_defaults", defaultsFactory)
|
|
|
|
|
|
|
|
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
2020-04-07 18:50:32 +02:00
|
|
|
ctx.BottomUp("sdk", sdkMutator).Parallel()
|
2019-08-26 09:52:35 +02:00
|
|
|
ctx.BottomUp("vndk", VndkMutator).Parallel()
|
2018-10-03 07:25:58 +02:00
|
|
|
ctx.BottomUp("link", LinkageMutator).Parallel()
|
2019-06-28 16:41:19 +02:00
|
|
|
ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
|
2020-08-19 03:35:15 +02:00
|
|
|
ctx.BottomUp("version_selector", versionSelectorMutator).Parallel()
|
|
|
|
ctx.BottomUp("version", versionMutator).Parallel()
|
2018-10-03 07:25:58 +02:00
|
|
|
ctx.BottomUp("begin", BeginMutator).Parallel()
|
2019-12-09 10:15:47 +01:00
|
|
|
ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
|
2020-01-22 03:11:29 +01:00
|
|
|
ctx.BottomUp("vendor_snapshot", VendorSnapshotMutator).Parallel()
|
|
|
|
ctx.BottomUp("vendor_snapshot_source", VendorSnapshotSourceMutator).Parallel()
|
2016-10-12 23:38:15 +02:00
|
|
|
})
|
2016-01-06 23:41:07 +01:00
|
|
|
|
2019-12-19 20:16:28 +01:00
|
|
|
ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
2016-10-12 23:38:15 +02:00
|
|
|
ctx.TopDown("asan_deps", sanitizerDepsMutator(asan))
|
|
|
|
ctx.BottomUp("asan", sanitizerMutator(asan)).Parallel()
|
2016-01-06 23:41:07 +01:00
|
|
|
|
2018-08-03 01:19:13 +02:00
|
|
|
ctx.TopDown("hwasan_deps", sanitizerDepsMutator(hwasan))
|
|
|
|
ctx.BottomUp("hwasan", sanitizerMutator(hwasan)).Parallel()
|
|
|
|
|
2019-05-01 23:42:05 +02:00
|
|
|
ctx.TopDown("fuzzer_deps", sanitizerDepsMutator(fuzzer))
|
|
|
|
ctx.BottomUp("fuzzer", sanitizerMutator(fuzzer)).Parallel()
|
|
|
|
|
2019-07-29 14:27:18 +02:00
|
|
|
// cfi mutator shouldn't run before sanitizers that return true for
|
|
|
|
// incompatibleWithCfi()
|
2017-11-01 10:20:21 +01:00
|
|
|
ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi))
|
|
|
|
ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel()
|
|
|
|
|
2018-11-20 01:03:58 +01:00
|
|
|
ctx.TopDown("scs_deps", sanitizerDepsMutator(scs))
|
|
|
|
ctx.BottomUp("scs", sanitizerMutator(scs)).Parallel()
|
|
|
|
|
2016-10-12 23:38:15 +02:00
|
|
|
ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
|
|
|
|
ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
|
2017-02-10 01:16:31 +01:00
|
|
|
|
2019-06-20 08:00:20 +02:00
|
|
|
ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
|
2018-12-18 18:47:14 +01:00
|
|
|
ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
|
2018-02-22 00:49:20 +01:00
|
|
|
|
2018-12-11 00:12:40 +01:00
|
|
|
ctx.BottomUp("coverage", coverageMutator).Parallel()
|
2017-02-08 22:45:53 +01:00
|
|
|
ctx.TopDown("vndk_deps", sabiDepsMutator)
|
2017-05-10 00:44:35 +02:00
|
|
|
|
|
|
|
ctx.TopDown("lto_deps", ltoDepsMutator)
|
|
|
|
ctx.BottomUp("lto", ltoMutator).Parallel()
|
2019-01-18 07:20:43 +01:00
|
|
|
|
2020-10-19 11:51:07 +02:00
|
|
|
ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
|
2019-01-18 07:20:43 +01:00
|
|
|
ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
|
2016-10-12 23:38:15 +02:00
|
|
|
})
|
2016-07-29 22:44:28 +02:00
|
|
|
|
2018-11-06 01:49:08 +01:00
|
|
|
android.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
|
2015-06-17 23:20:06 +02:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type Deps struct {
|
|
|
|
SharedLibs, LateSharedLibs []string
|
|
|
|
StaticLibs, LateStaticLibs, WholeStaticLibs []string
|
2016-12-13 21:50:57 +01:00
|
|
|
HeaderLibs []string
|
2017-12-19 18:17:32 +01:00
|
|
|
RuntimeLibs []string
|
2015-09-24 00:26:20 +02:00
|
|
|
|
2020-06-05 23:26:16 +02:00
|
|
|
// Used for data dependencies adjacent to tests
|
|
|
|
DataLibs []string
|
|
|
|
|
2020-09-22 12:45:04 +02:00
|
|
|
// Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
|
|
|
|
SystemSharedLibs []string
|
|
|
|
|
2020-02-13 02:13:25 +01:00
|
|
|
StaticUnwinderIfLegacy bool
|
|
|
|
|
2016-12-13 21:50:57 +01:00
|
|
|
ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
|
2016-06-07 03:22:19 +02:00
|
|
|
|
2016-04-11 23:37:39 +02:00
|
|
|
ObjFiles []string
|
2015-03-17 23:06:21 +01:00
|
|
|
|
2016-04-20 23:21:14 +02:00
|
|
|
GeneratedSources []string
|
|
|
|
GeneratedHeaders []string
|
2019-12-06 05:15:38 +01:00
|
|
|
GeneratedDeps []string
|
2016-04-20 23:21:14 +02:00
|
|
|
|
2016-09-29 02:34:58 +02:00
|
|
|
ReexportGeneratedHeaders []string
|
|
|
|
|
2015-03-24 01:50:24 +01:00
|
|
|
CrtBegin, CrtEnd string
|
2018-10-12 09:24:23 +02:00
|
|
|
|
|
|
|
// Used for host bionic
|
|
|
|
LinkerFlagsFile string
|
|
|
|
DynamicLinker string
|
2015-03-17 23:06:21 +01:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type PathDeps struct {
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to .so files
|
2019-01-18 06:37:08 +01:00
|
|
|
SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to the dependencies to use for .so files (.so.toc files)
|
2019-01-18 06:37:08 +01:00
|
|
|
SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to .a files
|
2016-05-19 00:37:25 +02:00
|
|
|
StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
|
2015-09-24 00:26:20 +02:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
// Transitive static library dependencies of static libraries for use in ordering.
|
|
|
|
TranstiveStaticLibrariesForOrdering *android.DepSet
|
|
|
|
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to .o files
|
2020-04-17 18:34:31 +02:00
|
|
|
Objs Objects
|
|
|
|
// Paths to .o files in dependencies that provide them. Note that these lists
|
|
|
|
// aren't complete since prebuilt modules don't provide the .o files.
|
2017-02-10 01:16:31 +01:00
|
|
|
StaticLibObjs Objects
|
2016-09-27 02:33:01 +02:00
|
|
|
WholeStaticLibObjs Objects
|
2015-09-24 00:26:20 +02:00
|
|
|
|
2020-04-17 18:34:31 +02:00
|
|
|
// Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
|
|
|
|
// the libs from all whole_static_lib dependencies.
|
|
|
|
WholeStaticLibsFromPrebuilts android.Paths
|
|
|
|
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to generated source files
|
2016-05-19 00:37:25 +02:00
|
|
|
GeneratedSources android.Paths
|
2019-12-06 05:15:38 +01:00
|
|
|
GeneratedDeps android.Paths
|
2016-04-20 23:21:14 +02:00
|
|
|
|
2019-12-06 05:15:38 +01:00
|
|
|
Flags []string
|
|
|
|
IncludeDirs android.Paths
|
|
|
|
SystemIncludeDirs android.Paths
|
|
|
|
ReexportedDirs android.Paths
|
|
|
|
ReexportedSystemDirs android.Paths
|
|
|
|
ReexportedFlags []string
|
|
|
|
ReexportedGeneratedHeaders android.Paths
|
|
|
|
ReexportedDeps android.Paths
|
2015-09-24 00:26:20 +02:00
|
|
|
|
2016-10-01 02:10:16 +02:00
|
|
|
// Paths to crt*.o files
|
2016-05-19 00:37:25 +02:00
|
|
|
CrtBegin, CrtEnd android.OptionalPath
|
2018-10-12 09:24:23 +02:00
|
|
|
|
|
|
|
// Path to the file container flags to use with the linker
|
|
|
|
LinkerFlagsFile android.OptionalPath
|
|
|
|
|
|
|
|
// Path to the dynamic linker binary
|
|
|
|
DynamicLinker android.OptionalPath
|
2015-09-24 00:26:20 +02:00
|
|
|
}
|
|
|
|
|
2019-11-04 18:37:55 +01:00
|
|
|
// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
|
|
|
|
// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
|
|
|
|
// command line so they can be overridden by the local module flags).
|
|
|
|
type LocalOrGlobalFlags struct {
|
|
|
|
CommonFlags []string // Flags that apply to C, C++, and assembly source files
|
2017-06-15 23:45:18 +02:00
|
|
|
AsFlags []string // Flags that apply to assembly source files
|
2019-11-04 18:37:55 +01:00
|
|
|
YasmFlags []string // Flags that apply to yasm assembly source files
|
2017-06-15 23:45:18 +02:00
|
|
|
CFlags []string // Flags that apply to C and C++ source files
|
|
|
|
ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
|
|
|
|
ConlyFlags []string // Flags that apply to C source files
|
|
|
|
CppFlags []string // Flags that apply to C++ source files
|
|
|
|
ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
|
|
|
|
LdFlags []string // Flags that apply to linker command lines
|
2019-11-04 18:37:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type Flags struct {
|
|
|
|
Local LocalOrGlobalFlags
|
|
|
|
Global LocalOrGlobalFlags
|
|
|
|
|
|
|
|
aidlFlags []string // Flags that apply to aidl source files
|
|
|
|
rsFlags []string // Flags that apply to renderscript source files
|
|
|
|
libFlags []string // Flags to add libraries early to the link order
|
|
|
|
extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
|
|
|
|
TidyFlags []string // Flags that apply to clang-tidy
|
|
|
|
SAbiFlags []string // Flags that apply to header-abi-dumper
|
2015-04-22 22:07:53 +02:00
|
|
|
|
2017-03-31 00:03:04 +02:00
|
|
|
// Global include flags that apply to C, C++, and assembly source files
|
2019-11-04 18:37:55 +01:00
|
|
|
// These must be after any module include flags, which will be in CommonFlags.
|
2017-03-31 00:03:04 +02:00
|
|
|
SystemIncludeFlags []string
|
|
|
|
|
2020-04-21 21:40:27 +02:00
|
|
|
Toolchain config.Toolchain
|
|
|
|
Tidy bool
|
|
|
|
GcovCoverage bool
|
|
|
|
SAbiDump bool
|
|
|
|
EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
|
2016-01-04 23:34:37 +01:00
|
|
|
|
|
|
|
RequiredInstructionSet string
|
2016-01-06 23:41:07 +01:00
|
|
|
DynamicLinker string
|
|
|
|
|
2017-09-01 08:38:27 +02:00
|
|
|
CFlagsDeps android.Paths // Files depended on by compiler flags
|
|
|
|
LdFlagsDeps android.Paths // Files depended on by linker flags
|
2016-12-01 23:45:23 +01:00
|
|
|
|
2019-08-28 06:20:40 +02:00
|
|
|
AssemblerWithCpp bool
|
|
|
|
GroupStaticLibs bool
|
2018-11-17 06:05:32 +01:00
|
|
|
|
2019-03-28 22:45:07 +01:00
|
|
|
proto android.ProtoFlags
|
|
|
|
protoC bool // Whether to use C instead of C++
|
|
|
|
protoOptionsFile bool // Whether to look for a .options file next to the .proto
|
2019-04-11 07:59:54 +02:00
|
|
|
|
|
|
|
Yacc *YaccProperties
|
2020-07-15 10:58:56 +02:00
|
|
|
Lex *LexProperties
|
2015-03-17 23:06:21 +01:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
// Properties used to compile all C or C++ modules
|
|
|
|
type BaseProperties struct {
|
2018-07-24 02:19:36 +02:00
|
|
|
// Deprecated. true is the default, false is invalid.
|
2016-01-04 23:34:37 +01:00
|
|
|
Clang *bool `android:"arch_variant"`
|
2015-04-25 02:31:52 +02:00
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
// Minimum sdk version supported when compiling against the ndk. Setting this property causes
|
|
|
|
// two variants to be built, one for the platform and one for apps.
|
2017-11-07 19:57:05 +01:00
|
|
|
Sdk_version *string
|
2015-04-25 02:31:52 +02:00
|
|
|
|
2020-04-21 08:24:00 +02:00
|
|
|
// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
|
|
|
|
Min_sdk_version *string
|
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
// If true, always create an sdk variant and don't create a platform variant.
|
|
|
|
Sdk_variant_only *bool
|
|
|
|
|
2018-12-07 15:08:36 +01:00
|
|
|
AndroidMkSharedLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkStaticLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkRuntimeLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
|
2020-04-22 02:23:37 +02:00
|
|
|
AndroidMkHeaderLibs []string `blueprint:"mutated"`
|
2018-12-07 15:08:36 +01:00
|
|
|
HideFromMake bool `blueprint:"mutated"`
|
|
|
|
PreventInstall bool `blueprint:"mutated"`
|
|
|
|
ApexesProvidingSharedLibs []string `blueprint:"mutated"`
|
2017-09-14 03:37:08 +02:00
|
|
|
|
2020-09-22 12:45:04 +02:00
|
|
|
// Set by DepsMutator.
|
|
|
|
AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
|
|
|
|
|
2019-11-18 11:52:14 +01:00
|
|
|
ImageVariationPrefix string `blueprint:"mutated"`
|
|
|
|
VndkVersion string `blueprint:"mutated"`
|
|
|
|
SubName string `blueprint:"mutated"`
|
2017-12-08 00:28:59 +01:00
|
|
|
|
|
|
|
// *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
|
|
|
|
// file
|
|
|
|
Logtags []string
|
2018-01-31 16:54:12 +01:00
|
|
|
|
2020-10-26 20:43:12 +01:00
|
|
|
// Make this module available when building for ramdisk.
|
|
|
|
// On device without a dedicated recovery partition, the module is only
|
|
|
|
// available after switching root into
|
|
|
|
// /first_stage_ramdisk. To expose the module before switching root, install
|
|
|
|
// the recovery variant instead.
|
2020-01-22 00:53:22 +01:00
|
|
|
Ramdisk_available *bool
|
|
|
|
|
2020-10-26 20:43:12 +01:00
|
|
|
// Make this module available when building for vendor ramdisk.
|
|
|
|
// On device without a dedicated recovery partition, the module is only
|
|
|
|
// available after switching root into
|
|
|
|
// /first_stage_ramdisk. To expose the module before switching root, install
|
|
|
|
// the recovery variant instead.
|
2020-10-22 00:17:56 +02:00
|
|
|
Vendor_ramdisk_available *bool
|
|
|
|
|
2018-01-31 16:54:12 +01:00
|
|
|
// Make this module available when building for recovery
|
|
|
|
Recovery_available *bool
|
|
|
|
|
2019-11-20 22:35:50 +01:00
|
|
|
// Set by imageMutator
|
2020-10-22 00:17:56 +02:00
|
|
|
CoreVariantNeeded bool `blueprint:"mutated"`
|
|
|
|
RamdiskVariantNeeded bool `blueprint:"mutated"`
|
|
|
|
VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
|
|
|
|
RecoveryVariantNeeded bool `blueprint:"mutated"`
|
|
|
|
ExtraVariants []string `blueprint:"mutated"`
|
2018-12-20 14:10:17 +01:00
|
|
|
|
|
|
|
// Allows this module to use non-APEX version of libraries. Useful
|
|
|
|
// for building binaries that are started before APEXes are activated.
|
|
|
|
Bootstrap *bool
|
2019-10-22 12:32:18 +02:00
|
|
|
|
|
|
|
// Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
|
|
|
|
// see soong/cc/config/vndk.go
|
|
|
|
MustUseVendorVariant bool `blueprint:"mutated"`
|
2019-11-15 01:59:12 +01:00
|
|
|
|
|
|
|
// Used by vendor snapshot to record dependencies from snapshot modules.
|
|
|
|
SnapshotSharedLibs []string `blueprint:"mutated"`
|
|
|
|
SnapshotRuntimeLibs []string `blueprint:"mutated"`
|
2020-03-04 15:52:46 +01:00
|
|
|
|
|
|
|
Installable *bool
|
2020-04-07 18:50:32 +02:00
|
|
|
|
|
|
|
// Set by factories of module types that can only be referenced from variants compiled against
|
|
|
|
// the SDK.
|
|
|
|
AlwaysSdk bool `blueprint:"mutated"`
|
|
|
|
|
|
|
|
// Variant is an SDK variant created by sdkMutator
|
|
|
|
IsSdkVariant bool `blueprint:"mutated"`
|
|
|
|
// Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
|
|
|
|
// variant to have a ".sdk" suffix.
|
|
|
|
SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
|
2020-09-01 01:07:58 +02:00
|
|
|
|
|
|
|
// Normally Soong uses the directory structure to decide which modules
|
|
|
|
// should be included (framework) or excluded (non-framework) from the
|
|
|
|
// vendor snapshot, but this property allows a partner to exclude a
|
|
|
|
// module normally thought of as a framework module from the vendor
|
|
|
|
// snapshot.
|
|
|
|
Exclude_from_vendor_snapshot *bool
|
2017-09-14 03:37:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type VendorProperties struct {
|
2017-08-16 07:05:54 +02:00
|
|
|
// whether this module should be allowed to be directly depended by other
|
|
|
|
// modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
|
2019-11-18 11:52:14 +01:00
|
|
|
// In addition, this module should be allowed to be directly depended by
|
|
|
|
// product modules with `product_specific: true`.
|
|
|
|
// If set to true, three variants will be built separately, one like
|
|
|
|
// normal, another limited to the set of libraries and headers
|
|
|
|
// that are exposed to /vendor modules, and the other to /product modules.
|
Split /system and /vendor modules, allow multi-installation
Nothing changes if BOARD_VNDK_VERSION isn't set.
When the VNDK is enabled (BOARD_VNDK_VERSION in Make), this will split
/system and /vendor modules into two different variant spaces that can't
link to each other. There are a few interfaces between the two variant
spaces:
The `llndk_library` stubs will be available in the /vendor variant, but
won't be installed, so at runtime the /system variant will be used.
Setting `vendor_available: true` will split a module into both variants.
The /system (or "core") variant will compile just like today. The
/vendor ("vendor") variant will compile against everything else in the
vendor space (so LL-NDK instead of libc/liblog/etc). There will be two
copies of these libraries installed onto the final device.
Since the available runtime interfaces for vendor modules may be
reduced, and your dependencies may not expose their private interfaces,
we allow the vendor variants to reduce their compilation set, and export
a different set of headers:
cc_library {
name: "libfoo",
srcs: ["common.cpp", "private_impl.cpp"],
export_include_dirs: ["include"],
target: {
vendor: {
export_include_dirs: ["include_vndk"],
exclude_srcs: ["private_impl.cpp"],
srcs: ["vendor_only.cpp"],
},
},
}
So the "core" variant would compile with both "common.cpp" and
"private_impl.cpp", and export "include".
The "vendor" variant would compile "common.cpp" and "vendor_only.cpp",
and export "include_vndk".
Bug: 36426473
Bug: 36079834
Test: out/soong/build.ninja, out/soong/Android- only changes due to _core addition and
.llndk -> .vendor
Test: attempt to compile with BOARD_VNDK_VERSION:=current
Change-Id: Idef28764043bf6c33dc0d2e7e2026c38867ff769
2017-04-06 21:43:22 +02:00
|
|
|
//
|
2019-11-18 11:52:14 +01:00
|
|
|
// The vendor and product variants may be used with a different (newer) /system,
|
Split /system and /vendor modules, allow multi-installation
Nothing changes if BOARD_VNDK_VERSION isn't set.
When the VNDK is enabled (BOARD_VNDK_VERSION in Make), this will split
/system and /vendor modules into two different variant spaces that can't
link to each other. There are a few interfaces between the two variant
spaces:
The `llndk_library` stubs will be available in the /vendor variant, but
won't be installed, so at runtime the /system variant will be used.
Setting `vendor_available: true` will split a module into both variants.
The /system (or "core") variant will compile just like today. The
/vendor ("vendor") variant will compile against everything else in the
vendor space (so LL-NDK instead of libc/liblog/etc). There will be two
copies of these libraries installed onto the final device.
Since the available runtime interfaces for vendor modules may be
reduced, and your dependencies may not expose their private interfaces,
we allow the vendor variants to reduce their compilation set, and export
a different set of headers:
cc_library {
name: "libfoo",
srcs: ["common.cpp", "private_impl.cpp"],
export_include_dirs: ["include"],
target: {
vendor: {
export_include_dirs: ["include_vndk"],
exclude_srcs: ["private_impl.cpp"],
srcs: ["vendor_only.cpp"],
},
},
}
So the "core" variant would compile with both "common.cpp" and
"private_impl.cpp", and export "include".
The "vendor" variant would compile "common.cpp" and "vendor_only.cpp",
and export "include_vndk".
Bug: 36426473
Bug: 36079834
Test: out/soong/build.ninja, out/soong/Android- only changes due to _core addition and
.llndk -> .vendor
Test: attempt to compile with BOARD_VNDK_VERSION:=current
Change-Id: Idef28764043bf6c33dc0d2e7e2026c38867ff769
2017-04-06 21:43:22 +02:00
|
|
|
// so it shouldn't have any unversioned runtime dependencies, or
|
|
|
|
// make assumptions about the system that may not be true in the
|
|
|
|
// future.
|
|
|
|
//
|
2019-11-18 11:52:14 +01:00
|
|
|
// If set to false, this module becomes inaccessible from /vendor or /product
|
|
|
|
// modules.
|
2017-08-16 07:05:54 +02:00
|
|
|
//
|
|
|
|
// Default value is true when vndk: {enabled: true} or vendor: true.
|
|
|
|
//
|
Split /system and /vendor modules, allow multi-installation
Nothing changes if BOARD_VNDK_VERSION isn't set.
When the VNDK is enabled (BOARD_VNDK_VERSION in Make), this will split
/system and /vendor modules into two different variant spaces that can't
link to each other. There are a few interfaces between the two variant
spaces:
The `llndk_library` stubs will be available in the /vendor variant, but
won't be installed, so at runtime the /system variant will be used.
Setting `vendor_available: true` will split a module into both variants.
The /system (or "core") variant will compile just like today. The
/vendor ("vendor") variant will compile against everything else in the
vendor space (so LL-NDK instead of libc/liblog/etc). There will be two
copies of these libraries installed onto the final device.
Since the available runtime interfaces for vendor modules may be
reduced, and your dependencies may not expose their private interfaces,
we allow the vendor variants to reduce their compilation set, and export
a different set of headers:
cc_library {
name: "libfoo",
srcs: ["common.cpp", "private_impl.cpp"],
export_include_dirs: ["include"],
target: {
vendor: {
export_include_dirs: ["include_vndk"],
exclude_srcs: ["private_impl.cpp"],
srcs: ["vendor_only.cpp"],
},
},
}
So the "core" variant would compile with both "common.cpp" and
"private_impl.cpp", and export "include".
The "vendor" variant would compile "common.cpp" and "vendor_only.cpp",
and export "include_vndk".
Bug: 36426473
Bug: 36079834
Test: out/soong/build.ninja, out/soong/Android- only changes due to _core addition and
.llndk -> .vendor
Test: attempt to compile with BOARD_VNDK_VERSION:=current
Change-Id: Idef28764043bf6c33dc0d2e7e2026c38867ff769
2017-04-06 21:43:22 +02:00
|
|
|
// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
|
2019-11-18 11:52:14 +01:00
|
|
|
// If PRODUCT_PRODUCT_VNDK_VERSION isn't set, product variant will not be used.
|
Split /system and /vendor modules, allow multi-installation
Nothing changes if BOARD_VNDK_VERSION isn't set.
When the VNDK is enabled (BOARD_VNDK_VERSION in Make), this will split
/system and /vendor modules into two different variant spaces that can't
link to each other. There are a few interfaces between the two variant
spaces:
The `llndk_library` stubs will be available in the /vendor variant, but
won't be installed, so at runtime the /system variant will be used.
Setting `vendor_available: true` will split a module into both variants.
The /system (or "core") variant will compile just like today. The
/vendor ("vendor") variant will compile against everything else in the
vendor space (so LL-NDK instead of libc/liblog/etc). There will be two
copies of these libraries installed onto the final device.
Since the available runtime interfaces for vendor modules may be
reduced, and your dependencies may not expose their private interfaces,
we allow the vendor variants to reduce their compilation set, and export
a different set of headers:
cc_library {
name: "libfoo",
srcs: ["common.cpp", "private_impl.cpp"],
export_include_dirs: ["include"],
target: {
vendor: {
export_include_dirs: ["include_vndk"],
exclude_srcs: ["private_impl.cpp"],
srcs: ["vendor_only.cpp"],
},
},
}
So the "core" variant would compile with both "common.cpp" and
"private_impl.cpp", and export "include".
The "vendor" variant would compile "common.cpp" and "vendor_only.cpp",
and export "include_vndk".
Bug: 36426473
Bug: 36079834
Test: out/soong/build.ninja, out/soong/Android- only changes due to _core addition and
.llndk -> .vendor
Test: attempt to compile with BOARD_VNDK_VERSION:=current
Change-Id: Idef28764043bf6c33dc0d2e7e2026c38867ff769
2017-04-06 21:43:22 +02:00
|
|
|
Vendor_available *bool
|
2018-04-09 05:03:06 +02:00
|
|
|
|
|
|
|
// whether this module is capable of being loaded with other instance
|
|
|
|
// (possibly an older version) of the same module in the same process.
|
|
|
|
// Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
|
|
|
|
// can be double loaded in a vendor process if the library is also a
|
|
|
|
// (direct and indirect) dependency of an LLNDK library. Such libraries must be
|
|
|
|
// explicitly marked as `double_loadable: true` by the owner, or the dependency
|
|
|
|
// from the LLNDK lib should be cut if the lib is not designed to be double loaded.
|
|
|
|
Double_loadable *bool
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContextIntf interface {
|
|
|
|
static() bool
|
|
|
|
staticBinary() bool
|
2019-07-29 14:27:18 +02:00
|
|
|
header() bool
|
2020-06-01 14:53:49 +02:00
|
|
|
binary() bool
|
2020-06-01 16:23:05 +02:00
|
|
|
object() bool
|
2016-07-29 22:44:28 +02:00
|
|
|
toolchain() config.Toolchain
|
2020-03-06 19:45:53 +01:00
|
|
|
canUseSdk() bool
|
2017-09-28 02:01:44 +02:00
|
|
|
useSdk() bool
|
2016-01-04 23:34:37 +01:00
|
|
|
sdkVersion() string
|
2017-09-28 02:01:44 +02:00
|
|
|
useVndk() bool
|
2019-01-16 13:19:51 +01:00
|
|
|
isNdk() bool
|
2019-05-09 03:56:13 +02:00
|
|
|
isLlndk(config android.Config) bool
|
|
|
|
isLlndkPublic(config android.Config) bool
|
|
|
|
isVndkPrivate(config android.Config) bool
|
2017-06-23 12:24:43 +02:00
|
|
|
isVndk() bool
|
|
|
|
isVndkSp() bool
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
isVndkExt() bool
|
2019-11-18 11:52:14 +01:00
|
|
|
inProduct() bool
|
|
|
|
inVendor() bool
|
2020-01-22 00:53:22 +01:00
|
|
|
inRamdisk() bool
|
2020-10-22 00:17:56 +02:00
|
|
|
inVendorRamdisk() bool
|
2018-01-31 16:54:12 +01:00
|
|
|
inRecovery() bool
|
2019-07-29 11:46:59 +02:00
|
|
|
shouldCreateSourceAbiDump() bool
|
2016-03-31 06:00:30 +02:00
|
|
|
selectedStl() string
|
2016-10-07 01:12:58 +02:00
|
|
|
baseModuleName() string
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
getVndkExtendsModuleName() string
|
2018-02-14 11:16:12 +01:00
|
|
|
isPgoCompile() bool
|
2018-12-11 00:12:40 +01:00
|
|
|
isNDKStubLibrary() bool
|
2018-11-27 23:33:03 +01:00
|
|
|
useClangLld(actx ModuleContext) bool
|
2019-12-03 20:18:32 +01:00
|
|
|
isForPlatform() bool
|
2020-08-13 20:24:56 +02:00
|
|
|
apexVariationName() string
|
2020-07-23 07:32:17 +02:00
|
|
|
apexSdkVersion() android.ApiLevel
|
2019-01-16 14:53:13 +01:00
|
|
|
bootstrap() bool
|
2018-11-13 05:19:56 +01:00
|
|
|
mustUseVendorVariant() bool
|
2019-03-25 18:21:31 +01:00
|
|
|
nativeCoverage() bool
|
2020-09-16 03:30:11 +02:00
|
|
|
directlyInAnyApex() bool
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContext interface {
|
2016-05-19 00:37:25 +02:00
|
|
|
android.ModuleContext
|
2016-01-04 23:34:37 +01:00
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
|
|
|
type BaseModuleContext interface {
|
2019-06-06 23:33:29 +02:00
|
|
|
android.BaseModuleContext
|
2016-01-04 23:34:37 +01:00
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
2016-12-14 02:06:13 +01:00
|
|
|
type DepsContext interface {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type feature interface {
|
|
|
|
begin(ctx BaseModuleContext)
|
2016-12-14 02:06:13 +01:00
|
|
|
deps(ctx DepsContext, deps Deps) Deps
|
2016-01-04 23:34:37 +01:00
|
|
|
flags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
props() []interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type compiler interface {
|
2016-08-01 22:20:05 +02:00
|
|
|
compilerInit(ctx BaseModuleContext)
|
2016-12-14 02:06:13 +01:00
|
|
|
compilerDeps(ctx DepsContext, deps Deps) Deps
|
2017-11-16 23:33:08 +01:00
|
|
|
compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
|
2016-08-01 22:20:05 +02:00
|
|
|
compilerProps() []interface{}
|
|
|
|
|
2016-07-27 19:31:13 +02:00
|
|
|
appendCflags([]string)
|
|
|
|
appendAsflags([]string)
|
2016-09-27 02:33:01 +02:00
|
|
|
compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type linker interface {
|
2016-08-01 22:20:05 +02:00
|
|
|
linkerInit(ctx BaseModuleContext)
|
2016-12-14 02:06:13 +01:00
|
|
|
linkerDeps(ctx DepsContext, deps Deps) Deps
|
2016-08-01 22:20:05 +02:00
|
|
|
linkerFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
linkerProps() []interface{}
|
2018-11-27 23:33:03 +01:00
|
|
|
useClangLld(actx ModuleContext) bool
|
2016-08-01 22:20:05 +02:00
|
|
|
|
2016-09-27 02:33:01 +02:00
|
|
|
link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
|
2016-07-27 19:31:13 +02:00
|
|
|
appendLdflags([]string)
|
2019-01-31 04:21:23 +01:00
|
|
|
unstrippedOutputFilePath() android.Path
|
2019-03-25 18:21:31 +01:00
|
|
|
|
|
|
|
nativeCoverage() bool
|
2019-08-09 07:44:36 +02:00
|
|
|
coverageOutputFilePath() android.OptionalPath
|
2020-03-06 13:30:43 +01:00
|
|
|
|
|
|
|
// Get the deps that have been explicitly specified in the properties.
|
|
|
|
// Only updates the
|
|
|
|
linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
|
|
|
|
}
|
|
|
|
|
|
|
|
type specifiedDeps struct {
|
|
|
|
sharedLibs []string
|
2020-03-24 02:19:52 +01:00
|
|
|
systemSharedLibs []string // Note nil and [] are semantically distinct.
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type installer interface {
|
2016-08-01 22:20:05 +02:00
|
|
|
installerProps() []interface{}
|
2016-05-19 00:37:25 +02:00
|
|
|
install(ctx ModuleContext, path android.Path)
|
2020-03-04 15:52:46 +01:00
|
|
|
everInstallable() bool
|
2016-01-04 23:34:37 +01:00
|
|
|
inData() bool
|
2017-03-30 07:00:18 +02:00
|
|
|
inSanitizerDir() bool
|
2016-09-29 01:18:03 +02:00
|
|
|
hostToolPath() android.OptionalPath
|
2019-02-01 04:03:59 +01:00
|
|
|
relativeInstallPath() string
|
2020-08-06 23:34:42 +02:00
|
|
|
makeUninstallable(mod *Module)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
2018-11-06 01:49:08 +01:00
|
|
|
type xref interface {
|
|
|
|
XrefCcFiles() android.Paths
|
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
type libraryDependencyKind int
|
|
|
|
|
|
|
|
const (
|
|
|
|
headerLibraryDependency = iota
|
|
|
|
sharedLibraryDependency
|
|
|
|
staticLibraryDependency
|
|
|
|
)
|
|
|
|
|
|
|
|
func (k libraryDependencyKind) String() string {
|
|
|
|
switch k {
|
|
|
|
case headerLibraryDependency:
|
|
|
|
return "headerLibraryDependency"
|
|
|
|
case sharedLibraryDependency:
|
|
|
|
return "sharedLibraryDependency"
|
|
|
|
case staticLibraryDependency:
|
|
|
|
return "staticLibraryDependency"
|
|
|
|
default:
|
|
|
|
panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type libraryDependencyOrder int
|
|
|
|
|
|
|
|
const (
|
|
|
|
earlyLibraryDependency = -1
|
|
|
|
normalLibraryDependency = 0
|
|
|
|
lateLibraryDependency = 1
|
|
|
|
)
|
|
|
|
|
|
|
|
func (o libraryDependencyOrder) String() string {
|
|
|
|
switch o {
|
|
|
|
case earlyLibraryDependency:
|
|
|
|
return "earlyLibraryDependency"
|
|
|
|
case normalLibraryDependency:
|
|
|
|
return "normalLibraryDependency"
|
|
|
|
case lateLibraryDependency:
|
|
|
|
return "lateLibraryDependency"
|
|
|
|
default:
|
|
|
|
panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
|
|
|
|
// tags that have a set of predefined tag objects that are reused for each dependency, a
|
|
|
|
// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
|
|
|
|
// That means that comparing a libraryDependencyTag for equality will only be equal if all
|
|
|
|
// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
|
|
|
|
// then check individual metadata fields instead.
|
|
|
|
type libraryDependencyTag struct {
|
|
|
|
blueprint.BaseDependencyTag
|
|
|
|
|
|
|
|
// These are exported so that fmt.Printf("%#v") can call their String methods.
|
|
|
|
Kind libraryDependencyKind
|
|
|
|
Order libraryDependencyOrder
|
|
|
|
|
|
|
|
wholeStatic bool
|
|
|
|
|
|
|
|
reexportFlags bool
|
|
|
|
explicitlyVersioned bool
|
|
|
|
dataLib bool
|
|
|
|
ndk bool
|
|
|
|
|
|
|
|
staticUnwinder bool
|
|
|
|
|
|
|
|
makeSuffix string
|
|
|
|
}
|
|
|
|
|
|
|
|
// header returns true if the libraryDependencyTag is tagging a header lib dependency.
|
|
|
|
func (d libraryDependencyTag) header() bool {
|
|
|
|
return d.Kind == headerLibraryDependency
|
|
|
|
}
|
|
|
|
|
|
|
|
// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
|
|
|
|
func (d libraryDependencyTag) shared() bool {
|
|
|
|
return d.Kind == sharedLibraryDependency
|
|
|
|
}
|
|
|
|
|
|
|
|
// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
|
|
|
|
func (d libraryDependencyTag) static() bool {
|
|
|
|
return d.Kind == staticLibraryDependency
|
|
|
|
}
|
|
|
|
|
|
|
|
// dependencyTag is used for tagging miscellanous dependency types that don't fit into
|
|
|
|
// libraryDependencyTag. Each tag object is created globally and reused for multiple
|
|
|
|
// dependencies (although since the object contains no references, assigning a tag to a
|
|
|
|
// variable and modifying it will not modify the original). Users can compare the tag
|
|
|
|
// returned by ctx.OtherModuleDependencyTag against the global original
|
|
|
|
type dependencyTag struct {
|
|
|
|
blueprint.BaseDependencyTag
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
|
2016-04-12 00:06:20 +02:00
|
|
|
var (
|
2020-07-28 06:26:48 +02:00
|
|
|
genSourceDepTag = dependencyTag{name: "gen source"}
|
|
|
|
genHeaderDepTag = dependencyTag{name: "gen header"}
|
|
|
|
genHeaderExportDepTag = dependencyTag{name: "gen header export"}
|
|
|
|
objDepTag = dependencyTag{name: "obj"}
|
|
|
|
linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
|
|
|
|
dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"}
|
|
|
|
reuseObjTag = dependencyTag{name: "reuse objects"}
|
|
|
|
staticVariantTag = dependencyTag{name: "static variant"}
|
|
|
|
vndkExtDepTag = dependencyTag{name: "vndk extends"}
|
|
|
|
dataLibDepTag = dependencyTag{name: "data lib"}
|
|
|
|
runtimeDepTag = dependencyTag{name: "runtime lib"}
|
|
|
|
testPerSrcDepTag = dependencyTag{name: "test_per_src"}
|
2020-09-18 23:15:30 +02:00
|
|
|
stubImplDepTag = dependencyTag{name: "stub_impl"}
|
2016-04-12 00:06:20 +02:00
|
|
|
)
|
|
|
|
|
2020-09-16 03:30:11 +02:00
|
|
|
type copyDirectlyInAnyApexDependencyTag dependencyTag
|
|
|
|
|
|
|
|
func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
|
|
|
|
|
|
|
|
var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
|
|
|
|
|
2019-07-29 17:22:59 +02:00
|
|
|
func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
|
2020-07-28 06:26:48 +02:00
|
|
|
ccLibDepTag, ok := depTag.(libraryDependencyTag)
|
|
|
|
return ok && ccLibDepTag.shared()
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
|
|
|
|
ccLibDepTag, ok := depTag.(libraryDependencyTag)
|
|
|
|
return ok && ccLibDepTag.static()
|
2019-07-29 17:22:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
|
2020-07-28 06:26:48 +02:00
|
|
|
ccDepTag, ok := depTag.(dependencyTag)
|
2019-07-29 17:22:59 +02:00
|
|
|
return ok && ccDepTag == runtimeDepTag
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
|
2020-07-28 06:26:48 +02:00
|
|
|
ccDepTag, ok := depTag.(dependencyTag)
|
2019-07-29 17:22:59 +02:00
|
|
|
return ok && ccDepTag == testPerSrcDepTag
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
// Module contains the properties and members used by all C/C++ module types, and implements
|
|
|
|
// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
|
|
|
|
// to construct the output file. Behavior can be customized with a Customizer interface
|
|
|
|
type Module struct {
|
2016-05-19 00:37:25 +02:00
|
|
|
android.ModuleBase
|
2017-07-07 23:33:33 +02:00
|
|
|
android.DefaultableModuleBase
|
2018-10-02 17:38:19 +02:00
|
|
|
android.ApexModuleBase
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
android.SdkBase
|
2015-04-25 02:31:52 +02:00
|
|
|
|
2017-09-14 03:37:08 +02:00
|
|
|
Properties BaseProperties
|
|
|
|
VendorProperties VendorProperties
|
2016-01-04 23:34:37 +01:00
|
|
|
|
|
|
|
// initialize before calling Init
|
2016-05-19 00:37:25 +02:00
|
|
|
hod android.HostOrDeviceSupported
|
|
|
|
multilib android.Multilib
|
2015-04-25 02:31:52 +02:00
|
|
|
|
2019-12-13 20:50:38 +01:00
|
|
|
// Allowable SdkMemberTypes of this module type.
|
|
|
|
sdkMemberTypes []android.SdkMemberType
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
// delegates, initialize before calling Init
|
2016-09-13 22:41:39 +02:00
|
|
|
features []feature
|
|
|
|
compiler compiler
|
|
|
|
linker linker
|
|
|
|
installer installer
|
|
|
|
stl *stl
|
|
|
|
sanitize *sanitize
|
2017-02-10 01:16:31 +01:00
|
|
|
coverage *coverage
|
2017-02-08 22:45:53 +01:00
|
|
|
sabi *sabi
|
2017-06-23 12:24:43 +02:00
|
|
|
vndkdep *vndkdep
|
2017-05-10 00:44:35 +02:00
|
|
|
lto *lto
|
2017-09-01 08:38:27 +02:00
|
|
|
pgo *pgo
|
2016-01-06 23:41:07 +01:00
|
|
|
|
2020-10-24 02:22:06 +02:00
|
|
|
library libraryInterface
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
outputFile android.OptionalPath
|
2015-04-28 22:30:13 +02:00
|
|
|
|
2016-07-29 22:44:28 +02:00
|
|
|
cachedToolchain config.Toolchain
|
2016-07-30 02:28:03 +02:00
|
|
|
|
|
|
|
subAndroidMkOnce map[subAndroidMkProvider]bool
|
2017-01-11 01:21:22 +01:00
|
|
|
|
|
|
|
// Flags used to compile this module
|
|
|
|
flags Flags
|
2017-09-28 02:05:30 +02:00
|
|
|
|
2017-11-28 00:48:57 +01:00
|
|
|
// only non-nil when this is a shared library that reuses the objects of a static library
|
2020-09-18 23:15:30 +02:00
|
|
|
staticAnalogue *StaticLibraryInfo
|
2019-05-09 03:56:13 +02:00
|
|
|
|
|
|
|
makeLinkType string
|
2018-11-06 01:49:08 +01:00
|
|
|
// Kythe (source file indexer) paths for this compilation module
|
|
|
|
kytheFiles android.Paths
|
Enforce apex.min_sdk_version for bundled builds
Previously, when Q-targeting apexes are bundled-built, they are built
against the latest stubs.
It was because unwinder is linked dynamically in R and APIs are provided
by libc while Q apexes should run on Q where libc doesn't provide those
APIs. To make Q apexes run on Q device, libc++ should be linked with
static unwinder. But, because libc++ with static unwinder may cause problem
on HWASAN build, Q apexes were built against the latest stubs for bundled
build.
However, Q apexes should be built against Q stubs.
Now, only for HWASAN builds, Q apexes are built against the latest stubs
(and native modules are not linked with static unwinder).
Bug: 151912436
Test: TARGET_SANITIZE=hwaddress m
=> Q apexes(media, resolv, ..) are linked with the latest stubs
m
=> Q apexes are linked with Q stubs,
and Q apexes' libc++ is linked with static unwinder
Merged-In: If32f1b547e6d93e3955c7521eec8aef5851f908c
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
(cherry picked from commit 7406660685a9a085c433ba7081cc6984f66fa732)
Exempt-From-Owner-Approval: cp from internal
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
2020-03-19 20:29:24 +01:00
|
|
|
|
|
|
|
// For apex variants, this is set as apex.min_sdk_version
|
2020-07-23 07:32:17 +02:00
|
|
|
apexSdkVersion android.ApiLevel
|
2020-09-16 03:30:11 +02:00
|
|
|
|
|
|
|
hideApexVariantFromMake bool
|
2015-03-17 23:06:21 +01:00
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (c *Module) Toc() android.OptionalPath {
|
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
|
|
|
return library.toc()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) ApiLevel() string {
|
|
|
|
if c.linker != nil {
|
|
|
|
if stub, ok := c.linker.(*stubDecorator); ok {
|
Replace stringly-typed API levels.
Handling of API levels within Soong is currently fairly difficult
since it isn't always clear based on context what kind of API level a
given string represents, how much canonicalizing and error checking
the code receiving the string are expected to do, or how those errors
should be treated.
The API level struct does not export its raw data, so as to keep its
"constructor" private to the android package, and to prevent misuse of
the `number` field, which is only an implementation detail for preview
API levels. API levels can be parsed with either
`android.ApiLevelFromUser`, which returns any errors to the caller, or
`android.ApiLevelOrPanic`, which is used in the case where the input
is trusted and any errors in parsing should panic. Even within the
`android` package, these APIs should be preferred over direct
construction.
For cases where there are context specific parsing requirements, such
as handling the "minimum" alias in the cc module,
`nativeApiLevelFromUser` and `nativeApiLevelOrPanic` should be used
instead.
Test: treehugger
Bug: http://b/154667674
Change-Id: Id52921fda32cb437fb1775ac2183299dedc0cf20
2020-07-06 23:49:35 +02:00
|
|
|
return stub.apiLevel.String()
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) Static() bool {
|
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
|
|
|
return library.static()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) Shared() bool {
|
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
|
|
|
return library.shared()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) SelectedStl() string {
|
2020-04-07 18:50:32 +02:00
|
|
|
if c.stl != nil {
|
|
|
|
return c.stl.Properties.SelectedStl
|
|
|
|
}
|
|
|
|
return ""
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) ToolchainLibrary() bool {
|
|
|
|
if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) NdkPrebuiltStl() bool {
|
|
|
|
if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) StubDecorator() bool {
|
|
|
|
if _, ok := c.linker.(*stubDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) SdkVersion() string {
|
|
|
|
return String(c.Properties.Sdk_version)
|
|
|
|
}
|
|
|
|
|
2020-04-27 19:53:18 +02:00
|
|
|
func (c *Module) MinSdkVersion() string {
|
|
|
|
return String(c.Properties.Min_sdk_version)
|
|
|
|
}
|
|
|
|
|
2020-07-15 22:33:30 +02:00
|
|
|
func (c *Module) SplitPerApiLevel() bool {
|
2020-10-01 22:37:16 +02:00
|
|
|
if !c.canUseSdk() {
|
|
|
|
return false
|
|
|
|
}
|
2020-07-15 22:33:30 +02:00
|
|
|
if linker, ok := c.linker.(*objectLinker); ok {
|
|
|
|
return linker.isCrt()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
func (c *Module) AlwaysSdk() bool {
|
|
|
|
return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:18:45 +02:00
|
|
|
func (c *Module) CcLibrary() bool {
|
|
|
|
if c.linker != nil {
|
|
|
|
if _, ok := c.linker.(*libraryDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
2020-09-24 05:37:24 +02:00
|
|
|
if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
|
|
|
|
return true
|
|
|
|
}
|
2019-10-18 23:18:45 +02:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) CcLibraryInterface() bool {
|
2019-10-18 23:49:46 +02:00
|
|
|
if _, ok := c.linker.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-11-21 21:30:50 +01:00
|
|
|
func (c *Module) NonCcVariants() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:18:45 +02:00
|
|
|
func (c *Module) SetStatic() {
|
|
|
|
if c.linker != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
library.setStatic()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) SetShared() {
|
|
|
|
if c.linker != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
library.setShared()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) BuildStaticVariant() bool {
|
|
|
|
if c.linker != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
return library.buildStatic()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) BuildSharedVariant() bool {
|
|
|
|
if c.linker != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
return library.buildShared()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) Module() android.Module {
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
2018-09-05 15:36:17 +02:00
|
|
|
func (c *Module) OutputFile() android.OptionalPath {
|
|
|
|
return c.outputFile
|
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (c *Module) CoverageFiles() android.Paths {
|
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(libraryInterface); ok {
|
|
|
|
return library.objs().coverageFiles
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:18:45 +02:00
|
|
|
var _ LinkableInterface = (*Module)(nil)
|
|
|
|
|
2019-01-12 16:39:51 +01:00
|
|
|
func (c *Module) UnstrippedOutputFile() android.Path {
|
2019-01-31 04:21:23 +01:00
|
|
|
if c.linker != nil {
|
|
|
|
return c.linker.unstrippedOutputFilePath()
|
2019-01-12 16:39:51 +01:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-08-09 07:44:36 +02:00
|
|
|
func (c *Module) CoverageOutputFile() android.OptionalPath {
|
|
|
|
if c.linker != nil {
|
|
|
|
return c.linker.coverageOutputFilePath()
|
|
|
|
}
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
|
2019-02-01 04:03:59 +01:00
|
|
|
func (c *Module) RelativeInstallPath() string {
|
|
|
|
if c.installer != nil {
|
|
|
|
return c.installer.relativeInstallPath()
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func (c *Module) VndkVersion() string {
|
2019-11-18 11:52:14 +01:00
|
|
|
return c.Properties.VndkVersion
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
2017-06-24 00:06:31 +02:00
|
|
|
func (c *Module) Init() android.Module {
|
2018-05-09 22:45:03 +02:00
|
|
|
c.AddProperties(&c.Properties, &c.VendorProperties)
|
2016-01-04 23:34:37 +01:00
|
|
|
if c.compiler != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.compiler.compilerProps()...)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.linker.linkerProps()...)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
if c.installer != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.installer.installerProps()...)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2016-04-05 00:07:06 +02:00
|
|
|
if c.stl != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.stl.props()...)
|
2016-04-05 00:07:06 +02:00
|
|
|
}
|
2016-01-06 23:41:07 +01:00
|
|
|
if c.sanitize != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.sanitize.props()...)
|
2016-01-06 23:41:07 +01:00
|
|
|
}
|
2017-02-10 01:16:31 +01:00
|
|
|
if c.coverage != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.coverage.props()...)
|
2017-02-10 01:16:31 +01:00
|
|
|
}
|
2017-02-08 22:45:53 +01:00
|
|
|
if c.sabi != nil {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(c.sabi.props()...)
|
2017-02-08 22:45:53 +01:00
|
|
|
}
|
2017-06-23 12:24:43 +02:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
c.AddProperties(c.vndkdep.props()...)
|
|
|
|
}
|
2017-05-10 00:44:35 +02:00
|
|
|
if c.lto != nil {
|
|
|
|
c.AddProperties(c.lto.props()...)
|
|
|
|
}
|
2017-09-01 08:38:27 +02:00
|
|
|
if c.pgo != nil {
|
|
|
|
c.AddProperties(c.pgo.props()...)
|
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
for _, feature := range c.features {
|
2017-06-24 00:06:31 +02:00
|
|
|
c.AddProperties(feature.props()...)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-03-17 23:06:21 +01:00
|
|
|
|
2020-09-14 12:43:17 +02:00
|
|
|
c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
|
2020-04-18 00:49:49 +02:00
|
|
|
// Windows builds always prefer 32-bit
|
2020-09-14 12:43:17 +02:00
|
|
|
return os == android.Windows
|
2018-10-02 22:59:46 +02:00
|
|
|
})
|
2017-06-24 00:06:31 +02:00
|
|
|
android.InitAndroidArchModule(c, c.hod, c.multilib)
|
2019-09-30 12:13:12 +02:00
|
|
|
android.InitApexModule(c)
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
android.InitSdkAwareModule(c)
|
2019-11-13 02:50:48 +01:00
|
|
|
android.InitDefaultableModule(c)
|
2018-10-02 17:38:19 +02:00
|
|
|
|
2017-06-24 00:06:31 +02:00
|
|
|
return c
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-03-17 23:06:21 +01:00
|
|
|
|
2016-07-30 02:28:03 +02:00
|
|
|
// Returns true for dependency roots (binaries)
|
|
|
|
// TODO(ccross): also handle dlopenable libraries
|
|
|
|
func (c *Module) isDependencyRoot() bool {
|
|
|
|
if root, ok := c.linker.(interface {
|
|
|
|
isDependencyRoot() bool
|
|
|
|
}); ok {
|
|
|
|
return root.isDependencyRoot()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-11-18 11:52:14 +01:00
|
|
|
// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
|
|
|
|
// "product" and "vendor" variant modules return true for this function.
|
|
|
|
// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
|
|
|
|
// "soc_specific: true" and more vendor installed modules are included here.
|
|
|
|
// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or
|
|
|
|
// "product_specific: true" modules are included here.
|
2019-10-18 23:49:46 +02:00
|
|
|
func (c *Module) UseVndk() bool {
|
2019-08-26 09:52:35 +02:00
|
|
|
return c.Properties.VndkVersion != ""
|
Split /system and /vendor modules, allow multi-installation
Nothing changes if BOARD_VNDK_VERSION isn't set.
When the VNDK is enabled (BOARD_VNDK_VERSION in Make), this will split
/system and /vendor modules into two different variant spaces that can't
link to each other. There are a few interfaces between the two variant
spaces:
The `llndk_library` stubs will be available in the /vendor variant, but
won't be installed, so at runtime the /system variant will be used.
Setting `vendor_available: true` will split a module into both variants.
The /system (or "core") variant will compile just like today. The
/vendor ("vendor") variant will compile against everything else in the
vendor space (so LL-NDK instead of libc/liblog/etc). There will be two
copies of these libraries installed onto the final device.
Since the available runtime interfaces for vendor modules may be
reduced, and your dependencies may not expose their private interfaces,
we allow the vendor variants to reduce their compilation set, and export
a different set of headers:
cc_library {
name: "libfoo",
srcs: ["common.cpp", "private_impl.cpp"],
export_include_dirs: ["include"],
target: {
vendor: {
export_include_dirs: ["include_vndk"],
exclude_srcs: ["private_impl.cpp"],
srcs: ["vendor_only.cpp"],
},
},
}
So the "core" variant would compile with both "common.cpp" and
"private_impl.cpp", and export "include".
The "vendor" variant would compile "common.cpp" and "vendor_only.cpp",
and export "include_vndk".
Bug: 36426473
Bug: 36079834
Test: out/soong/build.ninja, out/soong/Android- only changes due to _core addition and
.llndk -> .vendor
Test: attempt to compile with BOARD_VNDK_VERSION:=current
Change-Id: Idef28764043bf6c33dc0d2e7e2026c38867ff769
2017-04-06 21:43:22 +02:00
|
|
|
}
|
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
func (c *Module) canUseSdk() bool {
|
2020-10-22 00:17:56 +02:00
|
|
|
return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
|
2020-04-07 18:50:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) UseSdk() bool {
|
|
|
|
if c.canUseSdk() {
|
2020-10-01 22:37:16 +02:00
|
|
|
return String(c.Properties.Sdk_version) != ""
|
2020-04-07 18:50:32 +02:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-12-11 00:12:40 +01:00
|
|
|
func (c *Module) isCoverageVariant() bool {
|
|
|
|
return c.coverage.Properties.IsCoverageVariant
|
|
|
|
}
|
|
|
|
|
2019-12-18 01:46:18 +01:00
|
|
|
func (c *Module) IsNdk() bool {
|
2020-07-29 21:59:39 +02:00
|
|
|
return inList(c.BaseModuleName(), ndkKnownLibs)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (c *Module) isLlndk(config android.Config) bool {
|
2019-01-16 13:19:51 +01:00
|
|
|
// Returns true for both LLNDK (public) and LLNDK-private libs.
|
2019-10-30 10:43:49 +01:00
|
|
|
return isLlndkLibrary(c.BaseModuleName(), config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (c *Module) isLlndkPublic(config android.Config) bool {
|
2019-01-16 13:19:51 +01:00
|
|
|
// Returns true only for LLNDK (public) libs.
|
2019-10-30 10:43:49 +01:00
|
|
|
name := c.BaseModuleName()
|
|
|
|
return isLlndkLibrary(name, config) && !isVndkPrivateLibrary(name, config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (c *Module) isVndkPrivate(config android.Config) bool {
|
2019-01-16 13:19:51 +01:00
|
|
|
// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
|
2019-10-30 10:43:49 +01:00
|
|
|
return isVndkPrivateLibrary(c.BaseModuleName(), config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (c *Module) IsVndk() bool {
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.isVndk()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-02-14 11:16:12 +01:00
|
|
|
func (c *Module) isPgoCompile() bool {
|
|
|
|
if pgo := c.pgo; pgo != nil {
|
|
|
|
return pgo.Properties.PgoCompile
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-12-11 00:12:40 +01:00
|
|
|
func (c *Module) isNDKStubLibrary() bool {
|
|
|
|
if _, ok := c.compiler.(*stubDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
func (c *Module) isVndkSp() bool {
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.isVndkSp()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) isVndkExt() bool {
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.isVndkExt()
|
2017-06-23 12:24:43 +02:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (c *Module) MustUseVendorVariant() bool {
|
2019-10-22 12:32:18 +02:00
|
|
|
return c.isVndkSp() || c.Properties.MustUseVendorVariant
|
2018-11-13 05:19:56 +01:00
|
|
|
}
|
|
|
|
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
func (c *Module) getVndkExtendsModuleName() string {
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.getVndkExtendsModuleName()
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
func (c *Module) IsStubs() bool {
|
2020-10-24 02:22:06 +02:00
|
|
|
if lib := c.library; lib != nil {
|
|
|
|
return lib.buildStubs()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) HasStubsVariants() bool {
|
2020-10-24 02:22:06 +02:00
|
|
|
if lib := c.library; lib != nil {
|
|
|
|
return lib.hasStubsVariants()
|
2019-04-24 23:41:12 +02:00
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-10-14 03:43:54 +02:00
|
|
|
// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
|
|
|
|
// the implementation. If it is an implementation library it returns its own name.
|
|
|
|
func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
|
|
|
|
name := ctx.OtherModuleName(c)
|
|
|
|
if versioned, ok := c.linker.(versionedInterface); ok {
|
|
|
|
name = versioned.implementationModuleName(name)
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2019-01-16 14:53:13 +01:00
|
|
|
func (c *Module) bootstrap() bool {
|
|
|
|
return Bool(c.Properties.Bootstrap)
|
|
|
|
}
|
|
|
|
|
2019-03-25 18:21:31 +01:00
|
|
|
func (c *Module) nativeCoverage() bool {
|
2019-09-12 22:18:48 +02:00
|
|
|
// Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
|
|
|
|
if c.Target().NativeBridge == android.NativeBridgeEnabled {
|
|
|
|
return false
|
|
|
|
}
|
2019-03-25 18:21:31 +01:00
|
|
|
return c.linker != nil && c.linker.nativeCoverage()
|
|
|
|
}
|
|
|
|
|
2019-11-15 01:59:12 +01:00
|
|
|
func (c *Module) isSnapshotPrebuilt() bool {
|
2020-06-01 16:23:05 +02:00
|
|
|
if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
|
|
|
|
return p.isSnapshotPrebuilt()
|
2020-01-22 03:11:29 +01:00
|
|
|
}
|
|
|
|
return false
|
2019-11-15 01:59:12 +01:00
|
|
|
}
|
|
|
|
|
2020-09-01 01:07:58 +02:00
|
|
|
func (c *Module) ExcludeFromVendorSnapshot() bool {
|
|
|
|
return Bool(c.Properties.Exclude_from_vendor_snapshot)
|
|
|
|
}
|
|
|
|
|
2019-02-25 03:05:47 +01:00
|
|
|
func isBionic(name string) bool {
|
|
|
|
switch name {
|
2019-11-11 16:33:27 +01:00
|
|
|
case "libc", "libm", "libdl", "libdl_android", "linker":
|
2019-02-25 03:05:47 +01:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-09-11 00:18:20 +02:00
|
|
|
func InstallToBootstrap(name string, config android.Config) bool {
|
2019-04-24 23:41:12 +02:00
|
|
|
if name == "libclang_rt.hwasan-aarch64-android" {
|
2020-05-15 12:05:05 +02:00
|
|
|
return true
|
2019-04-24 23:41:12 +02:00
|
|
|
}
|
|
|
|
return isBionic(name)
|
|
|
|
}
|
|
|
|
|
2018-11-06 01:49:08 +01:00
|
|
|
func (c *Module) XrefCcFiles() android.Paths {
|
|
|
|
return c.kytheFiles
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type baseModuleContext struct {
|
2019-06-06 23:33:29 +02:00
|
|
|
android.BaseModuleContext
|
2016-01-04 23:34:37 +01:00
|
|
|
moduleContextImpl
|
|
|
|
}
|
2015-11-03 01:43:11 +01:00
|
|
|
|
2016-12-14 02:06:13 +01:00
|
|
|
type depsContext struct {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
moduleContextImpl
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type moduleContext struct {
|
2016-05-19 00:37:25 +02:00
|
|
|
android.ModuleContext
|
2016-01-04 23:34:37 +01:00
|
|
|
moduleContextImpl
|
2015-03-17 23:06:21 +01:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
type moduleContextImpl struct {
|
|
|
|
mod *Module
|
|
|
|
ctx BaseModuleContext
|
|
|
|
}
|
|
|
|
|
2016-07-29 22:44:28 +02:00
|
|
|
func (ctx *moduleContextImpl) toolchain() config.Toolchain {
|
2016-01-04 23:34:37 +01:00
|
|
|
return ctx.mod.toolchain(ctx.ctx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) static() bool {
|
2017-11-01 10:20:21 +01:00
|
|
|
return ctx.mod.static()
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
func (ctx *moduleContextImpl) staticBinary() bool {
|
2018-12-18 18:47:14 +01:00
|
|
|
return ctx.mod.staticBinary()
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2019-07-29 14:27:18 +02:00
|
|
|
func (ctx *moduleContextImpl) header() bool {
|
|
|
|
return ctx.mod.header()
|
|
|
|
}
|
|
|
|
|
2020-06-01 14:53:49 +02:00
|
|
|
func (ctx *moduleContextImpl) binary() bool {
|
|
|
|
return ctx.mod.binary()
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:23:05 +02:00
|
|
|
func (ctx *moduleContextImpl) object() bool {
|
|
|
|
return ctx.mod.object()
|
|
|
|
}
|
|
|
|
|
2020-03-06 19:45:53 +01:00
|
|
|
func (ctx *moduleContextImpl) canUseSdk() bool {
|
2020-04-07 18:50:32 +02:00
|
|
|
return ctx.mod.canUseSdk()
|
2020-03-06 19:45:53 +01:00
|
|
|
}
|
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
func (ctx *moduleContextImpl) useSdk() bool {
|
2020-04-07 18:50:32 +02:00
|
|
|
return ctx.mod.UseSdk()
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) sdkVersion() string {
|
2016-06-07 21:34:45 +02:00
|
|
|
if ctx.ctx.Device() {
|
2017-09-28 02:01:44 +02:00
|
|
|
if ctx.useVndk() {
|
2019-11-18 11:52:14 +01:00
|
|
|
vndkVer := ctx.mod.VndkVersion()
|
2020-04-08 02:22:26 +02:00
|
|
|
if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
|
2019-11-18 11:52:14 +01:00
|
|
|
return "current"
|
2018-03-23 09:43:47 +01:00
|
|
|
}
|
2019-11-18 11:52:14 +01:00
|
|
|
return vndkVer
|
2016-11-18 23:54:24 +01:00
|
|
|
}
|
2018-03-23 09:43:47 +01:00
|
|
|
return String(ctx.mod.Properties.Sdk_version)
|
2016-06-07 21:34:45 +02:00
|
|
|
}
|
|
|
|
return ""
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
func (ctx *moduleContextImpl) useVndk() bool {
|
2019-10-18 23:49:46 +02:00
|
|
|
return ctx.mod.UseVndk()
|
2017-09-28 02:01:44 +02:00
|
|
|
}
|
2017-06-23 12:24:43 +02:00
|
|
|
|
2019-01-16 13:19:51 +01:00
|
|
|
func (ctx *moduleContextImpl) isNdk() bool {
|
2019-12-18 01:46:18 +01:00
|
|
|
return ctx.mod.IsNdk()
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
|
|
|
|
return ctx.mod.isLlndk(config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
|
|
|
|
return ctx.mod.isLlndkPublic(config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
2019-05-09 03:56:13 +02:00
|
|
|
func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
|
|
|
|
return ctx.mod.isVndkPrivate(config)
|
2019-01-16 13:19:51 +01:00
|
|
|
}
|
|
|
|
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
func (ctx *moduleContextImpl) isVndk() bool {
|
2019-10-18 23:49:46 +02:00
|
|
|
return ctx.mod.IsVndk()
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
}
|
|
|
|
|
2018-02-14 11:16:12 +01:00
|
|
|
func (ctx *moduleContextImpl) isPgoCompile() bool {
|
|
|
|
return ctx.mod.isPgoCompile()
|
|
|
|
}
|
|
|
|
|
2018-12-11 00:12:40 +01:00
|
|
|
func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
|
|
|
|
return ctx.mod.isNDKStubLibrary()
|
|
|
|
}
|
|
|
|
|
2017-06-23 12:24:43 +02:00
|
|
|
func (ctx *moduleContextImpl) isVndkSp() bool {
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
return ctx.mod.isVndkSp()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isVndkExt() bool {
|
|
|
|
return ctx.mod.isVndkExt()
|
2017-06-23 12:24:43 +02:00
|
|
|
}
|
|
|
|
|
2018-11-13 05:19:56 +01:00
|
|
|
func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
|
2019-10-18 23:49:46 +02:00
|
|
|
return ctx.mod.MustUseVendorVariant()
|
2018-11-13 05:19:56 +01:00
|
|
|
}
|
|
|
|
|
2018-07-10 09:01:19 +02:00
|
|
|
// Check whether ABI dumps should be created for this module.
|
2019-07-29 11:46:59 +02:00
|
|
|
func (ctx *moduleContextImpl) shouldCreateSourceAbiDump() bool {
|
2018-07-10 09:01:19 +02:00
|
|
|
if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
|
|
|
|
return false
|
2018-03-02 04:12:16 +01:00
|
|
|
}
|
2019-01-17 23:44:05 +01:00
|
|
|
|
2020-04-07 15:42:19 +02:00
|
|
|
// Coverage builds have extra symbols.
|
|
|
|
if ctx.mod.isCoverageVariant() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-01-17 23:44:05 +01:00
|
|
|
if ctx.ctx.Fuchsia() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-07-10 09:01:19 +02:00
|
|
|
if sanitize := ctx.mod.sanitize; sanitize != nil {
|
|
|
|
if !sanitize.isVariantOnProductionDevice() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !ctx.ctx.Device() {
|
|
|
|
// Host modules do not need ABI dumps.
|
|
|
|
return false
|
|
|
|
}
|
2020-10-24 02:22:06 +02:00
|
|
|
if ctx.isNDKStubLibrary() {
|
|
|
|
// Stubs do not need ABI dumps.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if lib := ctx.mod.library; lib != nil && lib.buildStubs() {
|
2019-06-25 08:46:52 +02:00
|
|
|
// Stubs do not need ABI dumps.
|
|
|
|
return false
|
|
|
|
}
|
2020-10-24 02:22:06 +02:00
|
|
|
|
2019-07-29 11:46:59 +02:00
|
|
|
return true
|
2017-02-08 22:45:53 +01:00
|
|
|
}
|
|
|
|
|
2016-03-31 06:00:30 +02:00
|
|
|
func (ctx *moduleContextImpl) selectedStl() string {
|
|
|
|
if stl := ctx.mod.stl; stl != nil {
|
|
|
|
return stl.Properties.SelectedStl
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2018-11-27 23:33:03 +01:00
|
|
|
func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
|
|
|
|
return ctx.mod.linker.useClangLld(actx)
|
|
|
|
}
|
|
|
|
|
2016-10-07 01:12:58 +02:00
|
|
|
func (ctx *moduleContextImpl) baseModuleName() string {
|
|
|
|
return ctx.mod.ModuleBase.BaseModuleName()
|
|
|
|
}
|
|
|
|
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
|
|
|
|
return ctx.mod.getVndkExtendsModuleName()
|
|
|
|
}
|
|
|
|
|
2019-12-03 20:18:32 +01:00
|
|
|
func (ctx *moduleContextImpl) isForPlatform() bool {
|
2020-09-16 03:30:11 +02:00
|
|
|
return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
|
2019-12-03 20:18:32 +01:00
|
|
|
}
|
|
|
|
|
2020-08-13 20:24:56 +02:00
|
|
|
func (ctx *moduleContextImpl) apexVariationName() string {
|
2020-09-16 03:30:11 +02:00
|
|
|
return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
2020-07-23 07:32:17 +02:00
|
|
|
func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
|
Enforce apex.min_sdk_version for bundled builds
Previously, when Q-targeting apexes are bundled-built, they are built
against the latest stubs.
It was because unwinder is linked dynamically in R and APIs are provided
by libc while Q apexes should run on Q where libc doesn't provide those
APIs. To make Q apexes run on Q device, libc++ should be linked with
static unwinder. But, because libc++ with static unwinder may cause problem
on HWASAN build, Q apexes were built against the latest stubs for bundled
build.
However, Q apexes should be built against Q stubs.
Now, only for HWASAN builds, Q apexes are built against the latest stubs
(and native modules are not linked with static unwinder).
Bug: 151912436
Test: TARGET_SANITIZE=hwaddress m
=> Q apexes(media, resolv, ..) are linked with the latest stubs
m
=> Q apexes are linked with Q stubs,
and Q apexes' libc++ is linked with static unwinder
Merged-In: If32f1b547e6d93e3955c7521eec8aef5851f908c
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
(cherry picked from commit 7406660685a9a085c433ba7081cc6984f66fa732)
Exempt-From-Owner-Approval: cp from internal
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
2020-03-19 20:29:24 +01:00
|
|
|
return ctx.mod.apexSdkVersion
|
2020-03-06 19:45:53 +01:00
|
|
|
}
|
|
|
|
|
2019-01-16 14:53:13 +01:00
|
|
|
func (ctx *moduleContextImpl) bootstrap() bool {
|
|
|
|
return ctx.mod.bootstrap()
|
|
|
|
}
|
|
|
|
|
2019-03-25 18:21:31 +01:00
|
|
|
func (ctx *moduleContextImpl) nativeCoverage() bool {
|
|
|
|
return ctx.mod.nativeCoverage()
|
|
|
|
}
|
|
|
|
|
2020-09-16 03:30:11 +02:00
|
|
|
func (ctx *moduleContextImpl) directlyInAnyApex() bool {
|
|
|
|
return ctx.mod.DirectlyInAnyApex()
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
2016-01-04 23:34:37 +01:00
|
|
|
return &Module{
|
|
|
|
hod: hod,
|
|
|
|
multilib: multilib,
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
2016-01-04 23:34:37 +01:00
|
|
|
module := newBaseModule(hod, multilib)
|
2016-09-27 00:45:04 +02:00
|
|
|
module.features = []feature{
|
|
|
|
&tidyFeature{},
|
|
|
|
}
|
2016-04-05 00:07:06 +02:00
|
|
|
module.stl = &stl{}
|
2016-01-06 23:41:07 +01:00
|
|
|
module.sanitize = &sanitize{}
|
2017-02-10 01:16:31 +01:00
|
|
|
module.coverage = &coverage{}
|
2017-02-08 22:45:53 +01:00
|
|
|
module.sabi = &sabi{}
|
2017-06-23 12:24:43 +02:00
|
|
|
module.vndkdep = &vndkdep{}
|
2017-05-10 00:44:35 +02:00
|
|
|
module.lto = <o{}
|
2017-09-01 08:38:27 +02:00
|
|
|
module.pgo = &pgo{}
|
2016-01-04 23:34:37 +01:00
|
|
|
return module
|
|
|
|
}
|
2015-03-19 01:17:35 +01:00
|
|
|
|
2016-10-07 01:12:58 +02:00
|
|
|
func (c *Module) Prebuilt() *android.Prebuilt {
|
|
|
|
if p, ok := c.linker.(prebuiltLinkerInterface); ok {
|
|
|
|
return p.prebuilt()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) Name() string {
|
|
|
|
name := c.ModuleBase.Name()
|
2017-04-08 00:21:13 +02:00
|
|
|
if p, ok := c.linker.(interface {
|
|
|
|
Name(string) string
|
|
|
|
}); ok {
|
2016-10-07 01:12:58 +02:00
|
|
|
name = p.Name(name)
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2019-01-18 23:37:31 +01:00
|
|
|
func (c *Module) Symlinks() []string {
|
|
|
|
if p, ok := c.installer.(interface {
|
|
|
|
symlinkList() []string
|
|
|
|
}); ok {
|
|
|
|
return p.symlinkList()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-07-29 17:22:59 +02:00
|
|
|
func (c *Module) IsTestPerSrcAllTestsVariation() bool {
|
|
|
|
test, ok := c.linker.(testPerSrc)
|
|
|
|
return ok && test.isAllTestsVariation()
|
|
|
|
}
|
|
|
|
|
2020-07-09 23:12:52 +02:00
|
|
|
func (c *Module) DataPaths() []android.DataPath {
|
2020-05-13 00:26:55 +02:00
|
|
|
if p, ok := c.installer.(interface {
|
2020-07-09 23:12:52 +02:00
|
|
|
dataPaths() []android.DataPath
|
2020-05-13 00:26:55 +02:00
|
|
|
}); ok {
|
|
|
|
return p.dataPaths()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-11-18 11:52:14 +01:00
|
|
|
func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
|
|
|
|
// Returns the name suffix for product and vendor variants. If the VNDK version is not
|
|
|
|
// "current", it will append the VNDK version to the name suffix.
|
|
|
|
var vndkVersion string
|
|
|
|
var nameSuffix string
|
|
|
|
if c.inProduct() {
|
|
|
|
vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
|
|
|
|
nameSuffix = productSuffix
|
|
|
|
} else {
|
|
|
|
vndkVersion = ctx.DeviceConfig().VndkVersion()
|
|
|
|
nameSuffix = vendorSuffix
|
|
|
|
}
|
|
|
|
if vndkVersion == "current" {
|
|
|
|
vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
|
|
|
|
}
|
|
|
|
if c.Properties.VndkVersion != vndkVersion {
|
|
|
|
// add version suffix only if the module is using different vndk version than the
|
|
|
|
// version in product or vendor partition.
|
|
|
|
nameSuffix += "." + c.Properties.VndkVersion
|
|
|
|
}
|
|
|
|
return nameSuffix
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
|
2019-06-28 16:41:19 +02:00
|
|
|
// Handle the case of a test module split by `test_per_src` mutator.
|
2019-07-29 17:22:59 +02:00
|
|
|
//
|
|
|
|
// The `test_per_src` mutator adds an extra variation named "", depending on all the other
|
|
|
|
// `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
|
|
|
|
// module and return early, as this module does not produce an output file per se.
|
|
|
|
if c.IsTestPerSrcAllTestsVariation() {
|
|
|
|
c.outputFile = android.OptionalPath{}
|
|
|
|
return
|
2019-06-28 16:41:19 +02:00
|
|
|
}
|
|
|
|
|
2020-09-16 03:30:11 +02:00
|
|
|
apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
|
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
c.hideApexVariantFromMake = true
|
|
|
|
}
|
|
|
|
|
2019-05-15 21:01:54 +02:00
|
|
|
c.makeLinkType = c.getMakeLinkType(actx)
|
2019-05-09 03:56:13 +02:00
|
|
|
|
2019-08-26 09:52:35 +02:00
|
|
|
c.Properties.SubName = ""
|
|
|
|
|
|
|
|
if c.Target().NativeBridge == android.NativeBridgeEnabled {
|
|
|
|
c.Properties.SubName += nativeBridgeSuffix
|
|
|
|
}
|
|
|
|
|
2019-11-18 11:52:14 +01:00
|
|
|
_, llndk := c.linker.(*llndkStubDecorator)
|
|
|
|
_, llndkHeader := c.linker.(*llndkHeadersDecorator)
|
|
|
|
if llndk || llndkHeader || (c.UseVndk() && c.HasVendorVariant()) {
|
|
|
|
// .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
|
|
|
|
// added for product variant only when we have vendor and product variants with core
|
|
|
|
// variant. The suffix is not added for vendor-only or product-only module.
|
|
|
|
c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
|
|
|
|
} else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
2019-08-26 09:52:35 +02:00
|
|
|
// .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
|
|
|
|
// such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
|
|
|
|
c.Properties.SubName += vendorSuffix
|
2020-01-22 00:53:22 +01:00
|
|
|
} else if c.InRamdisk() && !c.OnlyInRamdisk() {
|
|
|
|
c.Properties.SubName += ramdiskSuffix
|
2020-10-22 00:17:56 +02:00
|
|
|
} else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
|
|
|
|
c.Properties.SubName += vendorRamdiskSuffix
|
2019-10-18 23:49:46 +02:00
|
|
|
} else if c.InRecovery() && !c.OnlyInRecovery() {
|
2019-08-26 09:52:35 +02:00
|
|
|
c.Properties.SubName += recoverySuffix
|
2020-07-15 22:33:30 +02:00
|
|
|
} else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
|
2020-04-07 18:50:32 +02:00
|
|
|
c.Properties.SubName += sdkSuffix
|
2020-07-15 22:33:30 +02:00
|
|
|
if c.SplitPerApiLevel() {
|
|
|
|
c.Properties.SubName += "." + c.SdkVersion()
|
|
|
|
}
|
2019-08-26 09:52:35 +02:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
ctx := &moduleContext{
|
2016-05-19 00:37:25 +02:00
|
|
|
ModuleContext: actx,
|
2016-01-04 23:34:37 +01:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
|
|
|
|
2017-11-16 23:33:08 +01:00
|
|
|
deps := c.depsToPaths(ctx)
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-10-08 05:54:34 +02:00
|
|
|
if c.Properties.Clang != nil && *c.Properties.Clang == false {
|
|
|
|
ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
flags := Flags{
|
|
|
|
Toolchain: c.toolchain(ctx),
|
2018-11-06 01:49:08 +01:00
|
|
|
EmitXrefs: ctx.Config().EmitXrefRules(),
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
if c.compiler != nil {
|
2017-11-16 23:33:08 +01:00
|
|
|
flags = c.compiler.compilerFlags(ctx, flags, deps)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2016-08-01 22:20:05 +02:00
|
|
|
flags = c.linker.linkerFlags(ctx, flags)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2016-04-05 00:07:06 +02:00
|
|
|
if c.stl != nil {
|
|
|
|
flags = c.stl.flags(ctx, flags)
|
|
|
|
}
|
2016-01-06 23:41:07 +01:00
|
|
|
if c.sanitize != nil {
|
|
|
|
flags = c.sanitize.flags(ctx, flags)
|
|
|
|
}
|
2017-02-10 01:16:31 +01:00
|
|
|
if c.coverage != nil {
|
2019-07-02 23:55:35 +02:00
|
|
|
flags, deps = c.coverage.flags(ctx, flags, deps)
|
2017-02-10 01:16:31 +01:00
|
|
|
}
|
2017-05-10 00:44:35 +02:00
|
|
|
if c.lto != nil {
|
|
|
|
flags = c.lto.flags(ctx, flags)
|
|
|
|
}
|
2017-09-01 08:38:27 +02:00
|
|
|
if c.pgo != nil {
|
|
|
|
flags = c.pgo.flags(ctx, flags)
|
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
for _, feature := range c.features {
|
|
|
|
flags = feature.flags(ctx, flags)
|
|
|
|
}
|
2015-03-18 21:28:46 +01:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-11-04 18:37:55 +01:00
|
|
|
flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
|
|
|
|
flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
|
|
|
|
flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
|
2016-01-04 23:34:37 +01:00
|
|
|
|
2019-11-04 18:37:55 +01:00
|
|
|
flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
|
2019-06-03 12:10:47 +02:00
|
|
|
|
|
|
|
for _, dir := range deps.IncludeDirs {
|
2019-11-04 18:37:55 +01:00
|
|
|
flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
|
2019-06-03 12:10:47 +02:00
|
|
|
}
|
|
|
|
for _, dir := range deps.SystemIncludeDirs {
|
2019-11-04 18:37:55 +01:00
|
|
|
flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
|
2019-06-03 12:10:47 +02:00
|
|
|
}
|
|
|
|
|
2017-01-11 01:21:22 +01:00
|
|
|
c.flags = flags
|
2017-06-15 23:45:18 +02:00
|
|
|
// We need access to all the flags seen by a source file.
|
|
|
|
if c.sabi != nil {
|
|
|
|
flags = c.sabi.flags(ctx, flags)
|
|
|
|
}
|
2019-08-28 06:20:40 +02:00
|
|
|
|
2019-11-04 18:37:55 +01:00
|
|
|
flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
|
2019-08-28 06:20:40 +02:00
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
// Optimization to reduce size of build.ninja
|
|
|
|
// Replace the long list of flags for each file with a module-local variable
|
2019-11-04 18:37:55 +01:00
|
|
|
ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
|
|
|
|
ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
|
|
|
|
ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
|
|
|
|
flags.Local.CFlags = []string{"$cflags"}
|
|
|
|
flags.Local.CppFlags = []string{"$cppflags"}
|
|
|
|
flags.Local.AsFlags = []string{"$asflags"}
|
2015-03-18 21:28:46 +01:00
|
|
|
|
2016-09-27 02:33:01 +02:00
|
|
|
var objs Objects
|
2016-01-04 23:34:37 +01:00
|
|
|
if c.compiler != nil {
|
2016-09-27 02:33:01 +02:00
|
|
|
objs = c.compiler.compile(ctx, flags, deps)
|
2016-01-04 23:34:37 +01:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2018-11-06 01:49:08 +01:00
|
|
|
c.kytheFiles = objs.kytheFiles
|
2015-03-18 22:01:18 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
if c.linker != nil {
|
2016-09-27 02:33:01 +02:00
|
|
|
outputFile := c.linker.link(ctx, flags, deps, objs)
|
2016-01-04 23:34:37 +01:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2016-05-19 00:37:25 +02:00
|
|
|
c.outputFile = android.OptionalPathForPath(outputFile)
|
2018-12-20 14:10:17 +01:00
|
|
|
|
|
|
|
// If a lib is directly included in any of the APEXes, unhide the stubs
|
|
|
|
// variant having the latest version gets visible to make. In addition,
|
|
|
|
// the non-stubs variant is renamed to <libname>.bootstrap. This is to
|
|
|
|
// force anything in the make world to link against the stubs library.
|
|
|
|
// (unless it is explicitly referenced via .bootstrap suffix or the
|
|
|
|
// module is marked with 'bootstrap: true').
|
2020-09-16 03:30:11 +02:00
|
|
|
if c.HasStubsVariants() && c.AnyVariantDirectlyInAnyApex() && !c.InRamdisk() &&
|
2019-10-18 23:49:46 +02:00
|
|
|
!c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
|
2020-10-22 00:17:56 +02:00
|
|
|
c.IsStubs() && !c.InVendorRamdisk() {
|
2018-12-20 14:10:17 +01:00
|
|
|
c.Properties.HideFromMake = false // unhide
|
|
|
|
// Note: this is still non-installable
|
|
|
|
}
|
2020-03-03 14:06:32 +01:00
|
|
|
|
|
|
|
// glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
|
|
|
|
if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
|
2020-09-16 03:30:11 +02:00
|
|
|
if isSnapshotAware(ctx, c, apexInfo) {
|
2020-03-03 14:06:32 +01:00
|
|
|
i.collectHeadersForSnapshot(ctx)
|
|
|
|
}
|
|
|
|
}
|
2016-10-07 01:12:58 +02:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
|
2020-09-16 03:30:11 +02:00
|
|
|
if c.installable(apexInfo) {
|
2016-10-07 01:12:58 +02:00
|
|
|
c.installer.install(ctx, c.outputFile.Path())
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2020-03-04 15:52:46 +01:00
|
|
|
} else if !proptools.BoolDefault(c.Properties.Installable, true) {
|
|
|
|
// If the module has been specifically configure to not be installed then
|
|
|
|
// skip the installation as otherwise it will break when running inside make
|
|
|
|
// as the output path to install will not be specified. Not all uninstallable
|
|
|
|
// modules can skip installation as some are needed for resolving make side
|
|
|
|
// dependencies.
|
|
|
|
c.SkipInstall()
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
|
|
|
|
2019-06-06 23:33:29 +02:00
|
|
|
func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
|
2016-01-04 23:34:37 +01:00
|
|
|
if c.cachedToolchain == nil {
|
2016-07-29 22:44:28 +02:00
|
|
|
c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
return c.cachedToolchain
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
func (c *Module) begin(ctx BaseModuleContext) {
|
|
|
|
if c.compiler != nil {
|
2016-08-01 22:20:05 +02:00
|
|
|
c.compiler.compilerInit(ctx)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2016-08-01 22:20:05 +02:00
|
|
|
c.linker.linkerInit(ctx)
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2016-04-05 00:07:06 +02:00
|
|
|
if c.stl != nil {
|
|
|
|
c.stl.begin(ctx)
|
|
|
|
}
|
2016-01-06 23:41:07 +01:00
|
|
|
if c.sanitize != nil {
|
|
|
|
c.sanitize.begin(ctx)
|
|
|
|
}
|
2017-02-10 01:16:31 +01:00
|
|
|
if c.coverage != nil {
|
|
|
|
c.coverage.begin(ctx)
|
|
|
|
}
|
2017-02-08 22:45:53 +01:00
|
|
|
if c.sabi != nil {
|
|
|
|
c.sabi.begin(ctx)
|
|
|
|
}
|
2017-06-23 12:24:43 +02:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
c.vndkdep.begin(ctx)
|
|
|
|
}
|
2017-05-10 00:44:35 +02:00
|
|
|
if c.lto != nil {
|
|
|
|
c.lto.begin(ctx)
|
|
|
|
}
|
2017-09-01 08:38:27 +02:00
|
|
|
if c.pgo != nil {
|
|
|
|
c.pgo.begin(ctx)
|
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
for _, feature := range c.features {
|
|
|
|
feature.begin(ctx)
|
|
|
|
}
|
2020-07-15 22:33:30 +02:00
|
|
|
if ctx.useSdk() && c.IsSdkVariant() {
|
Replace stringly-typed API levels.
Handling of API levels within Soong is currently fairly difficult
since it isn't always clear based on context what kind of API level a
given string represents, how much canonicalizing and error checking
the code receiving the string are expected to do, or how those errors
should be treated.
The API level struct does not export its raw data, so as to keep its
"constructor" private to the android package, and to prevent misuse of
the `number` field, which is only an implementation detail for preview
API levels. API levels can be parsed with either
`android.ApiLevelFromUser`, which returns any errors to the caller, or
`android.ApiLevelOrPanic`, which is used in the case where the input
is trusted and any errors in parsing should panic. Even within the
`android` package, these APIs should be preferred over direct
construction.
For cases where there are context specific parsing requirements, such
as handling the "minimum" alias in the cc module,
`nativeApiLevelFromUser` and `nativeApiLevelOrPanic` should be used
instead.
Test: treehugger
Bug: http://b/154667674
Change-Id: Id52921fda32cb437fb1775ac2183299dedc0cf20
2020-07-06 23:49:35 +02:00
|
|
|
version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
|
2016-08-06 01:37:52 +02:00
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version", err.Error())
|
Replace stringly-typed API levels.
Handling of API levels within Soong is currently fairly difficult
since it isn't always clear based on context what kind of API level a
given string represents, how much canonicalizing and error checking
the code receiving the string are expected to do, or how those errors
should be treated.
The API level struct does not export its raw data, so as to keep its
"constructor" private to the android package, and to prevent misuse of
the `number` field, which is only an implementation detail for preview
API levels. API levels can be parsed with either
`android.ApiLevelFromUser`, which returns any errors to the caller, or
`android.ApiLevelOrPanic`, which is used in the case where the input
is trusted and any errors in parsing should panic. Even within the
`android` package, these APIs should be preferred over direct
construction.
For cases where there are context specific parsing requirements, such
as handling the "minimum" alias in the cc module,
`nativeApiLevelFromUser` and `nativeApiLevelOrPanic` should be used
instead.
Test: treehugger
Bug: http://b/154667674
Change-Id: Id52921fda32cb437fb1775ac2183299dedc0cf20
2020-07-06 23:49:35 +02:00
|
|
|
c.Properties.Sdk_version = nil
|
|
|
|
} else {
|
|
|
|
c.Properties.Sdk_version = StringPtr(version.String())
|
2016-08-06 01:37:52 +02:00
|
|
|
}
|
|
|
|
}
|
2015-04-25 02:31:52 +02:00
|
|
|
}
|
|
|
|
|
2016-12-14 02:06:13 +01:00
|
|
|
func (c *Module) deps(ctx DepsContext) Deps {
|
2016-04-12 00:06:20 +02:00
|
|
|
deps := Deps{}
|
|
|
|
|
|
|
|
if c.compiler != nil {
|
2016-08-01 22:20:05 +02:00
|
|
|
deps = c.compiler.compilerDeps(ctx, deps)
|
2016-04-12 00:06:20 +02:00
|
|
|
}
|
2018-04-24 00:44:39 +02:00
|
|
|
// Add the PGO dependency (the clang_rt.profile runtime library), which
|
|
|
|
// sometimes depends on symbols from libgcc, before libgcc gets added
|
|
|
|
// in linkerDeps().
|
2017-10-05 01:47:29 +02:00
|
|
|
if c.pgo != nil {
|
|
|
|
deps = c.pgo.deps(ctx, deps)
|
|
|
|
}
|
2016-04-12 00:06:20 +02:00
|
|
|
if c.linker != nil {
|
2016-08-01 22:20:05 +02:00
|
|
|
deps = c.linker.linkerDeps(ctx, deps)
|
2016-04-12 00:06:20 +02:00
|
|
|
}
|
2016-04-05 00:07:06 +02:00
|
|
|
if c.stl != nil {
|
|
|
|
deps = c.stl.deps(ctx, deps)
|
|
|
|
}
|
2016-01-06 23:41:07 +01:00
|
|
|
if c.sanitize != nil {
|
|
|
|
deps = c.sanitize.deps(ctx, deps)
|
|
|
|
}
|
2018-04-24 00:44:39 +02:00
|
|
|
if c.coverage != nil {
|
|
|
|
deps = c.coverage.deps(ctx, deps)
|
|
|
|
}
|
2017-02-08 22:45:53 +01:00
|
|
|
if c.sabi != nil {
|
|
|
|
deps = c.sabi.deps(ctx, deps)
|
|
|
|
}
|
2017-06-23 12:24:43 +02:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
deps = c.vndkdep.deps(ctx, deps)
|
|
|
|
}
|
2017-05-10 00:44:35 +02:00
|
|
|
if c.lto != nil {
|
|
|
|
deps = c.lto.deps(ctx, deps)
|
|
|
|
}
|
2016-04-12 00:06:20 +02:00
|
|
|
for _, feature := range c.features {
|
|
|
|
deps = feature.deps(ctx, deps)
|
|
|
|
}
|
|
|
|
|
2017-10-24 20:13:31 +02:00
|
|
|
deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
|
|
|
|
deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
|
|
|
|
deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
|
|
|
|
deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
|
|
|
|
deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
|
|
|
|
deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
|
2017-12-19 18:17:32 +01:00
|
|
|
deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
|
2016-04-12 00:06:20 +02:00
|
|
|
|
2016-06-07 03:22:19 +02:00
|
|
|
for _, lib := range deps.ReexportSharedLibHeaders {
|
|
|
|
if !inList(lib, deps.SharedLibs) {
|
|
|
|
ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, lib := range deps.ReexportStaticLibHeaders {
|
|
|
|
if !inList(lib, deps.StaticLibs) {
|
|
|
|
ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-13 21:50:57 +01:00
|
|
|
for _, lib := range deps.ReexportHeaderLibHeaders {
|
|
|
|
if !inList(lib, deps.HeaderLibs) {
|
|
|
|
ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-29 02:34:58 +02:00
|
|
|
for _, gen := range deps.ReexportGeneratedHeaders {
|
|
|
|
if !inList(gen, deps.GeneratedHeaders) {
|
|
|
|
ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-12 00:06:20 +02:00
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2016-08-04 22:02:36 +02:00
|
|
|
func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
|
2016-01-04 23:34:37 +01:00
|
|
|
ctx := &baseModuleContext{
|
2019-06-06 23:33:29 +02:00
|
|
|
BaseModuleContext: actx,
|
2016-01-04 23:34:37 +01:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
2015-03-24 22:15:58 +01:00
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
c.begin(ctx)
|
2016-08-04 22:02:36 +02:00
|
|
|
}
|
|
|
|
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
// Split name#version into name and version
|
2019-10-22 13:31:18 +02:00
|
|
|
func StubsLibNameAndVersion(name string) (string, string) {
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
|
|
|
|
version := name[sharp+1:]
|
|
|
|
libname := name[:sharp]
|
|
|
|
return libname, version
|
|
|
|
}
|
|
|
|
return name, ""
|
|
|
|
}
|
|
|
|
|
2020-07-15 22:33:30 +02:00
|
|
|
func GetCrtVariations(ctx android.BottomUpMutatorContext,
|
|
|
|
m LinkableInterface) []blueprint.Variation {
|
|
|
|
if ctx.Os() != android.Android {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if m.UseSdk() {
|
|
|
|
return []blueprint.Variation{
|
|
|
|
{Mutator: "sdk", Variation: "sdk"},
|
2020-09-30 21:27:01 +02:00
|
|
|
{Mutator: "version", Variation: m.SdkVersion()},
|
2020-07-15 22:33:30 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return []blueprint.Variation{
|
|
|
|
{Mutator: "sdk", Variation: ""},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-24 18:56:18 +02:00
|
|
|
func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
|
|
|
|
variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
|
|
|
|
|
|
|
|
variations = append([]blueprint.Variation(nil), variations...)
|
|
|
|
|
2020-10-01 00:34:40 +02:00
|
|
|
if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
|
2020-09-24 18:56:18 +02:00
|
|
|
// Version is explicitly specified. i.e. libFoo#30
|
|
|
|
variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
|
|
|
|
depTag.explicitlyVersioned = true
|
|
|
|
}
|
2020-09-18 23:15:30 +02:00
|
|
|
|
2020-09-24 18:56:18 +02:00
|
|
|
if far {
|
2020-09-18 23:15:30 +02:00
|
|
|
ctx.AddFarVariationDependencies(variations, depTag, name)
|
2020-09-24 18:56:18 +02:00
|
|
|
} else {
|
2020-09-18 23:15:30 +02:00
|
|
|
ctx.AddVariationDependencies(variations, depTag, name)
|
2020-09-24 18:56:18 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-12 23:38:15 +02:00
|
|
|
func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
2020-01-22 03:11:29 +01:00
|
|
|
if !c.Enabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-14 02:06:13 +01:00
|
|
|
ctx := &depsContext{
|
|
|
|
BottomUpMutatorContext: actx,
|
2016-08-04 22:02:36 +02:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2016-04-12 00:06:20 +02:00
|
|
|
deps := c.deps(ctx)
|
2015-04-28 22:30:13 +02:00
|
|
|
|
2020-09-22 12:45:04 +02:00
|
|
|
c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
|
|
|
|
|
2016-06-18 01:45:24 +02:00
|
|
|
variantNdkLibs := []string{}
|
|
|
|
variantLateNdkLibs := []string{}
|
2017-03-19 21:44:32 +01:00
|
|
|
if ctx.Os() == android.Android {
|
2020-01-22 03:11:29 +01:00
|
|
|
// rewriteLibs takes a list of names of shared libraries and scans it for three types
|
2017-09-28 02:01:44 +02:00
|
|
|
// of names:
|
2016-06-18 01:45:24 +02:00
|
|
|
//
|
2017-09-28 02:01:44 +02:00
|
|
|
// 1. Name of an NDK library that refers to a prebuilt module.
|
|
|
|
// For each of these, it adds the name of the prebuilt module (which will be in
|
|
|
|
// prebuilts/ndk) to the list of nonvariant libs.
|
|
|
|
// 2. Name of an NDK library that refers to an ndk_library module.
|
|
|
|
// For each of these, it adds the name of the ndk_library module to the list of
|
|
|
|
// variant libs.
|
|
|
|
// 3. Anything else (so anything that isn't an NDK library).
|
|
|
|
// It adds these to the nonvariantLibs list.
|
2016-06-18 01:45:24 +02:00
|
|
|
//
|
2017-09-28 02:01:44 +02:00
|
|
|
// The caller can then know to add the variantLibs dependencies differently from the
|
|
|
|
// nonvariantLibs
|
2019-05-09 03:56:13 +02:00
|
|
|
|
|
|
|
vendorPublicLibraries := vendorPublicLibraries(actx.Config())
|
2020-01-22 03:11:29 +01:00
|
|
|
vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
|
|
|
|
|
|
|
|
rewriteVendorLibs := func(lib string) string {
|
|
|
|
if isLlndkLibrary(lib, ctx.Config()) {
|
|
|
|
return lib + llndkLibrarySuffix
|
|
|
|
}
|
|
|
|
|
|
|
|
// only modules with BOARD_VNDK_VERSION uses snapshot.
|
|
|
|
if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
|
|
|
|
return lib
|
|
|
|
}
|
|
|
|
|
|
|
|
if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
|
|
|
|
return snapshot
|
|
|
|
}
|
|
|
|
|
|
|
|
return lib
|
|
|
|
}
|
|
|
|
|
|
|
|
rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
|
2017-09-28 02:01:44 +02:00
|
|
|
variantLibs = []string{}
|
|
|
|
nonvariantLibs = []string{}
|
2016-06-18 01:45:24 +02:00
|
|
|
for _, entry := range list {
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
// strip #version suffix out
|
2019-10-22 13:31:18 +02:00
|
|
|
name, _ := StubsLibNameAndVersion(entry)
|
2020-06-30 21:32:51 +02:00
|
|
|
if ctx.useSdk() && inList(name, ndkKnownLibs) {
|
|
|
|
variantLibs = append(variantLibs, name+ndkLibrarySuffix)
|
2020-01-22 03:11:29 +01:00
|
|
|
} else if ctx.useVndk() {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
|
2019-05-09 03:56:13 +02:00
|
|
|
} else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
vendorPublicLib := name + vendorPublicLibrarySuffix
|
Allow platform modules to link to vendor public libraries
Normally, when building with VNDK, platform modules are not allowed to
link against vendor libraries, because the ABI of the vendor libraries
are not guaranteed to be stable and may differ across multiple vendor
images.
However, the vendor public libraries are the exceptions. Vendor public
libraries are vendor libraries that are exposed to 3rd party apps and
listed in /vendor/etc/public.libraries.txt. Since they are intended to
be exposed to public, their ABI stability is guaranteed (by definition,
though it is up to the vendor to actually guarantee it).
This change provides a way to make a vendor lib as public by defining a
module of type 'vendor_public_library' with a map file that enumerates
public symbols that are publicized:
cc_library {
name: "libvendor",
proprietary: true,
...
}
vendor_public_library {
name: "libvendor",
symbol_file: "libvendor.map.txt",
}
This defines a stub library module named libvendor.vendorpublic from the
map file. `shared_libs: ["libvendor"]` is redirected to the stub library
when it is from the outside of the vendor partition.
Bug: 74275385
Test: m -j
Test: cc_test.go passes
Change-Id: I5bed94d7c4282b777632ab2f0fb63c203ee313ba
2018-03-19 10:23:01 +01:00
|
|
|
if actx.OtherModuleExists(vendorPublicLib) {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
|
|
|
|
} else {
|
|
|
|
// This can happen if vendor_public_library module is defined in a
|
|
|
|
// namespace that isn't visible to the current module. In that case,
|
|
|
|
// link to the original library.
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
nonvariantLibs = append(nonvariantLibs, name)
|
Allow platform modules to link to vendor public libraries
Normally, when building with VNDK, platform modules are not allowed to
link against vendor libraries, because the ABI of the vendor libraries
are not guaranteed to be stable and may differ across multiple vendor
images.
However, the vendor public libraries are the exceptions. Vendor public
libraries are vendor libraries that are exposed to 3rd party apps and
listed in /vendor/etc/public.libraries.txt. Since they are intended to
be exposed to public, their ABI stability is guaranteed (by definition,
though it is up to the vendor to actually guarantee it).
This change provides a way to make a vendor lib as public by defining a
module of type 'vendor_public_library' with a map file that enumerates
public symbols that are publicized:
cc_library {
name: "libvendor",
proprietary: true,
...
}
vendor_public_library {
name: "libvendor",
symbol_file: "libvendor.map.txt",
}
This defines a stub library module named libvendor.vendorpublic from the
map file. `shared_libs: ["libvendor"]` is redirected to the stub library
when it is from the outside of the vendor partition.
Bug: 74275385
Test: m -j
Test: cc_test.go passes
Change-Id: I5bed94d7c4282b777632ab2f0fb63c203ee313ba
2018-03-19 10:23:01 +01:00
|
|
|
}
|
2016-06-18 01:45:24 +02:00
|
|
|
} else {
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
// put name#version back
|
2017-03-28 09:08:30 +02:00
|
|
|
nonvariantLibs = append(nonvariantLibs, entry)
|
2016-07-09 08:23:48 +02:00
|
|
|
}
|
|
|
|
}
|
2016-06-18 01:45:24 +02:00
|
|
|
return nonvariantLibs, variantLibs
|
2016-07-09 08:23:48 +02:00
|
|
|
}
|
|
|
|
|
2020-01-22 03:11:29 +01:00
|
|
|
deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
|
|
|
|
deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
|
|
|
|
deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
|
|
|
|
if ctx.useVndk() {
|
|
|
|
for idx, lib := range deps.RuntimeLibs {
|
|
|
|
deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
|
|
|
|
}
|
|
|
|
}
|
2016-07-09 08:23:48 +02:00
|
|
|
}
|
2016-04-12 00:06:20 +02:00
|
|
|
|
2019-01-28 08:16:54 +01:00
|
|
|
buildStubs := false
|
2020-09-29 02:32:47 +02:00
|
|
|
if versioned, ok := c.linker.(versionedInterface); ok {
|
|
|
|
if versioned.buildStubs() {
|
|
|
|
buildStubs = true
|
2020-09-24 05:37:24 +02:00
|
|
|
}
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
}
|
|
|
|
|
2020-01-22 03:11:29 +01:00
|
|
|
rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
|
|
|
|
// only modules with BOARD_VNDK_VERSION uses snapshot.
|
|
|
|
if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
|
|
|
|
return lib
|
|
|
|
}
|
|
|
|
|
|
|
|
if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
|
|
|
|
return snapshot
|
|
|
|
}
|
|
|
|
|
|
|
|
return lib
|
|
|
|
}
|
|
|
|
|
|
|
|
vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
|
2016-12-15 16:39:51 +01:00
|
|
|
for _, lib := range deps.HeaderLibs {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: headerLibraryDependency}
|
2016-12-15 16:39:51 +01:00
|
|
|
if inList(lib, deps.ReexportHeaderLibHeaders) {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag.reexportFlags = true
|
2016-12-15 16:39:51 +01:00
|
|
|
}
|
2020-01-22 03:11:29 +01:00
|
|
|
|
|
|
|
lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
|
|
|
|
|
2019-01-28 08:16:54 +01:00
|
|
|
if buildStubs {
|
2019-11-19 01:00:16 +01:00
|
|
|
actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
|
2019-10-16 20:03:10 +02:00
|
|
|
depTag, lib)
|
2019-01-28 08:16:54 +01:00
|
|
|
} else {
|
|
|
|
actx.AddVariationDependencies(nil, depTag, lib)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if buildStubs {
|
|
|
|
// Stubs lib does not have dependency to other static/shared libraries.
|
|
|
|
// Don't proceed.
|
|
|
|
return
|
2016-12-15 16:39:51 +01:00
|
|
|
}
|
2016-12-13 21:50:57 +01:00
|
|
|
|
2019-02-08 13:00:45 +01:00
|
|
|
syspropImplLibraries := syspropImplLibraries(actx.Config())
|
2020-01-22 03:11:29 +01:00
|
|
|
vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
|
2019-02-08 13:00:45 +01:00
|
|
|
|
2019-02-25 14:14:17 +01:00
|
|
|
for _, lib := range deps.WholeStaticLibs {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
|
2019-02-25 14:14:17 +01:00
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
2020-01-22 03:11:29 +01:00
|
|
|
|
|
|
|
lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
|
|
|
|
|
2019-02-25 14:14:17 +01:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
|
|
|
}
|
|
|
|
|
2016-06-07 03:22:19 +02:00
|
|
|
for _, lib := range deps.StaticLibs {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency}
|
2016-06-07 03:22:19 +02:00
|
|
|
if inList(lib, deps.ReexportStaticLibHeaders) {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag.reexportFlags = true
|
2016-06-07 03:22:19 +02:00
|
|
|
}
|
2019-02-08 13:00:45 +01:00
|
|
|
|
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
|
|
|
|
2020-01-22 03:11:29 +01:00
|
|
|
lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
|
|
|
|
|
2018-07-23 06:18:45 +02:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
2016-06-07 03:22:19 +02:00
|
|
|
}
|
2015-03-24 22:15:58 +01:00
|
|
|
|
Enforce apex.min_sdk_version for bundled builds
Previously, when Q-targeting apexes are bundled-built, they are built
against the latest stubs.
It was because unwinder is linked dynamically in R and APIs are provided
by libc while Q apexes should run on Q where libc doesn't provide those
APIs. To make Q apexes run on Q device, libc++ should be linked with
static unwinder. But, because libc++ with static unwinder may cause problem
on HWASAN build, Q apexes were built against the latest stubs for bundled
build.
However, Q apexes should be built against Q stubs.
Now, only for HWASAN builds, Q apexes are built against the latest stubs
(and native modules are not linked with static unwinder).
Bug: 151912436
Test: TARGET_SANITIZE=hwaddress m
=> Q apexes(media, resolv, ..) are linked with the latest stubs
m
=> Q apexes are linked with Q stubs,
and Q apexes' libc++ is linked with static unwinder
Merged-In: If32f1b547e6d93e3955c7521eec8aef5851f908c
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
(cherry picked from commit 7406660685a9a085c433ba7081cc6984f66fa732)
Exempt-From-Owner-Approval: cp from internal
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
2020-03-19 20:29:24 +01:00
|
|
|
// staticUnwinderDep is treated as staticDep for Q apexes
|
|
|
|
// so that native libraries/binaries are linked with static unwinder
|
|
|
|
// because Q libc doesn't have unwinder APIs
|
|
|
|
if deps.StaticUnwinderIfLegacy {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
|
2020-02-13 02:13:25 +01:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
2020-07-28 06:26:48 +02:00
|
|
|
}, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
|
2020-02-13 02:13:25 +01:00
|
|
|
}
|
|
|
|
|
2020-01-22 03:11:29 +01:00
|
|
|
for _, lib := range deps.LateStaticLibs {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
|
2020-01-22 03:11:29 +01:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
2020-07-28 06:26:48 +02:00
|
|
|
}, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
|
2020-01-22 03:11:29 +01:00
|
|
|
}
|
2015-03-24 22:15:58 +01:00
|
|
|
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
// shared lib names without the #version suffix
|
|
|
|
var sharedLibNames []string
|
|
|
|
|
2016-06-07 03:22:19 +02:00
|
|
|
for _, lib := range deps.SharedLibs {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
|
2016-06-07 03:22:19 +02:00
|
|
|
if inList(lib, deps.ReexportSharedLibHeaders) {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag.reexportFlags = true
|
2016-06-07 03:22:19 +02:00
|
|
|
}
|
2019-02-08 13:00:45 +01:00
|
|
|
|
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
|
|
|
|
2019-10-22 13:31:18 +02:00
|
|
|
name, version := StubsLibNameAndVersion(lib)
|
2019-02-08 13:00:45 +01:00
|
|
|
sharedLibNames = append(sharedLibNames, name)
|
|
|
|
|
2020-09-24 18:56:18 +02:00
|
|
|
variations := []blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}
|
|
|
|
c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
|
2016-06-07 03:22:19 +02:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
for _, lib := range deps.LateSharedLibs {
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if inList(lib, sharedLibNames) {
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
// This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
|
|
|
|
// are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
|
|
|
|
// linking against both the stubs lib and the non-stubs lib at the same time.
|
|
|
|
continue
|
|
|
|
}
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
|
2020-09-24 18:56:18 +02:00
|
|
|
variations := []blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}
|
|
|
|
c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
|
Add support for versioned stubs.
A cc_library or cc_library_shared can be configured to have stubs
variants of the lib.
cc_library_shared {
name: "libfoo",
srcs: ["foo.cpp"],
stubs: {
symbol_file: "foo.map.txt",
versions: ["1", "2", "3"],
},
}
then, stubs variants of libfoo for version 1, 2, and 3 are created
from foo.map.txt. Each version has the symbols from the map file where
each symbol is annotated with the version that the symbol was introduced
via the 'introduced=<ver>' syntax. The versions don't need to be in sync
with the platform versions (e.g., P for 28). The versions are local to
the library.
For another library or executable to use the versioned stubs lib, use
the new 'name#ver' syntax to specify the version:
cc_binary {
name: "test",
....
shared_libs: ["libFoo#2"],
}
Internally, a new mutator 'version' is applied to all cc.Module objects.
By default, a variant named 'impl' is created for the non-stub version.
If the versions property is set, additional variations are created per a
version with the mutable property BuildStubs set as true, which lets the
compiler and the linker to build a stubs lib from the symbol file
instead from the source files.
This feature will be used to enforce stable interfaces among APEXs. When
a lib foo in an APEX is depending on a lib bar in another APEX, then bar
should have stable interface (in C lang) and foo should be depending on
one of the stubs libs of bar. Only libraries in the same APEX as foo can
link against non-stub version of it.
Bug: 112672359
Test: m (cc_test added)
Change-Id: I2488be0b9d7b7b8d7761234dc1c9c0e3add8601c
2018-10-15 15:25:07 +02:00
|
|
|
}
|
2016-04-11 23:37:39 +02:00
|
|
|
|
2020-06-05 23:26:16 +02:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, dataLibDepTag, deps.DataLibs...)
|
|
|
|
|
2018-07-23 06:18:45 +02:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, runtimeDepTag, deps.RuntimeLibs...)
|
2017-12-19 18:17:32 +01:00
|
|
|
|
2016-07-08 19:41:41 +02:00
|
|
|
actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
|
2016-09-29 02:34:58 +02:00
|
|
|
|
|
|
|
for _, gen := range deps.GeneratedHeaders {
|
|
|
|
depTag := genHeaderDepTag
|
|
|
|
if inList(gen, deps.ReexportGeneratedHeaders) {
|
|
|
|
depTag = genHeaderExportDepTag
|
|
|
|
}
|
|
|
|
actx.AddDependency(c, depTag, gen)
|
|
|
|
}
|
2016-04-20 23:21:14 +02:00
|
|
|
|
2020-06-01 16:23:05 +02:00
|
|
|
vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
|
|
|
|
|
2020-07-15 22:33:30 +02:00
|
|
|
crtVariations := GetCrtVariations(ctx, c)
|
2020-09-30 21:27:01 +02:00
|
|
|
actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
|
2016-04-12 00:06:20 +02:00
|
|
|
if deps.CrtBegin != "" {
|
2020-07-15 22:33:30 +02:00
|
|
|
actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
|
|
|
|
rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
|
2015-03-24 22:15:58 +01:00
|
|
|
}
|
2016-04-12 00:06:20 +02:00
|
|
|
if deps.CrtEnd != "" {
|
2020-07-15 22:33:30 +02:00
|
|
|
actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
|
|
|
|
rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
|
2015-03-24 22:15:58 +01:00
|
|
|
}
|
2018-10-12 09:24:23 +02:00
|
|
|
if deps.LinkerFlagsFile != "" {
|
|
|
|
actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
|
|
|
|
}
|
|
|
|
if deps.DynamicLinker != "" {
|
|
|
|
actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
|
2017-09-19 08:19:12 +02:00
|
|
|
}
|
2016-06-18 01:45:24 +02:00
|
|
|
|
|
|
|
version := ctx.sdkVersion()
|
2020-07-28 06:26:48 +02:00
|
|
|
|
|
|
|
ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
|
2016-06-18 01:45:24 +02:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2020-09-30 20:41:33 +02:00
|
|
|
{Mutator: "version", Variation: version},
|
2018-07-23 06:18:45 +02:00
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, ndkStubDepTag, variantNdkLibs...)
|
2020-07-28 06:26:48 +02:00
|
|
|
|
|
|
|
ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
|
2016-06-18 01:45:24 +02:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2020-09-30 20:41:33 +02:00
|
|
|
{Mutator: "version", Variation: version},
|
2018-07-23 06:18:45 +02:00
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, ndkLateStubDepTag, variantLateNdkLibs...)
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
if vndkdep.isVndkExt() {
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2019-11-19 01:00:16 +01:00
|
|
|
c.ImageVariation(),
|
2018-07-23 06:18:45 +02:00
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
|
Support VNDK extensions
This commit adds `extends: "name"` property and provides basic support
to VNDK extensions. This is the simplest example:
```
cc_library {
name: "libvndk",
vendor_available: true,
vndk {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}
```
A vndk extension library must extend an existing vndk library which has
`vendor_available: true`. These two libraries must have the same
`support_system_process` property.
VNDK-ext libraries are installed to `/vendor/lib[64]/vndk` and
VNDK-SP-ext libraries are installed to `/vendor/lib[64]/vndk-sp` by
default.
If there is a matching abi-dumps in `prebuilts/abi-dumps`,
`header-abi-diff` will be invoked to check for ABI breakages.
Bug: 38340960
Test: lunch aosp_walleye-userdebug && make -j8 # runs unit tests
Test: lunch aosp_arm-userdebug && make -j8 # build a target w/o VNDK
Test: Create a lsdump for a vndk lib, add an exported API to vndk lib,
and build fails as expected.
Test: Create a lsdump for a vndk lib, create an vndk extension lib with
extra API, and build succeeds as expected.
Test: Create libutils_ext, add an extra function to libutils_ext, and
call it from a HIDL service.
Change-Id: Iba90e08848ee99814405457f047321e6b52b2df0
2017-10-31 11:04:35 +01:00
|
|
|
}
|
|
|
|
}
|
2015-10-29 23:25:03 +01:00
|
|
|
}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2018-10-03 07:25:58 +02:00
|
|
|
func BeginMutator(ctx android.BottomUpMutatorContext) {
|
2016-08-04 22:02:36 +02:00
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
|
|
|
|
c.beginMutator(ctx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
// Whether a module can link to another module, taking into
|
|
|
|
// account NDK linking.
|
2020-10-19 11:51:07 +02:00
|
|
|
func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
|
2020-07-28 06:26:48 +02:00
|
|
|
tag blueprint.DependencyTag) {
|
|
|
|
|
|
|
|
switch t := tag.(type) {
|
|
|
|
case dependencyTag:
|
|
|
|
if t != vndkExtDepTag {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
case libraryDependencyTag:
|
|
|
|
default:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
if from.Module().Target().Os != android.Android {
|
2017-09-28 02:01:44 +02:00
|
|
|
// Host code is not restricted
|
|
|
|
return
|
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
|
|
|
|
// VNDK is cc.Module supported only for now.
|
|
|
|
if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
|
2017-09-28 02:01:44 +02:00
|
|
|
// Though vendor code is limited by the vendor mutator,
|
|
|
|
// each vendor-available module needs to check
|
|
|
|
// link-type for VNDK.
|
2019-10-18 23:49:46 +02:00
|
|
|
if ccTo, ok := to.(*Module); ok {
|
|
|
|
if ccFrom.vndkdep != nil {
|
|
|
|
ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
|
2016-08-03 23:12:14 +02:00
|
|
|
}
|
2017-09-28 02:01:44 +02:00
|
|
|
return
|
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
if from.SdkVersion() == "" {
|
2017-09-28 02:01:44 +02:00
|
|
|
// Platform code can link to anything
|
|
|
|
return
|
|
|
|
}
|
2020-01-22 00:53:22 +01:00
|
|
|
if from.InRamdisk() {
|
|
|
|
// Ramdisk code is not NDK
|
|
|
|
return
|
|
|
|
}
|
2020-10-22 00:17:56 +02:00
|
|
|
if from.InVendorRamdisk() {
|
|
|
|
// Vendor ramdisk code is not NDK
|
|
|
|
return
|
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
if from.InRecovery() {
|
2018-01-31 16:54:12 +01:00
|
|
|
// Recovery code is not NDK
|
|
|
|
return
|
|
|
|
}
|
2020-10-24 02:22:06 +02:00
|
|
|
if c, ok := to.(*Module); ok {
|
|
|
|
if c.ToolchainLibrary() {
|
|
|
|
// These are always allowed
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if c.NdkPrebuiltStl() {
|
|
|
|
// These are allowed, but they don't set sdk_version
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if c.StubDecorator() {
|
|
|
|
// These aren't real libraries, but are the stub shared libraries that are included in
|
|
|
|
// the NDK.
|
|
|
|
return
|
|
|
|
}
|
2017-09-28 02:01:44 +02:00
|
|
|
}
|
2019-01-14 08:39:03 +01:00
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
|
2019-01-14 08:39:03 +01:00
|
|
|
// Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
|
|
|
|
// to link to libc++ (non-NDK and without sdk_version).
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
if to.SdkVersion() == "" {
|
2017-09-28 02:01:44 +02:00
|
|
|
// NDK code linking to platform code is never okay.
|
|
|
|
ctx.ModuleErrorf("depends on non-NDK-built library %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
ctx.OtherModuleName(to.Module()))
|
2019-02-07 03:30:02 +01:00
|
|
|
return
|
2017-09-28 02:01:44 +02:00
|
|
|
}
|
2016-08-03 23:12:14 +02:00
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
// At this point we know we have two NDK libraries, but we need to
|
|
|
|
// check that we're not linking against anything built against a higher
|
|
|
|
// API level, as it is only valid to link against older or equivalent
|
|
|
|
// APIs.
|
2016-08-03 23:12:14 +02:00
|
|
|
|
2018-04-11 02:48:45 +02:00
|
|
|
// Current can link against anything.
|
2019-10-18 23:49:46 +02:00
|
|
|
if from.SdkVersion() != "current" {
|
2018-04-11 02:48:45 +02:00
|
|
|
// Otherwise we need to check.
|
2019-10-18 23:49:46 +02:00
|
|
|
if to.SdkVersion() == "current" {
|
2018-04-11 02:48:45 +02:00
|
|
|
// Current can't be linked against by anything else.
|
|
|
|
ctx.ModuleErrorf("links %q built against newer API version %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
ctx.OtherModuleName(to.Module()), "current")
|
2018-04-11 02:48:45 +02:00
|
|
|
} else {
|
2019-10-18 23:49:46 +02:00
|
|
|
fromApi, err := strconv.Atoi(from.SdkVersion())
|
2018-04-11 02:48:45 +02:00
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
2018-04-11 03:13:16 +02:00
|
|
|
"Invalid sdk_version value (must be int or current): %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
from.SdkVersion())
|
2018-04-11 02:48:45 +02:00
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
toApi, err := strconv.Atoi(to.SdkVersion())
|
2018-04-11 02:48:45 +02:00
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
2018-04-11 03:13:16 +02:00
|
|
|
"Invalid sdk_version value (must be int or current): %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
to.SdkVersion())
|
2018-04-11 02:48:45 +02:00
|
|
|
}
|
2016-08-03 23:12:14 +02:00
|
|
|
|
2018-04-11 02:48:45 +02:00
|
|
|
if toApi > fromApi {
|
|
|
|
ctx.ModuleErrorf("links %q built against newer API version %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
ctx.OtherModuleName(to.Module()), to.SdkVersion())
|
2018-04-11 02:48:45 +02:00
|
|
|
}
|
|
|
|
}
|
2016-06-07 21:34:45 +02:00
|
|
|
}
|
2017-12-15 22:56:59 +01:00
|
|
|
|
|
|
|
// Also check that the two STL choices are compatible.
|
2019-10-18 23:49:46 +02:00
|
|
|
fromStl := from.SelectedStl()
|
|
|
|
toStl := to.SelectedStl()
|
2017-12-15 22:56:59 +01:00
|
|
|
if fromStl == "" || toStl == "" {
|
|
|
|
// Libraries that don't use the STL are unrestricted.
|
2018-04-11 08:41:38 +02:00
|
|
|
} else if fromStl == "ndk_system" || toStl == "ndk_system" {
|
2017-12-15 22:56:59 +01:00
|
|
|
// We can be permissive with the system "STL" since it is only the C++
|
|
|
|
// ABI layer, but in the future we should make sure that everyone is
|
|
|
|
// using either libc++ or nothing.
|
2018-09-05 01:28:17 +02:00
|
|
|
} else if getNdkStlFamily(from) != getNdkStlFamily(to) {
|
2017-12-15 22:56:59 +01:00
|
|
|
ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
|
2019-10-18 23:49:46 +02:00
|
|
|
from.SelectedStl(), ctx.OtherModuleName(to.Module()),
|
|
|
|
to.SelectedStl())
|
2017-12-15 22:56:59 +01:00
|
|
|
}
|
2017-09-28 02:01:44 +02:00
|
|
|
}
|
2016-06-07 21:34:45 +02:00
|
|
|
|
2020-10-19 11:51:07 +02:00
|
|
|
func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
|
|
|
|
if c, ok := ctx.Module().(*Module); ok {
|
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
|
|
|
ccDep, ok := dep.(LinkableInterface)
|
|
|
|
if ok {
|
|
|
|
checkLinkType(ctx, c, ccDep, depTag)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-09 05:03:06 +02:00
|
|
|
// Tests whether the dependent library is okay to be double loaded inside a single process.
|
2019-01-18 07:20:43 +01:00
|
|
|
// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
|
|
|
|
// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
|
2018-04-09 05:03:06 +02:00
|
|
|
// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
|
2019-01-18 07:20:43 +01:00
|
|
|
func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
|
|
|
|
check := func(child, parent android.Module) bool {
|
|
|
|
to, ok := child.(*Module)
|
|
|
|
if !ok {
|
2020-10-19 11:51:07 +02:00
|
|
|
return false
|
2019-01-18 07:20:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
|
|
|
|
return false
|
|
|
|
}
|
2018-04-09 05:03:06 +02:00
|
|
|
|
2020-10-19 11:51:07 +02:00
|
|
|
// Even if target lib has no vendor variant, keep checking dependency graph
|
|
|
|
// in case it depends on vendor_available but not double_loadable transtively.
|
2019-10-18 23:49:46 +02:00
|
|
|
if !to.HasVendorVariant() {
|
2019-01-18 07:20:43 +01:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2019-10-30 10:43:49 +01:00
|
|
|
if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
|
2019-01-18 07:20:43 +01:00
|
|
|
return false
|
2018-04-09 05:03:06 +02:00
|
|
|
}
|
2019-01-18 07:20:43 +01:00
|
|
|
|
|
|
|
var stringPath []string
|
|
|
|
for _, m := range ctx.GetWalkPath() {
|
|
|
|
stringPath = append(stringPath, m.Name())
|
2018-04-09 05:03:06 +02:00
|
|
|
}
|
2019-01-18 07:20:43 +01:00
|
|
|
ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
|
|
|
|
"VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
|
|
|
|
"(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if module, ok := ctx.Module().(*Module); ok {
|
|
|
|
if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
|
2019-10-30 10:43:49 +01:00
|
|
|
if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
|
2019-01-18 07:20:43 +01:00
|
|
|
ctx.WalkDeps(check)
|
|
|
|
}
|
2018-04-09 05:03:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
// Returns the highest version which is <= maxSdkVersion.
|
|
|
|
// For example, with maxSdkVersion is 10 and versionList is [9,11]
|
|
|
|
// it returns 9 as string. The list of stubs must be in order from
|
|
|
|
// oldest to newest.
|
|
|
|
func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedLibraryStubsInfo,
|
|
|
|
maxSdkVersion android.ApiLevel) (SharedLibraryStubsInfo, error) {
|
|
|
|
|
|
|
|
for i := range stubsInfo {
|
|
|
|
stubInfo := stubsInfo[len(stubsInfo)-i-1]
|
|
|
|
var ver android.ApiLevel
|
|
|
|
if stubInfo.Version == "" {
|
|
|
|
ver = android.FutureApiLevel
|
|
|
|
} else {
|
|
|
|
var err error
|
|
|
|
ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
|
|
|
|
if err != nil {
|
|
|
|
return SharedLibraryStubsInfo{}, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ver.LessThanOrEqualTo(maxSdkVersion) {
|
|
|
|
return stubInfo, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var versionList []string
|
|
|
|
for _, stubInfo := range stubsInfo {
|
|
|
|
versionList = append(versionList, stubInfo.Version)
|
|
|
|
}
|
|
|
|
return SharedLibraryStubsInfo{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
|
|
|
|
}
|
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
// Convert dependencies to paths. Returns a PathDeps containing paths
|
|
|
|
func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|
|
|
var depPaths PathDeps
|
2016-01-04 23:34:37 +01:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
var directStaticDeps []StaticLibraryInfo
|
|
|
|
var directSharedDeps []SharedLibraryInfo
|
2017-09-28 02:05:30 +02:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
reexportExporter := func(exporter FlagExporterInfo) {
|
|
|
|
depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
|
|
|
|
depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
|
|
|
|
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
|
|
|
|
depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
|
|
|
|
depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
|
2019-06-03 12:10:47 +02:00
|
|
|
}
|
|
|
|
|
2020-07-23 06:04:15 +02:00
|
|
|
// For the dependency from platform to apex, use the latest stubs
|
|
|
|
c.apexSdkVersion = android.FutureApiLevel
|
2020-09-16 03:30:11 +02:00
|
|
|
apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
|
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
|
2020-07-23 06:04:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
|
|
|
|
// In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
|
|
|
|
// so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
|
|
|
|
// (b/144430859)
|
|
|
|
c.apexSdkVersion = android.FutureApiLevel
|
|
|
|
}
|
|
|
|
|
2017-10-24 02:59:01 +02:00
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
2017-09-28 02:01:44 +02:00
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
ccDep, ok := dep.(LinkableInterface)
|
|
|
|
if !ok {
|
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
// handling for a few module types that aren't cc Module but that are also supported
|
|
|
|
switch depTag {
|
2016-04-20 23:21:14 +02:00
|
|
|
case genSourceDepTag:
|
2017-09-28 02:01:44 +02:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2016-04-20 23:21:14 +02:00
|
|
|
depPaths.GeneratedSources = append(depPaths.GeneratedSources,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
|
|
|
} else {
|
2017-09-28 02:01:44 +02:00
|
|
|
ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
|
2016-04-20 23:21:14 +02:00
|
|
|
}
|
2017-04-27 01:59:26 +02:00
|
|
|
// Support exported headers from a generated_sources dependency
|
|
|
|
fallthrough
|
2016-09-29 02:34:58 +02:00
|
|
|
case genHeaderDepTag, genHeaderExportDepTag:
|
2017-09-28 02:01:44 +02:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2019-12-06 05:15:38 +01:00
|
|
|
depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
|
2018-02-22 03:28:18 +01:00
|
|
|
genRule.GeneratedDeps()...)
|
2019-10-22 13:19:51 +02:00
|
|
|
dirs := genRule.GeneratedHeaderDirs()
|
2019-06-03 12:10:47 +02:00
|
|
|
depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
|
2017-09-28 02:01:44 +02:00
|
|
|
if depTag == genHeaderExportDepTag {
|
2019-06-03 12:10:47 +02:00
|
|
|
depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
|
2019-12-06 05:15:38 +01:00
|
|
|
depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
2019-06-03 12:10:47 +02:00
|
|
|
depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
|
2017-04-20 15:53:59 +02:00
|
|
|
// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
|
2019-10-22 13:19:51 +02:00
|
|
|
c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
|
2017-04-20 15:53:59 +02:00
|
|
|
|
2016-09-29 02:34:58 +02:00
|
|
|
}
|
2016-04-20 23:21:14 +02:00
|
|
|
} else {
|
2017-09-28 02:01:44 +02:00
|
|
|
ctx.ModuleErrorf("module %q is not a genrule", depName)
|
2016-04-20 23:21:14 +02:00
|
|
|
}
|
2018-10-12 09:24:23 +02:00
|
|
|
case linkerFlagsDepTag:
|
2017-09-28 02:01:44 +02:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2017-09-19 08:19:12 +02:00
|
|
|
files := genRule.GeneratedSourceFiles()
|
|
|
|
if len(files) == 1 {
|
2018-10-12 09:24:23 +02:00
|
|
|
depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
|
2017-09-19 08:19:12 +02:00
|
|
|
} else if len(files) > 1 {
|
2018-10-12 09:24:23 +02:00
|
|
|
ctx.ModuleErrorf("module %q can only generate a single file if used for a linker flag file", depName)
|
2017-09-19 08:19:12 +02:00
|
|
|
}
|
|
|
|
} else {
|
2017-09-28 02:01:44 +02:00
|
|
|
ctx.ModuleErrorf("module %q is not a genrule", depName)
|
2017-09-19 08:19:12 +02:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2016-04-12 00:06:20 +02:00
|
|
|
return
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
2019-03-29 03:30:56 +01:00
|
|
|
if depTag == android.ProtoPluginDepTag {
|
|
|
|
return
|
|
|
|
}
|
2020-03-21 15:21:46 +01:00
|
|
|
if depTag == llndkImplDep {
|
|
|
|
return
|
|
|
|
}
|
2019-03-29 03:30:56 +01:00
|
|
|
|
2017-10-24 02:59:01 +02:00
|
|
|
if dep.Target().Os != ctx.Os() {
|
2017-09-28 02:01:44 +02:00
|
|
|
ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
|
2016-06-02 02:09:44 +02:00
|
|
|
return
|
|
|
|
}
|
2017-10-24 02:59:01 +02:00
|
|
|
if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
|
2020-03-21 15:21:46 +01:00
|
|
|
ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
|
|
|
|
ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
|
2016-04-12 00:06:20 +02:00
|
|
|
return
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2015-04-22 22:07:53 +02:00
|
|
|
|
2017-09-28 02:01:44 +02:00
|
|
|
if depTag == reuseObjTag {
|
2020-10-23 23:53:06 +02:00
|
|
|
// Skip reused objects for stub libraries, they use their own stub object file instead.
|
|
|
|
// The reuseObjTag dependency still exists because the LinkageMutator runs before the
|
|
|
|
// version mutator, so the stubs variant is created from the shared variant that
|
|
|
|
// already has the reuseObjTag dependency on the static variant.
|
2020-10-24 02:22:06 +02:00
|
|
|
if !c.library.buildStubs() {
|
2020-10-23 23:53:06 +02:00
|
|
|
staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
|
|
|
|
objs := staticAnalogue.ReuseObjects
|
|
|
|
depPaths.Objs = depPaths.Objs.Append(objs)
|
|
|
|
depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
|
|
|
|
reexportExporter(depExporterInfo)
|
|
|
|
}
|
2020-09-18 23:15:30 +02:00
|
|
|
return
|
2019-01-31 16:31:10 +01:00
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
linkFile := ccDep.OutputFile()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
if libDepTag, ok := depTag.(libraryDependencyTag); ok {
|
|
|
|
// Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
|
2020-07-23 07:32:17 +02:00
|
|
|
if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
|
2020-07-28 06:26:48 +02:00
|
|
|
return
|
2018-12-20 10:18:08 +01:00
|
|
|
}
|
2020-07-28 06:26:48 +02:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
|
|
|
|
|
|
|
|
var ptr *android.Paths
|
|
|
|
var depPtr *android.Paths
|
|
|
|
|
|
|
|
depFile := android.OptionalPath{}
|
|
|
|
|
|
|
|
switch {
|
|
|
|
case libDepTag.header():
|
|
|
|
// nothing
|
|
|
|
case libDepTag.shared():
|
|
|
|
if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
|
|
|
|
if !ctx.Config().AllowMissingDependencies() {
|
|
|
|
ctx.ModuleErrorf("module %q is not a shared library", depName)
|
|
|
|
} else {
|
|
|
|
ctx.AddMissingDependencies([]string{depName})
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
|
|
|
|
sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryImplementationStubsInfoProvider).(SharedLibraryImplementationStubsInfo)
|
|
|
|
|
|
|
|
if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedLibraryStubsInfos) > 0 {
|
|
|
|
useStubs := false
|
2020-10-24 02:22:06 +02:00
|
|
|
|
|
|
|
if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
|
2020-09-18 23:15:30 +02:00
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
// For platform libraries, use current version of LLNDK
|
|
|
|
// If this is for use_vendor apex we will apply the same rules
|
|
|
|
// of apex sdk enforcement below to choose right version.
|
|
|
|
useStubs = true
|
|
|
|
}
|
|
|
|
} else if apexInfo.IsForPlatform() {
|
|
|
|
// If not building for APEX, use stubs only when it is from
|
|
|
|
// an APEX (and not from platform)
|
2020-10-22 00:17:56 +02:00
|
|
|
// However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// always link to non-stub variant
|
2020-09-18 23:15:30 +02:00
|
|
|
useStubs = dep.(android.ApexModule).AnyVariantDirectlyInAnyApex() && !c.bootstrap()
|
|
|
|
// Another exception: if this module is bundled with an APEX, then
|
|
|
|
// it is linked with the non-stub variant of a module in the APEX
|
|
|
|
// as if this is part of the APEX.
|
|
|
|
testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
|
|
|
|
for _, apexContents := range testFor.ApexContents {
|
|
|
|
if apexContents.DirectlyInApex(depName) {
|
|
|
|
useStubs = false
|
|
|
|
break
|
|
|
|
}
|
2020-04-13 09:19:48 +02:00
|
|
|
}
|
2020-09-18 23:15:30 +02:00
|
|
|
} else {
|
|
|
|
// If building for APEX, use stubs when the parent is in any APEX that
|
|
|
|
// the child is not in.
|
|
|
|
useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
|
2020-04-13 09:19:48 +02:00
|
|
|
}
|
2020-02-26 14:45:42 +01:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
// when to use (unspecified) stubs, check min_sdk_version and choose the right one
|
|
|
|
if useStubs {
|
|
|
|
sharedLibraryStubsInfo, err :=
|
|
|
|
c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedLibraryStubsInfos, c.apexSdkVersion)
|
2020-03-21 15:21:46 +01:00
|
|
|
if err != nil {
|
|
|
|
ctx.OtherModuleErrorf(dep, err.Error())
|
|
|
|
return
|
|
|
|
}
|
2020-09-18 23:15:30 +02:00
|
|
|
sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
|
|
|
|
depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
|
2020-03-21 15:21:46 +01:00
|
|
|
}
|
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
|
|
|
|
depFile = sharedLibraryInfo.TableOfContents
|
2019-11-07 04:15:49 +01:00
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
ptr = &depPaths.SharedLibs
|
|
|
|
switch libDepTag.Order {
|
|
|
|
case earlyLibraryDependency:
|
|
|
|
ptr = &depPaths.EarlySharedLibs
|
|
|
|
depPtr = &depPaths.EarlySharedLibsDeps
|
|
|
|
case normalLibraryDependency:
|
|
|
|
ptr = &depPaths.SharedLibs
|
|
|
|
depPtr = &depPaths.SharedLibsDeps
|
2020-09-18 23:15:30 +02:00
|
|
|
directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
|
2020-07-28 06:26:48 +02:00
|
|
|
case lateLibraryDependency:
|
|
|
|
ptr = &depPaths.LateSharedLibs
|
|
|
|
depPtr = &depPaths.LateSharedLibsDeps
|
|
|
|
default:
|
|
|
|
panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
|
|
|
|
}
|
|
|
|
case libDepTag.static():
|
2020-09-18 23:15:30 +02:00
|
|
|
if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
|
|
|
|
if !ctx.Config().AllowMissingDependencies() {
|
|
|
|
ctx.ModuleErrorf("module %q is not a static library", depName)
|
|
|
|
} else {
|
|
|
|
ctx.AddMissingDependencies([]string{depName})
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
|
|
|
|
linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
|
2020-07-28 06:26:48 +02:00
|
|
|
if libDepTag.wholeStatic {
|
|
|
|
ptr = &depPaths.WholeStaticLibs
|
2020-09-18 23:15:30 +02:00
|
|
|
if len(staticLibraryInfo.Objects.objFiles) > 0 {
|
|
|
|
depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
|
2020-07-28 06:26:48 +02:00
|
|
|
} else {
|
2020-09-18 23:15:30 +02:00
|
|
|
// This case normally catches prebuilt static
|
|
|
|
// libraries, but it can also occur when
|
|
|
|
// AllowMissingDependencies is on and the
|
|
|
|
// dependencies has no sources of its own
|
|
|
|
// but has a whole_static_libs dependency
|
|
|
|
// on a missing library. We want to depend
|
|
|
|
// on the .a file so that there is something
|
|
|
|
// in the dependency tree that contains the
|
|
|
|
// error rule for the missing transitive
|
|
|
|
// dependency.
|
|
|
|
depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
2020-04-17 18:34:31 +02:00
|
|
|
} else {
|
2020-07-28 06:26:48 +02:00
|
|
|
switch libDepTag.Order {
|
|
|
|
case earlyLibraryDependency:
|
|
|
|
panic(fmt.Errorf("early static libs not suppported"))
|
|
|
|
case normalLibraryDependency:
|
|
|
|
// static dependencies will be handled separately so they can be ordered
|
|
|
|
// using transitive dependencies.
|
|
|
|
ptr = nil
|
2020-09-18 23:15:30 +02:00
|
|
|
directStaticDeps = append(directStaticDeps, staticLibraryInfo)
|
2020-07-28 06:26:48 +02:00
|
|
|
case lateLibraryDependency:
|
|
|
|
ptr = &depPaths.LateStaticLibs
|
|
|
|
default:
|
|
|
|
panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
|
|
|
|
}
|
2020-04-17 18:34:31 +02:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
2017-02-10 01:16:31 +01:00
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
if libDepTag.static() && !libDepTag.wholeStatic {
|
|
|
|
if !ccDep.CcLibraryInterface() || !ccDep.Static() {
|
|
|
|
ctx.ModuleErrorf("module %q not a static library", depName)
|
|
|
|
return
|
2019-10-15 11:16:05 +02:00
|
|
|
}
|
2016-10-01 02:10:16 +02:00
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
// When combining coverage files for shared libraries and executables, coverage files
|
|
|
|
// in static libraries act as if they were whole static libraries. The same goes for
|
|
|
|
// source based Abi dump files.
|
|
|
|
if c, ok := ccDep.(*Module); ok {
|
|
|
|
staticLib := c.linker.(libraryInterface)
|
|
|
|
depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
|
|
|
|
staticLib.objs().coverageFiles...)
|
|
|
|
depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
|
|
|
|
staticLib.objs().sAbiDumpFiles...)
|
2020-09-18 23:15:30 +02:00
|
|
|
} else {
|
2020-07-28 06:26:48 +02:00
|
|
|
// Handle non-CC modules here
|
|
|
|
depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
|
2020-09-18 23:15:30 +02:00
|
|
|
ccDep.CoverageFiles()...)
|
2020-07-28 06:26:48 +02:00
|
|
|
}
|
2016-10-01 02:10:16 +02:00
|
|
|
}
|
2020-03-13 17:30:34 +01:00
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
if ptr != nil {
|
|
|
|
if !linkFile.Valid() {
|
|
|
|
if !ctx.Config().AllowMissingDependencies() {
|
|
|
|
ctx.ModuleErrorf("module %q missing output file", depName)
|
2020-01-22 03:11:29 +01:00
|
|
|
} else {
|
2020-07-28 06:26:48 +02:00
|
|
|
ctx.AddMissingDependencies([]string{depName})
|
2020-01-22 03:11:29 +01:00
|
|
|
}
|
2020-07-28 06:26:48 +02:00
|
|
|
return
|
2020-01-22 03:11:29 +01:00
|
|
|
}
|
2020-07-28 06:26:48 +02:00
|
|
|
*ptr = append(*ptr, linkFile.Path())
|
2020-01-22 03:11:29 +01:00
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
if depPtr != nil {
|
|
|
|
dep := depFile
|
|
|
|
if !dep.Valid() {
|
|
|
|
dep = linkFile
|
|
|
|
}
|
|
|
|
*depPtr = append(*depPtr, dep.Path())
|
2017-07-18 06:23:39 +02:00
|
|
|
}
|
2017-12-19 18:17:32 +01:00
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
|
|
|
|
depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
|
|
|
|
depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
|
|
|
|
depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
|
|
|
|
|
|
|
|
if libDepTag.reexportFlags {
|
|
|
|
reexportExporter(depExporterInfo)
|
|
|
|
// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
|
|
|
|
// Re-exported shared library headers must be included as well since they can help us with type information
|
|
|
|
// about template instantiations (instantiated from their headers).
|
|
|
|
// -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
|
|
|
|
// scripts.
|
|
|
|
c.sabi.Properties.ReexportedIncludes = append(
|
|
|
|
c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
|
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
|
|
|
|
switch {
|
|
|
|
case libDepTag.header():
|
2020-07-29 21:48:33 +02:00
|
|
|
c.Properties.AndroidMkHeaderLibs = append(
|
|
|
|
c.Properties.AndroidMkHeaderLibs, makeLibName)
|
2020-07-28 06:26:48 +02:00
|
|
|
case libDepTag.shared():
|
2020-10-24 02:22:06 +02:00
|
|
|
if lib := moduleLibraryInterface(dep); lib != nil {
|
|
|
|
if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
|
2020-07-28 06:26:48 +02:00
|
|
|
// Add the dependency to the APEX(es) providing the library so that
|
|
|
|
// m <module> can trigger building the APEXes as well.
|
2020-09-16 03:30:11 +02:00
|
|
|
depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
|
|
|
|
for _, an := range depApexInfo.InApexes {
|
2020-07-28 06:26:48 +02:00
|
|
|
c.Properties.ApexesProvidingSharedLibs = append(
|
|
|
|
c.Properties.ApexesProvidingSharedLibs, an)
|
|
|
|
}
|
2018-12-07 15:08:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
// Note: the order of libs in this list is not important because
|
|
|
|
// they merely serve as Make dependencies and do not affect this lib itself.
|
2020-07-29 21:48:33 +02:00
|
|
|
c.Properties.AndroidMkSharedLibs = append(
|
|
|
|
c.Properties.AndroidMkSharedLibs, makeLibName)
|
2020-07-28 06:26:48 +02:00
|
|
|
// Record baseLibName for snapshots.
|
|
|
|
c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
|
|
|
|
case libDepTag.static():
|
|
|
|
if libDepTag.wholeStatic {
|
|
|
|
c.Properties.AndroidMkWholeStaticLibs = append(
|
|
|
|
c.Properties.AndroidMkWholeStaticLibs, makeLibName)
|
|
|
|
} else {
|
|
|
|
c.Properties.AndroidMkStaticLibs = append(
|
|
|
|
c.Properties.AndroidMkStaticLibs, makeLibName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
switch depTag {
|
|
|
|
case runtimeDepTag:
|
|
|
|
c.Properties.AndroidMkRuntimeLibs = append(
|
|
|
|
c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
|
|
|
|
// Record baseLibName for snapshots.
|
|
|
|
c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
|
|
|
|
case objDepTag:
|
|
|
|
depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
|
|
|
|
case CrtBeginDepTag:
|
|
|
|
depPaths.CrtBegin = linkFile
|
|
|
|
case CrtEndDepTag:
|
|
|
|
depPaths.CrtEnd = linkFile
|
|
|
|
case dynamicLinkerDepTag:
|
|
|
|
depPaths.DynamicLinker = linkFile
|
|
|
|
}
|
2017-07-18 06:23:39 +02:00
|
|
|
}
|
2016-01-04 23:34:37 +01:00
|
|
|
})
|
|
|
|
|
2017-09-28 02:05:30 +02:00
|
|
|
// use the ordered dependencies as this module's dependencies
|
2020-09-18 23:15:30 +02:00
|
|
|
orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
|
|
|
|
depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
|
|
|
|
depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
|
2017-09-28 02:05:30 +02:00
|
|
|
|
2017-05-17 22:44:16 +02:00
|
|
|
// Dedup exported flags from dependencies
|
2017-10-24 20:13:31 +02:00
|
|
|
depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
|
2019-10-22 13:19:51 +02:00
|
|
|
depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
|
|
|
|
depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
|
2019-12-06 05:15:38 +01:00
|
|
|
depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
|
2019-10-22 13:19:51 +02:00
|
|
|
depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
|
|
|
|
depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
|
2017-10-24 20:13:31 +02:00
|
|
|
depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
|
2019-06-03 12:10:47 +02:00
|
|
|
depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
|
2019-12-06 05:15:38 +01:00
|
|
|
depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
|
2017-08-29 21:28:37 +02:00
|
|
|
|
|
|
|
if c.sabi != nil {
|
2019-06-03 12:10:47 +02:00
|
|
|
c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
|
2017-08-29 21:28:37 +02:00
|
|
|
}
|
2017-05-17 22:44:16 +02:00
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
return depPaths
|
|
|
|
}
|
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
|
|
|
|
// to match the topological order of the dependency tree, including any static analogues of
|
|
|
|
// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
|
|
|
|
// of the transitive dependencies.
|
|
|
|
func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
|
|
|
|
transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
|
|
|
|
var staticPaths android.Paths
|
|
|
|
for _, staticDep := range staticDeps {
|
|
|
|
staticPaths = append(staticPaths, staticDep.StaticLibrary)
|
|
|
|
transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
|
|
|
|
}
|
|
|
|
for _, sharedDep := range sharedDeps {
|
|
|
|
if sharedDep.StaticAnalogue != nil {
|
|
|
|
transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
|
|
|
|
|
|
|
|
orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
|
|
|
|
|
|
|
|
// reorder the dependencies based on transitive dependencies
|
|
|
|
staticPaths = android.FirstUniquePaths(staticPaths)
|
|
|
|
_, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
|
|
|
|
|
|
|
|
if len(orderedStaticPaths) != len(staticPaths) {
|
|
|
|
missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
|
|
|
|
panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
|
|
|
|
}
|
|
|
|
|
|
|
|
return orderedStaticPaths, transitiveStaticLibs
|
|
|
|
}
|
|
|
|
|
2020-07-28 06:26:48 +02:00
|
|
|
// baseLibName trims known prefixes and suffixes
|
|
|
|
func baseLibName(depName string) string {
|
|
|
|
libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
|
|
|
|
libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
|
|
|
|
libName = strings.TrimPrefix(libName, "prebuilt_")
|
|
|
|
return libName
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
|
|
|
|
vendorSuffixModules := vendorSuffixModules(ctx.Config())
|
|
|
|
vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
|
|
|
|
|
|
|
|
libName := baseLibName(depName)
|
|
|
|
isLLndk := isLlndkLibrary(libName, ctx.Config())
|
|
|
|
isVendorPublicLib := inList(libName, *vendorPublicLibraries)
|
|
|
|
bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
|
|
|
|
|
|
|
|
if c, ok := ccDep.(*Module); ok {
|
|
|
|
// Use base module name for snapshots when exporting to Makefile.
|
|
|
|
if c.isSnapshotPrebuilt() {
|
|
|
|
baseName := c.BaseModuleName()
|
|
|
|
|
|
|
|
if c.IsVndk() {
|
|
|
|
return baseName + ".vendor"
|
|
|
|
}
|
|
|
|
|
|
|
|
if vendorSuffixModules[baseName] {
|
|
|
|
return baseName + ".vendor"
|
|
|
|
} else {
|
|
|
|
return baseName
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-22 00:17:56 +02:00
|
|
|
if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
|
|
|
|
!c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
|
2020-07-28 06:26:48 +02:00
|
|
|
// The vendor module is a no-vendor-variant VNDK library. Depend on the
|
|
|
|
// core module instead.
|
|
|
|
return libName
|
|
|
|
} else if c.UseVndk() && bothVendorAndCoreVariantsExist {
|
|
|
|
// The vendor module in Make will have been renamed to not conflict with the core
|
|
|
|
// module, so update the dependency name here accordingly.
|
|
|
|
return libName + c.getNameSuffixWithVndkVersion(ctx)
|
|
|
|
} else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
|
|
|
|
return libName + vendorPublicLibrarySuffix
|
|
|
|
} else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
|
|
|
|
return libName + ramdiskSuffix
|
2020-10-22 00:17:56 +02:00
|
|
|
} else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
|
|
|
|
return libName + vendorRamdiskSuffix
|
2020-07-28 06:26:48 +02:00
|
|
|
} else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
|
|
|
|
return libName + recoverySuffix
|
|
|
|
} else if ccDep.Module().Target().NativeBridge == android.NativeBridgeEnabled {
|
|
|
|
return libName + nativeBridgeSuffix
|
|
|
|
} else {
|
|
|
|
return libName
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-04 23:34:37 +01:00
|
|
|
func (c *Module) InstallInData() bool {
|
|
|
|
if c.installer == nil {
|
|
|
|
return false
|
|
|
|
}
|
2017-03-30 07:00:18 +02:00
|
|
|
return c.installer.inData()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) InstallInSanitizerDir() bool {
|
|
|
|
if c.installer == nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if c.sanitize != nil && c.sanitize.inSanitizerDir() {
|
2016-08-29 22:41:32 +02:00
|
|
|
return true
|
|
|
|
}
|
2017-03-30 07:00:18 +02:00
|
|
|
return c.installer.inSanitizerDir()
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
2020-01-22 00:53:22 +01:00
|
|
|
func (c *Module) InstallInRamdisk() bool {
|
|
|
|
return c.InRamdisk()
|
|
|
|
}
|
|
|
|
|
2020-10-22 00:17:56 +02:00
|
|
|
func (c *Module) InstallInVendorRamdisk() bool {
|
|
|
|
return c.InVendorRamdisk()
|
|
|
|
}
|
|
|
|
|
2018-01-31 16:54:12 +01:00
|
|
|
func (c *Module) InstallInRecovery() bool {
|
2019-10-18 23:49:46 +02:00
|
|
|
return c.InRecovery()
|
2018-01-31 16:54:12 +01:00
|
|
|
}
|
|
|
|
|
2020-08-06 23:34:42 +02:00
|
|
|
func (c *Module) MakeUninstallable() {
|
2020-03-31 17:05:34 +02:00
|
|
|
if c.installer == nil {
|
2020-08-06 23:34:42 +02:00
|
|
|
c.ModuleBase.MakeUninstallable()
|
2020-03-31 17:05:34 +02:00
|
|
|
return
|
|
|
|
}
|
2020-08-06 23:34:42 +02:00
|
|
|
c.installer.makeUninstallable(c)
|
2020-03-31 17:05:34 +02:00
|
|
|
}
|
|
|
|
|
2016-09-29 01:18:03 +02:00
|
|
|
func (c *Module) HostToolPath() android.OptionalPath {
|
|
|
|
if c.installer == nil {
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
return c.installer.hostToolPath()
|
|
|
|
}
|
|
|
|
|
2017-07-12 21:55:28 +02:00
|
|
|
func (c *Module) IntermPathForModuleOut() android.OptionalPath {
|
|
|
|
return c.outputFile
|
|
|
|
}
|
|
|
|
|
2019-05-29 23:40:35 +02:00
|
|
|
func (c *Module) OutputFiles(tag string) (android.Paths, error) {
|
|
|
|
switch tag {
|
|
|
|
case "":
|
|
|
|
if c.outputFile.Valid() {
|
|
|
|
return android.Paths{c.outputFile.Path()}, nil
|
|
|
|
}
|
|
|
|
return android.Paths{}, nil
|
|
|
|
default:
|
|
|
|
return nil, fmt.Errorf("unsupported module reference tag %q", tag)
|
2017-09-14 03:37:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-01 10:20:21 +01:00
|
|
|
func (c *Module) static() bool {
|
|
|
|
if static, ok := c.linker.(interface {
|
|
|
|
static() bool
|
|
|
|
}); ok {
|
|
|
|
return static.static()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-12-18 18:47:14 +01:00
|
|
|
func (c *Module) staticBinary() bool {
|
|
|
|
if static, ok := c.linker.(interface {
|
|
|
|
staticBinary() bool
|
|
|
|
}); ok {
|
|
|
|
return static.staticBinary()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-07-29 14:27:18 +02:00
|
|
|
func (c *Module) header() bool {
|
|
|
|
if h, ok := c.linker.(interface {
|
|
|
|
header() bool
|
|
|
|
}); ok {
|
|
|
|
return h.header()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-06-01 14:53:49 +02:00
|
|
|
func (c *Module) binary() bool {
|
|
|
|
if b, ok := c.linker.(interface {
|
|
|
|
binary() bool
|
|
|
|
}); ok {
|
|
|
|
return b.binary()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-06-01 16:23:05 +02:00
|
|
|
func (c *Module) object() bool {
|
|
|
|
if o, ok := c.linker.(interface {
|
|
|
|
object() bool
|
|
|
|
}); ok {
|
|
|
|
return o.object()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-05-15 21:01:54 +02:00
|
|
|
func (c *Module) getMakeLinkType(actx android.ModuleContext) string {
|
2019-10-18 23:49:46 +02:00
|
|
|
if c.UseVndk() {
|
2019-05-15 21:01:54 +02:00
|
|
|
if lib, ok := c.linker.(*llndkStubDecorator); ok {
|
|
|
|
if Bool(lib.Properties.Vendor_available) {
|
2018-09-05 01:28:17 +02:00
|
|
|
return "native:vndk"
|
|
|
|
}
|
2019-05-15 21:01:54 +02:00
|
|
|
return "native:vndk_private"
|
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
if c.IsVndk() && !c.isVndkExt() {
|
2019-05-15 21:01:54 +02:00
|
|
|
if Bool(c.VendorProperties.Vendor_available) {
|
|
|
|
return "native:vndk"
|
|
|
|
}
|
|
|
|
return "native:vndk_private"
|
2018-09-05 01:28:17 +02:00
|
|
|
}
|
2019-11-18 11:52:14 +01:00
|
|
|
if c.inProduct() {
|
|
|
|
return "native:product"
|
|
|
|
}
|
2019-05-15 21:01:54 +02:00
|
|
|
return "native:vendor"
|
2020-01-22 00:53:22 +01:00
|
|
|
} else if c.InRamdisk() {
|
|
|
|
return "native:ramdisk"
|
2020-10-22 00:17:56 +02:00
|
|
|
} else if c.InVendorRamdisk() {
|
|
|
|
return "native:vendor_ramdisk"
|
2019-10-18 23:49:46 +02:00
|
|
|
} else if c.InRecovery() {
|
2018-09-05 01:28:17 +02:00
|
|
|
return "native:recovery"
|
|
|
|
} else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
|
|
|
|
return "native:ndk:none:none"
|
|
|
|
// TODO(b/114741097): use the correct ndk stl once build errors have been fixed
|
|
|
|
//family, link := getNdkStlFamilyAndLinkType(c)
|
|
|
|
//return fmt.Sprintf("native:ndk:%s:%s", family, link)
|
2019-10-18 23:49:46 +02:00
|
|
|
} else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
|
2018-11-13 05:19:56 +01:00
|
|
|
return "native:platform_vndk"
|
2018-09-05 01:28:17 +02:00
|
|
|
} else {
|
|
|
|
return "native:platform"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-02 17:38:19 +02:00
|
|
|
// Overrides ApexModule.IsInstallabeToApex()
|
2019-07-29 17:22:59 +02:00
|
|
|
// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
|
2018-10-02 17:38:19 +02:00
|
|
|
func (c *Module) IsInstallableToApex() bool {
|
2020-10-24 02:22:06 +02:00
|
|
|
if lib := c.library; lib != nil {
|
2019-10-22 13:31:18 +02:00
|
|
|
// Stub libs and prebuilt libs in a versioned SDK are not
|
|
|
|
// installable to APEX even though they are shared libs.
|
2020-10-24 02:22:06 +02:00
|
|
|
return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
|
2019-07-29 17:22:59 +02:00
|
|
|
} else if _, ok := c.linker.(testPerSrc); ok {
|
|
|
|
return true
|
2018-10-02 17:38:19 +02:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-10-07 08:47:24 +02:00
|
|
|
func (c *Module) AvailableFor(what string) bool {
|
|
|
|
if linker, ok := c.linker.(interface {
|
|
|
|
availableFor(string) bool
|
|
|
|
}); ok {
|
|
|
|
return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
|
|
|
|
} else {
|
|
|
|
return c.ApexModuleBase.AvailableFor(what)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-13 09:19:48 +02:00
|
|
|
func (c *Module) TestFor() []string {
|
|
|
|
if test, ok := c.linker.(interface {
|
|
|
|
testFor() []string
|
|
|
|
}); ok {
|
|
|
|
return test.testFor()
|
|
|
|
} else {
|
|
|
|
return c.ApexModuleBase.TestFor()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Reland: Deduplicate APEX variants that would build identically
APEX variants that share the same SDK version and updatability
almost always use identical command line arguments to build but
with different intermediates directories. This causes unnecessary
build time and disk space for duplicated work.
Deduplicate APEX variants that would build identically. Create
aliases from the per-APEX variations to the new shared variations
so that the APEX modules can continue to depend on them via the
APEX name as the variation.
This has one significant change in behavior. Before this change,
if an APEX had two libraries in its direct dependencies and one
of those libraries depended on the other, and the second library
had stubs, then the first library would depend on the implementation
of the second library and not the stubs. After this change, if
the first library is also present in a second APEX but the second
library is not, then the common variant shared between the two
APEXes would use the stubs, not the implementation.
In a correctly configured set of build rules this change will
be irrelevant, because if the compilation worked for the second
APEX using stubs then it will work for the common variant using
stubs. However, if an incorrect change to the build rules is
made this could lead to confusing errors, as a previously-working
common variant could suddenly stop building when a module is added
to a new APEX without its dependencies that require implementation
APIs to compile.
This change reduces the number of modules in an AOSP arm64-userdebug
build by 3% (52242 to 50586), reduces the number of variants of the
libcutils module from 74 to 53, and reduces the number of variants
of the massive libart[d] modules from 44 to 32.
This relands I0529837476a253c32b3dfb98dcccf107427c742c with a fix
to always mark permissions XML files of java_sdk_library modules as
unique per apex since they contain the APEX filename, and a fix
to UpdateUniqueApexVariationsForDeps to check ApexInfo.InApexes
instead of DepIsInSameApex to check if two modules are in the same
apex to account for a module that depends on another in a way that
doesn't normally include the dependency in the APEX (e.g. a libs
property), but the dependency is directly included in the APEX.
Bug: 164216768
Test: go test ./build/soong/apex/...
Change-Id: I2ae170601f764e5b88d0be2e0e6adc84e3a4d9cc
2020-08-11 21:17:01 +02:00
|
|
|
func (c *Module) UniqueApexVariations() bool {
|
|
|
|
if u, ok := c.compiler.(interface {
|
|
|
|
uniqueApexVariations() bool
|
|
|
|
}); ok {
|
|
|
|
return u.uniqueApexVariations()
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-04 15:52:46 +01:00
|
|
|
// Return true if the module is ever installable.
|
|
|
|
func (c *Module) EverInstallable() bool {
|
|
|
|
return c.installer != nil &&
|
|
|
|
// Check to see whether the module is actually ever installable.
|
|
|
|
c.installer.everInstallable()
|
|
|
|
}
|
|
|
|
|
2020-09-16 03:30:11 +02:00
|
|
|
func (c *Module) installable(apexInfo android.ApexInfo) bool {
|
2020-03-04 15:52:46 +01:00
|
|
|
ret := c.EverInstallable() &&
|
|
|
|
// Check to see whether the module has been configured to not be installed.
|
|
|
|
proptools.BoolDefault(c.Properties.Installable, true) &&
|
|
|
|
!c.Properties.PreventInstall && c.outputFile.Valid()
|
2020-01-07 08:59:44 +01:00
|
|
|
|
|
|
|
// The platform variant doesn't need further condition. Apex variants however might not
|
|
|
|
// be installable because it will likely to be included in the APEX and won't appear
|
|
|
|
// in the system partition.
|
2020-09-16 03:30:11 +02:00
|
|
|
if apexInfo.IsForPlatform() {
|
2020-01-07 08:59:44 +01:00
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
// Special case for modules that are configured to be installed to /data, which includes
|
|
|
|
// test modules. For these modules, both APEX and non-APEX variants are considered as
|
|
|
|
// installable. This is because even the APEX variants won't be included in the APEX, but
|
|
|
|
// will anyway be installed to /data/*.
|
|
|
|
// See b/146995717
|
|
|
|
if c.InstallInData() {
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
2019-05-09 06:29:15 +02:00
|
|
|
}
|
|
|
|
|
2019-04-10 07:33:58 +02:00
|
|
|
func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
|
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(*libraryDecorator); ok {
|
|
|
|
library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-15 08:20:07 +02:00
|
|
|
func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
|
2020-07-28 06:26:48 +02:00
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
|
|
|
libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
|
|
|
|
|
|
|
|
if cc, ok := dep.(*Module); ok {
|
|
|
|
if cc.HasStubsVariants() {
|
|
|
|
if isLibDepTag && libDepTag.shared() {
|
|
|
|
// dynamic dep to a stubs lib crosses APEX boundary
|
|
|
|
return false
|
shared_lib dependency from a static lib crosses the APEX boundary
cc_library_static {
name: "libfoo",
shared_libs: ["libbar"],
}
cc_library {
name: "libbar",
}
If libfoo is part of an APEX, then libbar is no longer considered as a
member of the APEX, because it isn't actually linked to libfoo.
To distinguish such a shared lib dependency from a static library from a
shared lib dependency from a shared library, a new dep type
SharedFromStaticDepTag is introduced. It is treated exactly the same as
SharedDepTag, except when we determine whether a dependency is crossing
the APEX boundary or not.
This allows us to check the apex_available property more correctly.
Previously, modules were incorrectly considered as being used for an
APEX due to the shared lib dependency from a static lib.
As a good side effect, this also reduces the number of APEX variants.
Specifically, on aosp_arm64, the number of the generated modules were
reduced from 44745 to 44180.
Exempt-From-Owner-Approval: cherry-pick from internal
Bug: 147671264
Test: m
Merged-In: I899ccb9eae1574effef77ca1bc3a0df145983861
(cherry picked from commit 931b676a69c092451ed25a5dda67accf90ce6457)
Change-Id: I899ccb9eae1574effef77ca1bc3a0df145983861
2020-01-16 09:14:23 +01:00
|
|
|
}
|
2020-07-28 06:26:48 +02:00
|
|
|
if IsRuntimeDepTag(depTag) {
|
|
|
|
// runtime dep to a stubs lib also crosses APEX boundary
|
shared_lib dependency from a static lib crosses the APEX boundary
cc_library_static {
name: "libfoo",
shared_libs: ["libbar"],
}
cc_library {
name: "libbar",
}
If libfoo is part of an APEX, then libbar is no longer considered as a
member of the APEX, because it isn't actually linked to libfoo.
To distinguish such a shared lib dependency from a static library from a
shared lib dependency from a shared library, a new dep type
SharedFromStaticDepTag is introduced. It is treated exactly the same as
SharedDepTag, except when we determine whether a dependency is crossing
the APEX boundary or not.
This allows us to check the apex_available property more correctly.
Previously, modules were incorrectly considered as being used for an
APEX due to the shared lib dependency from a static lib.
As a good side effect, this also reduces the number of APEX variants.
Specifically, on aosp_arm64, the number of the generated modules were
reduced from 44745 to 44180.
Exempt-From-Owner-Approval: cherry-pick from internal
Bug: 147671264
Test: m
Merged-In: I899ccb9eae1574effef77ca1bc3a0df145983861
(cherry picked from commit 931b676a69c092451ed25a5dda67accf90ce6457)
Change-Id: I899ccb9eae1574effef77ca1bc3a0df145983861
2020-01-16 09:14:23 +01:00
|
|
|
return false
|
|
|
|
}
|
2019-10-15 08:20:07 +02:00
|
|
|
}
|
2020-07-29 21:51:56 +02:00
|
|
|
if isLibDepTag && c.static() && libDepTag.shared() {
|
2020-07-28 06:26:48 +02:00
|
|
|
// shared_lib dependency from a static lib is considered as crossing
|
|
|
|
// the APEX boundary because the dependency doesn't actually is
|
|
|
|
// linked; the dependency is used only during the compilation phase.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
2020-09-18 23:15:30 +02:00
|
|
|
if depTag == stubImplDepTag || depTag == llndkImplDep {
|
|
|
|
// We don't track beyond LLNDK or from an implementation library to its stubs.
|
2020-05-10 08:16:24 +02:00
|
|
|
return false
|
2019-10-15 08:20:07 +02:00
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2020-07-23 07:32:17 +02:00
|
|
|
func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
|
|
|
|
sdkVersion android.ApiLevel) error {
|
2020-04-15 04:03:39 +02:00
|
|
|
// We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
|
|
|
|
if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
// b/154569636: set min_sdk_version correctly for toolchain_libraries
|
|
|
|
if c.ToolchainLibrary() {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
// We don't check for prebuilt modules
|
|
|
|
if _, ok := c.linker.(prebuiltLinkerInterface); ok {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
minSdkVersion := c.MinSdkVersion()
|
|
|
|
if minSdkVersion == "apex_inherit" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if minSdkVersion == "" {
|
|
|
|
// JNI libs within APK-in-APEX fall into here
|
|
|
|
// Those are okay to set sdk_version instead
|
|
|
|
// We don't have to check if this is a SDK variant because
|
|
|
|
// non-SDK variant resets sdk_version, which works too.
|
|
|
|
minSdkVersion = c.SdkVersion()
|
|
|
|
}
|
2020-07-23 07:32:17 +02:00
|
|
|
if minSdkVersion == "" {
|
|
|
|
return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
|
|
|
|
}
|
|
|
|
// Not using nativeApiLevelFromUser because the context here is not
|
|
|
|
// necessarily a native context.
|
|
|
|
ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
|
2020-04-15 04:03:39 +02:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-07-23 07:32:17 +02:00
|
|
|
|
|
|
|
if ver.GreaterThan(sdkVersion) {
|
2020-04-15 04:03:39 +02:00
|
|
|
return fmt.Errorf("newer SDK(%v)", ver)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-07-29 21:48:20 +02:00
|
|
|
//
|
|
|
|
// Defaults
|
|
|
|
//
|
|
|
|
type Defaults struct {
|
|
|
|
android.ModuleBase
|
2017-07-07 23:33:33 +02:00
|
|
|
android.DefaultsModuleBase
|
2018-10-02 17:38:19 +02:00
|
|
|
android.ApexModuleBase
|
2016-01-04 23:34:37 +01:00
|
|
|
}
|
|
|
|
|
2019-03-20 01:00:29 +01:00
|
|
|
// cc_defaults provides a set of properties that can be inherited by other cc
|
|
|
|
// modules. A module can use the properties from a cc_defaults using
|
|
|
|
// `defaults: ["<:default_module_name>"]`. Properties of both modules are
|
|
|
|
// merged (when possible) by prepending the default module's values to the
|
|
|
|
// depending module's values.
|
2017-06-24 00:06:31 +02:00
|
|
|
func defaultsFactory() android.Module {
|
2016-08-18 23:18:32 +02:00
|
|
|
return DefaultsFactory()
|
|
|
|
}
|
|
|
|
|
2017-06-24 00:06:31 +02:00
|
|
|
func DefaultsFactory(props ...interface{}) android.Module {
|
2016-07-29 21:48:20 +02:00
|
|
|
module := &Defaults{}
|
2015-01-31 02:27:36 +01:00
|
|
|
|
2017-06-24 00:06:31 +02:00
|
|
|
module.AddProperties(props...)
|
|
|
|
module.AddProperties(
|
2016-07-29 21:48:20 +02:00
|
|
|
&BaseProperties{},
|
2017-09-14 03:37:08 +02:00
|
|
|
&VendorProperties{},
|
2016-07-29 21:48:20 +02:00
|
|
|
&BaseCompilerProperties{},
|
|
|
|
&BaseLinkerProperties{},
|
2019-07-18 13:31:26 +02:00
|
|
|
&ObjectLinkerProperties{},
|
2016-07-30 02:28:03 +02:00
|
|
|
&LibraryProperties{},
|
2019-09-24 23:55:04 +02:00
|
|
|
&StaticProperties{},
|
|
|
|
&SharedProperties{},
|
2016-07-29 21:48:20 +02:00
|
|
|
&FlagExporterProperties{},
|
|
|
|
&BinaryLinkerProperties{},
|
2016-07-30 02:28:03 +02:00
|
|
|
&TestProperties{},
|
|
|
|
&TestBinaryProperties{},
|
2020-06-30 19:15:07 +02:00
|
|
|
&BenchmarkProperties{},
|
2019-09-14 02:32:50 +02:00
|
|
|
&FuzzProperties{},
|
2016-07-29 21:48:20 +02:00
|
|
|
&StlProperties{},
|
|
|
|
&SanitizeProperties{},
|
|
|
|
&StripProperties{},
|
2016-09-01 22:45:39 +02:00
|
|
|
&InstallerProperties{},
|
2016-09-27 00:45:04 +02:00
|
|
|
&TidyProperties{},
|
2017-02-10 01:16:31 +01:00
|
|
|
&CoverageProperties{},
|
2017-02-08 22:45:53 +01:00
|
|
|
&SAbiProperties{},
|
2017-07-26 07:22:10 +02:00
|
|
|
&VndkProperties{},
|
2017-05-10 00:44:35 +02:00
|
|
|
<OProperties{},
|
2017-09-01 08:38:27 +02:00
|
|
|
&PgoProperties{},
|
2018-03-08 22:27:59 +01:00
|
|
|
&android.ProtoProperties{},
|
2020-09-25 22:08:34 +02:00
|
|
|
// RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
|
|
|
|
&RustBindgenClangProperties{},
|
2016-08-18 23:18:32 +02:00
|
|
|
)
|
2016-04-20 23:21:14 +02:00
|
|
|
|
2019-09-25 08:18:44 +02:00
|
|
|
android.InitDefaultsModule(module)
|
2017-06-24 00:06:31 +02:00
|
|
|
|
|
|
|
return module
|
2015-01-31 02:27:36 +01:00
|
|
|
}
|
|
|
|
|
Squash vendor sources before linkageMutator runs
linkageMutator removes srcs property of the shared variant of a lib in
order to reuse *.o files compiled for the static variant also to the
shared variant.
However, this causes problem when vendor-specific srcs are specified in
target: {vendor: {srcs: ["..."]}}. For example, let's assume
cc_library {
name: "libfoo",
srcs: ["foo.c"],
target: {
vendor: {
srcs: ["bar.c"],
},
},
}
Then,
static_vendor: inputs = foo.o, bar.o
shared_vendor: inputs = foo.o (from static_vendor), bar.o (from
static_vendor), bar.o
So, bar.o is included twice and this causes multiple symbol definition
error.
In order to handle the problem, vendor mutator is applied before the
linkage mutator and the vendor-specific srcs are squashed in the vendor
mutator.
Bug: 67731122
Test: build
Test: cc_test.go
Change-Id: I2a5390295dddfc41260e9b6f02746908cdf47228
2017-10-12 16:05:00 +02:00
|
|
|
func squashVendorSrcs(m *Module) {
|
|
|
|
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
|
|
|
lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
|
|
|
|
lib.baseCompiler.Properties.Target.Vendor.Srcs...)
|
|
|
|
|
|
|
|
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
|
|
|
|
lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...)
|
2020-07-04 20:54:35 +02:00
|
|
|
|
|
|
|
lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
|
|
|
|
lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
|
Squash vendor sources before linkageMutator runs
linkageMutator removes srcs property of the shared variant of a lib in
order to reuse *.o files compiled for the static variant also to the
shared variant.
However, this causes problem when vendor-specific srcs are specified in
target: {vendor: {srcs: ["..."]}}. For example, let's assume
cc_library {
name: "libfoo",
srcs: ["foo.c"],
target: {
vendor: {
srcs: ["bar.c"],
},
},
}
Then,
static_vendor: inputs = foo.o, bar.o
shared_vendor: inputs = foo.o (from static_vendor), bar.o (from
static_vendor), bar.o
So, bar.o is included twice and this causes multiple symbol definition
error.
In order to handle the problem, vendor mutator is applied before the
linkage mutator and the vendor-specific srcs are squashed in the vendor
mutator.
Bug: 67731122
Test: build
Test: cc_test.go
Change-Id: I2a5390295dddfc41260e9b6f02746908cdf47228
2017-10-12 16:05:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-31 16:54:12 +01:00
|
|
|
func squashRecoverySrcs(m *Module) {
|
|
|
|
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
|
|
|
lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
|
|
|
|
lib.baseCompiler.Properties.Target.Recovery.Srcs...)
|
|
|
|
|
|
|
|
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
|
|
|
|
lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs...)
|
2020-07-04 20:54:35 +02:00
|
|
|
|
|
|
|
lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
|
|
|
|
lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
|
2018-01-31 16:54:12 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-27 23:01:21 +01:00
|
|
|
func squashVendorRamdiskSrcs(m *Module) {
|
|
|
|
if lib, ok := m.compiler.(*libraryDecorator); ok {
|
|
|
|
lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs, lib.baseCompiler.Properties.Target.Vendor_ramdisk.Exclude_srcs...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Don't create version variants for SDK variants
When a lib has sdk_version set, an SDK variant and a platform variant
are created by the sdkMutator. Then by the versionMutator, if the
library had 'stubs.versions' property, one or more versioned variants
and one impl variant are created for each of the two (SDK and platform)
variants. As a concrete example,
cc_library {
name: "foo",
sdk_version: "current",
stubs: { versions: ["1", "2"], },
}
would create 6 variants:
1) (sdk: "", version: "")
2) (sdk: "", version: "1")
3) (sdk: "", version: "2")
4) (sdk: "sdk", version: "")
5) (sdk: "sdk", version: "1")
6) (sdk: "sdk", version: "2")
This is somewhat uncessary because the need for the SDK mutator is to
have the platform variant (sdk:"") of a lib where sdk_version is unset,
which actually makes sens for the impl variant (version:""), but not
the versioned variants (version:"1" or version:"2").
This is not only unncessary, but also causes duplicate module
definitions in the Make side when doing an unbundled build. Specifically,
The #1 and #4 above both are emitted to Make and get the same name
"foo".
To fix the problem and not to create unnecessary variants, the versioned
variants are no longer created for the sdk variant. So, foo now has
the following variants only.
1) (sdk: "", version: "") // not emitted to Make (by versionMutator)
2) (sdk: "", version: "1") // not emitted to Make (by versionMutator)
3) (sdk: "", version: "2") // emitted to Make (by versionMutator)
4) (sdk: "sdk", version: "") // not emitted to Make (by versionMutator)
Bug: 159106705
Test: Add sdk_version:"minimum" to libnativehelper in libnativehelper/Android.bp.
m SOONG_ALLOW_MISSING_DEPENDENCIES=true TARGET_BUILD_UNBUNDLED=true libnativehelper
Change-Id: I6f02f4189e5504286174ccff1642166da82d00c9
2020-06-16 14:58:53 +02:00
|
|
|
func (c *Module) IsSdkVariant() bool {
|
2020-07-15 22:33:30 +02:00
|
|
|
return c.Properties.IsSdkVariant || c.AlwaysSdk()
|
Don't create version variants for SDK variants
When a lib has sdk_version set, an SDK variant and a platform variant
are created by the sdkMutator. Then by the versionMutator, if the
library had 'stubs.versions' property, one or more versioned variants
and one impl variant are created for each of the two (SDK and platform)
variants. As a concrete example,
cc_library {
name: "foo",
sdk_version: "current",
stubs: { versions: ["1", "2"], },
}
would create 6 variants:
1) (sdk: "", version: "")
2) (sdk: "", version: "1")
3) (sdk: "", version: "2")
4) (sdk: "sdk", version: "")
5) (sdk: "sdk", version: "1")
6) (sdk: "sdk", version: "2")
This is somewhat uncessary because the need for the SDK mutator is to
have the platform variant (sdk:"") of a lib where sdk_version is unset,
which actually makes sens for the impl variant (version:""), but not
the versioned variants (version:"1" or version:"2").
This is not only unncessary, but also causes duplicate module
definitions in the Make side when doing an unbundled build. Specifically,
The #1 and #4 above both are emitted to Make and get the same name
"foo".
To fix the problem and not to create unnecessary variants, the versioned
variants are no longer created for the sdk variant. So, foo now has
the following variants only.
1) (sdk: "", version: "") // not emitted to Make (by versionMutator)
2) (sdk: "", version: "1") // not emitted to Make (by versionMutator)
3) (sdk: "", version: "2") // emitted to Make (by versionMutator)
4) (sdk: "sdk", version: "") // not emitted to Make (by versionMutator)
Bug: 159106705
Test: Add sdk_version:"minimum" to libnativehelper in libnativehelper/Android.bp.
m SOONG_ALLOW_MISSING_DEPENDENCIES=true TARGET_BUILD_UNBUNDLED=true libnativehelper
Change-Id: I6f02f4189e5504286174ccff1642166da82d00c9
2020-06-16 14:58:53 +02:00
|
|
|
}
|
|
|
|
|
2018-11-06 01:49:08 +01:00
|
|
|
func kytheExtractAllFactory() android.Singleton {
|
|
|
|
return &kytheExtractAllSingleton{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type kytheExtractAllSingleton struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|
|
|
var xrefTargets android.Paths
|
|
|
|
ctx.VisitAllModules(func(module android.Module) {
|
|
|
|
if ccModule, ok := module.(xref); ok {
|
|
|
|
xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
// TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
|
|
|
|
if len(xrefTargets) > 0 {
|
2020-06-04 22:25:17 +02:00
|
|
|
ctx.Phony("xref_cxx", xrefTargets...)
|
2018-11-06 01:49:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-29 01:23:31 +01:00
|
|
|
var Bool = proptools.Bool
|
2018-04-11 01:14:46 +02:00
|
|
|
var BoolDefault = proptools.BoolDefault
|
2017-11-07 19:57:05 +01:00
|
|
|
var BoolPtr = proptools.BoolPtr
|
|
|
|
var String = proptools.String
|
|
|
|
var StringPtr = proptools.StringPtr
|