2015-03-19 04:28:46 +08:00
|
|
|
// Copyright 2015 Google Inc. All rights reserved.
|
2015-01-31 09:27:36 +08: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 (
|
2016-08-04 05:12:14 +08:00
|
|
|
"strconv"
|
2015-01-31 09:27:36 +08:00
|
|
|
"strings"
|
|
|
|
|
2015-03-24 08:50:24 +08:00
|
|
|
"github.com/google/blueprint"
|
2015-10-29 08:23:31 +08:00
|
|
|
"github.com/google/blueprint/proptools"
|
2015-03-24 08:50:24 +08:00
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
"android/soong/android"
|
2016-07-30 04:44:28 +08:00
|
|
|
"android/soong/cc/config"
|
2015-03-19 04:28:46 +08:00
|
|
|
"android/soong/genrule"
|
2015-01-31 09:27:36 +08:00
|
|
|
)
|
|
|
|
|
2015-06-18 05:20:06 +08:00
|
|
|
func init() {
|
2016-10-13 05:28:16 +08:00
|
|
|
android.RegisterModuleType("cc_defaults", defaultsFactory)
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
2018-12-19 16:12:36 +08:00
|
|
|
ctx.BottomUp("image", ImageMutator).Parallel()
|
2018-10-03 13:25:58 +08:00
|
|
|
ctx.BottomUp("link", LinkageMutator).Parallel()
|
2018-12-19 16:12:36 +08:00
|
|
|
ctx.BottomUp("vndk", VndkMutator).Parallel()
|
2016-10-13 05:38:15 +08:00
|
|
|
ctx.BottomUp("ndk_api", ndkApiMutator).Parallel()
|
|
|
|
ctx.BottomUp("test_per_src", testPerSrcMutator).Parallel()
|
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 17:02:45 +08:00
|
|
|
ctx.BottomUp("version", VersionMutator).Parallel()
|
2018-10-03 13:25:58 +08:00
|
|
|
ctx.BottomUp("begin", BeginMutator).Parallel()
|
2019-02-08 20:00:45 +08:00
|
|
|
ctx.BottomUp("sysprop", SyspropMutator).Parallel()
|
2016-10-13 05:38:15 +08:00
|
|
|
})
|
2016-01-07 06:41:07 +08:00
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
|
|
|
ctx.TopDown("asan_deps", sanitizerDepsMutator(asan))
|
|
|
|
ctx.BottomUp("asan", sanitizerMutator(asan)).Parallel()
|
2016-01-07 06:41:07 +08:00
|
|
|
|
2018-08-03 07:19:13 +08:00
|
|
|
ctx.TopDown("hwasan_deps", sanitizerDepsMutator(hwasan))
|
|
|
|
ctx.BottomUp("hwasan", sanitizerMutator(hwasan)).Parallel()
|
|
|
|
|
2017-11-01 17:20:21 +08:00
|
|
|
ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi))
|
|
|
|
ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel()
|
|
|
|
|
2018-11-20 08:03:58 +08:00
|
|
|
ctx.TopDown("scs_deps", sanitizerDepsMutator(scs))
|
|
|
|
ctx.BottomUp("scs", sanitizerMutator(scs)).Parallel()
|
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
|
|
|
|
ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
|
2017-02-10 08:16:31 +08:00
|
|
|
|
2018-06-22 04:03:07 +08:00
|
|
|
ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
|
2018-12-19 01:47:14 +08:00
|
|
|
ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
|
2018-02-22 07:49:20 +08:00
|
|
|
|
2018-12-11 07:12:40 +08:00
|
|
|
ctx.BottomUp("coverage", coverageMutator).Parallel()
|
2017-02-09 05:45:53 +08:00
|
|
|
ctx.TopDown("vndk_deps", sabiDepsMutator)
|
2017-05-10 06:44:35 +08:00
|
|
|
|
|
|
|
ctx.TopDown("lto_deps", ltoDepsMutator)
|
|
|
|
ctx.BottomUp("lto", ltoMutator).Parallel()
|
2019-01-18 14:20:43 +08:00
|
|
|
|
|
|
|
ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
|
2016-10-13 05:38:15 +08:00
|
|
|
})
|
2016-07-30 04:44:28 +08:00
|
|
|
|
|
|
|
pctx.Import("android/soong/cc/config")
|
2015-06-18 05:20:06 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type Deps struct {
|
|
|
|
SharedLibs, LateSharedLibs []string
|
|
|
|
StaticLibs, LateStaticLibs, WholeStaticLibs []string
|
2016-12-14 04:50:57 +08:00
|
|
|
HeaderLibs []string
|
2017-12-20 01:17:32 +08:00
|
|
|
RuntimeLibs []string
|
2015-09-24 06:26:20 +08:00
|
|
|
|
2016-12-14 04:50:57 +08:00
|
|
|
ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
|
2016-06-07 09:22:19 +08:00
|
|
|
|
2016-04-12 05:37:39 +08:00
|
|
|
ObjFiles []string
|
2015-03-18 06:06:21 +08:00
|
|
|
|
2016-04-21 05:21:14 +08:00
|
|
|
GeneratedSources []string
|
|
|
|
GeneratedHeaders []string
|
|
|
|
|
2016-09-29 08:34:58 +08:00
|
|
|
ReexportGeneratedHeaders []string
|
|
|
|
|
2015-03-24 08:50:24 +08:00
|
|
|
CrtBegin, CrtEnd string
|
2018-10-12 15:24:23 +08:00
|
|
|
|
|
|
|
// Used for host bionic
|
|
|
|
LinkerFlagsFile string
|
|
|
|
DynamicLinker string
|
2015-03-18 06:06:21 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type PathDeps struct {
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to .so files
|
2019-01-18 13:37:08 +08:00
|
|
|
SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to the dependencies to use for .so files (.so.toc files)
|
2019-01-18 13:37:08 +08:00
|
|
|
SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to .a files
|
2016-05-19 06:37:25 +08:00
|
|
|
StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
|
2015-09-24 06:26:20 +08:00
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to .o files
|
2016-09-27 08:33:01 +08:00
|
|
|
Objs Objects
|
2017-02-10 08:16:31 +08:00
|
|
|
StaticLibObjs Objects
|
2016-09-27 08:33:01 +08:00
|
|
|
WholeStaticLibObjs Objects
|
2015-09-24 06:26:20 +08:00
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to generated source files
|
2016-05-19 06:37:25 +08:00
|
|
|
GeneratedSources android.Paths
|
|
|
|
GeneratedHeaders android.Paths
|
2016-04-21 05:21:14 +08:00
|
|
|
|
2016-07-09 15:14:08 +08:00
|
|
|
Flags, ReexportedFlags []string
|
2016-09-30 03:13:36 +08:00
|
|
|
ReexportedFlagsDeps android.Paths
|
2015-09-24 06:26:20 +08:00
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
// Paths to crt*.o files
|
2016-05-19 06:37:25 +08:00
|
|
|
CrtBegin, CrtEnd android.OptionalPath
|
2018-10-12 15:24:23 +08: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 06:26:20 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type Flags struct {
|
2017-06-16 05:45:18 +08:00
|
|
|
GlobalFlags []string // Flags that apply to C, C++, and assembly source files
|
|
|
|
ArFlags []string // Flags that apply to ar
|
|
|
|
AsFlags []string // Flags that apply to assembly source files
|
|
|
|
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
|
|
|
|
YaccFlags []string // Flags that apply to Yacc source files
|
|
|
|
aidlFlags []string // Flags that apply to aidl source files
|
|
|
|
rsFlags []string // Flags that apply to renderscript source files
|
|
|
|
LdFlags []string // Flags that apply to linker command lines
|
|
|
|
libFlags []string // Flags to add libraries early to the link order
|
|
|
|
TidyFlags []string // Flags that apply to clang-tidy
|
|
|
|
SAbiFlags []string // Flags that apply to header-abi-dumper
|
|
|
|
YasmFlags []string // Flags that apply to yasm assembly source files
|
2015-04-23 04:07:53 +08:00
|
|
|
|
2017-03-31 06:03:04 +08:00
|
|
|
// Global include flags that apply to C, C++, and assembly source files
|
|
|
|
// These must be after any module include flags, which will be in GlobalFlags.
|
|
|
|
SystemIncludeFlags []string
|
|
|
|
|
2016-07-30 04:44:28 +08:00
|
|
|
Toolchain config.Toolchain
|
2016-09-27 06:45:04 +08:00
|
|
|
Tidy bool
|
2017-02-10 08:16:31 +08:00
|
|
|
Coverage bool
|
2017-02-09 05:45:53 +08:00
|
|
|
SAbiDump bool
|
2016-01-05 06:34:37 +08:00
|
|
|
|
|
|
|
RequiredInstructionSet string
|
2016-01-07 06:41:07 +08:00
|
|
|
DynamicLinker string
|
|
|
|
|
2017-09-01 14:38:27 +08:00
|
|
|
CFlagsDeps android.Paths // Files depended on by compiler flags
|
|
|
|
LdFlagsDeps android.Paths // Files depended on by linker flags
|
2016-12-02 06:45:23 +08:00
|
|
|
|
|
|
|
GroupStaticLibs bool
|
2018-11-17 13:05:32 +08:00
|
|
|
|
|
|
|
protoDeps android.Paths
|
|
|
|
protoFlags []string // Flags that apply to proto source files
|
|
|
|
protoOutTypeFlag string // The output type, --cpp_out for example
|
|
|
|
protoOutParams []string // Flags that modify the output of proto generated files
|
|
|
|
protoC bool // Whether to use C instead of C++
|
|
|
|
protoOptionsFile bool // Whether to look for a .options file next to the .proto
|
|
|
|
ProtoRoot bool
|
2015-03-18 06:06:21 +08:00
|
|
|
}
|
|
|
|
|
2016-04-12 05:37:39 +08:00
|
|
|
type ObjectLinkerProperties struct {
|
|
|
|
// names of other cc_object modules to link into this module using partial linking
|
|
|
|
Objs []string `android:"arch_variant"`
|
2017-09-19 13:47:20 +08:00
|
|
|
|
|
|
|
// if set, add an extra objcopy --prefix-symbols= step
|
2017-11-08 02:57:05 +08:00
|
|
|
Prefix_symbols *string
|
2016-04-12 05:37:39 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
// Properties used to compile all C or C++ modules
|
|
|
|
type BaseProperties struct {
|
2018-07-24 08:19:36 +08:00
|
|
|
// Deprecated. true is the default, false is invalid.
|
2016-01-05 06:34:37 +08:00
|
|
|
Clang *bool `android:"arch_variant"`
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2015-05-12 04:39:40 +08:00
|
|
|
// Minimum sdk version supported when compiling against the ndk
|
2017-11-08 02:57:05 +08:00
|
|
|
Sdk_version *string
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2018-12-07 22:08:36 +08:00
|
|
|
AndroidMkSharedLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkStaticLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkRuntimeLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
|
|
|
|
HideFromMake bool `blueprint:"mutated"`
|
|
|
|
PreventInstall bool `blueprint:"mutated"`
|
|
|
|
ApexesProvidingSharedLibs []string `blueprint:"mutated"`
|
2017-09-14 09:37:08 +08:00
|
|
|
|
|
|
|
UseVndk bool `blueprint:"mutated"`
|
2017-12-08 07:28:59 +08:00
|
|
|
|
|
|
|
// *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
|
|
|
|
// file
|
|
|
|
Logtags []string
|
2018-01-31 23:54:12 +08:00
|
|
|
|
|
|
|
// Make this module available when building for recovery
|
|
|
|
Recovery_available *bool
|
|
|
|
|
|
|
|
InRecovery bool `blueprint:"mutated"`
|
2018-12-20 21:10:17 +08:00
|
|
|
|
|
|
|
// Allows this module to use non-APEX version of libraries. Useful
|
|
|
|
// for building binaries that are started before APEXes are activated.
|
|
|
|
Bootstrap *bool
|
2017-09-14 09:37:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type VendorProperties struct {
|
2017-08-16 13:05:54 +08:00
|
|
|
// whether this module should be allowed to be directly depended by other
|
|
|
|
// modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
|
|
|
|
// If set to true, two variants will be built separately, one like
|
|
|
|
// normal, and the other limited to the set of libraries and headers
|
|
|
|
// that are exposed to /vendor 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-07 03:43:22 +08:00
|
|
|
//
|
|
|
|
// The vendor variant may be used with a different (newer) /system,
|
|
|
|
// so it shouldn't have any unversioned runtime dependencies, or
|
|
|
|
// make assumptions about the system that may not be true in the
|
|
|
|
// future.
|
|
|
|
//
|
2017-08-16 13:05:54 +08:00
|
|
|
// If set to false, this module becomes inaccessible from /vendor modules.
|
|
|
|
//
|
|
|
|
// 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-07 03:43:22 +08:00
|
|
|
// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
|
|
|
|
Vendor_available *bool
|
2018-04-09 11:03:06 +08: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-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContextIntf interface {
|
|
|
|
static() bool
|
|
|
|
staticBinary() bool
|
2016-07-30 04:44:28 +08:00
|
|
|
toolchain() config.Toolchain
|
2017-09-28 08:01:44 +08:00
|
|
|
useSdk() bool
|
2016-01-05 06:34:37 +08:00
|
|
|
sdkVersion() string
|
2017-09-28 08:01:44 +08:00
|
|
|
useVndk() bool
|
2019-01-16 20:19:51 +08:00
|
|
|
isNdk() bool
|
|
|
|
isLlndk() bool
|
|
|
|
isLlndkPublic() bool
|
|
|
|
isVndkPrivate() bool
|
2017-06-23 18:24:43 +08: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 18:04:35 +08:00
|
|
|
isVndkExt() bool
|
2018-01-31 23:54:12 +08:00
|
|
|
inRecovery() bool
|
2018-07-10 15:01:19 +08:00
|
|
|
shouldCreateVndkSourceAbiDump() bool
|
2016-03-31 12:00:30 +08:00
|
|
|
selectedStl() string
|
2016-10-07 07:12:58 +08: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 18:04:35 +08:00
|
|
|
getVndkExtendsModuleName() string
|
2018-02-14 18:16:12 +08:00
|
|
|
isPgoCompile() bool
|
2018-12-11 07:12:40 +08:00
|
|
|
isNDKStubLibrary() bool
|
2018-11-28 06:33:03 +08:00
|
|
|
useClangLld(actx ModuleContext) bool
|
2019-01-19 18:24:06 +08:00
|
|
|
apexName() string
|
2018-12-20 21:10:17 +08:00
|
|
|
hasStubsVariants() bool
|
|
|
|
isStubs() bool
|
2019-01-16 21:53:13 +08:00
|
|
|
bootstrap() bool
|
2018-11-13 12:19:56 +08:00
|
|
|
mustUseVendorVariant() bool
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContext interface {
|
2016-05-19 06:37:25 +08:00
|
|
|
android.ModuleContext
|
2016-01-05 06:34:37 +08:00
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
|
|
|
type BaseModuleContext interface {
|
2016-05-19 06:37:25 +08:00
|
|
|
android.BaseContext
|
2016-01-05 06:34:37 +08:00
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
2016-12-14 09:06:13 +08:00
|
|
|
type DepsContext interface {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type feature interface {
|
|
|
|
begin(ctx BaseModuleContext)
|
2016-12-14 09:06:13 +08:00
|
|
|
deps(ctx DepsContext, deps Deps) Deps
|
2016-01-05 06:34:37 +08:00
|
|
|
flags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
props() []interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type compiler interface {
|
2016-08-02 04:20:05 +08:00
|
|
|
compilerInit(ctx BaseModuleContext)
|
2016-12-14 09:06:13 +08:00
|
|
|
compilerDeps(ctx DepsContext, deps Deps) Deps
|
2017-11-17 06:33:08 +08:00
|
|
|
compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
|
2016-08-02 04:20:05 +08:00
|
|
|
compilerProps() []interface{}
|
|
|
|
|
2016-07-28 01:31:13 +08:00
|
|
|
appendCflags([]string)
|
|
|
|
appendAsflags([]string)
|
2016-09-27 08:33:01 +08:00
|
|
|
compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type linker interface {
|
2016-08-02 04:20:05 +08:00
|
|
|
linkerInit(ctx BaseModuleContext)
|
2016-12-14 09:06:13 +08:00
|
|
|
linkerDeps(ctx DepsContext, deps Deps) Deps
|
2016-08-02 04:20:05 +08:00
|
|
|
linkerFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
linkerProps() []interface{}
|
2018-11-28 06:33:03 +08:00
|
|
|
useClangLld(actx ModuleContext) bool
|
2016-08-02 04:20:05 +08:00
|
|
|
|
2016-09-27 08:33:01 +08:00
|
|
|
link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
|
2016-07-28 01:31:13 +08:00
|
|
|
appendLdflags([]string)
|
2019-01-31 11:21:23 +08:00
|
|
|
unstrippedOutputFilePath() android.Path
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type installer interface {
|
2016-08-02 04:20:05 +08:00
|
|
|
installerProps() []interface{}
|
2016-05-19 06:37:25 +08:00
|
|
|
install(ctx ModuleContext, path android.Path)
|
2016-01-05 06:34:37 +08:00
|
|
|
inData() bool
|
2017-03-30 13:00:18 +08:00
|
|
|
inSanitizerDir() bool
|
2016-09-29 07:18:03 +08:00
|
|
|
hostToolPath() android.OptionalPath
|
2019-02-01 11:03:59 +08:00
|
|
|
relativeInstallPath() string
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
type dependencyTag struct {
|
|
|
|
blueprint.BaseDependencyTag
|
|
|
|
name string
|
|
|
|
library bool
|
2016-06-07 09:22:19 +08:00
|
|
|
|
|
|
|
reexportFlags bool
|
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 17:02:45 +08:00
|
|
|
|
|
|
|
explicitlyVersioned bool
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
2016-09-29 08:34:58 +08:00
|
|
|
sharedDepTag = dependencyTag{name: "shared", library: true}
|
|
|
|
sharedExportDepTag = dependencyTag{name: "shared", library: true, reexportFlags: true}
|
2019-01-18 13:37:08 +08:00
|
|
|
earlySharedDepTag = dependencyTag{name: "early_shared", library: true}
|
2016-09-29 08:34:58 +08:00
|
|
|
lateSharedDepTag = dependencyTag{name: "late shared", library: true}
|
|
|
|
staticDepTag = dependencyTag{name: "static", library: true}
|
|
|
|
staticExportDepTag = dependencyTag{name: "static", library: true, reexportFlags: true}
|
|
|
|
lateStaticDepTag = dependencyTag{name: "late static", library: true}
|
|
|
|
wholeStaticDepTag = dependencyTag{name: "whole static", library: true, reexportFlags: true}
|
2016-12-15 23:39:51 +08:00
|
|
|
headerDepTag = dependencyTag{name: "header", library: true}
|
|
|
|
headerExportDepTag = dependencyTag{name: "header", library: true, reexportFlags: true}
|
2016-09-29 08:34:58 +08:00
|
|
|
genSourceDepTag = dependencyTag{name: "gen source"}
|
|
|
|
genHeaderDepTag = dependencyTag{name: "gen header"}
|
|
|
|
genHeaderExportDepTag = dependencyTag{name: "gen header", reexportFlags: true}
|
|
|
|
objDepTag = dependencyTag{name: "obj"}
|
|
|
|
crtBeginDepTag = dependencyTag{name: "crtbegin"}
|
|
|
|
crtEndDepTag = dependencyTag{name: "crtend"}
|
2018-10-12 15:24:23 +08:00
|
|
|
linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
|
|
|
|
dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"}
|
2016-09-29 08:34:58 +08:00
|
|
|
reuseObjTag = dependencyTag{name: "reuse objects"}
|
2019-01-31 23:31:10 +08:00
|
|
|
staticVariantTag = dependencyTag{name: "static variant"}
|
2016-09-29 08:34:58 +08:00
|
|
|
ndkStubDepTag = dependencyTag{name: "ndk stub", library: true}
|
|
|
|
ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true}
|
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 18:04:35 +08:00
|
|
|
vndkExtDepTag = dependencyTag{name: "vndk extends", library: true}
|
2017-12-20 01:17:32 +08:00
|
|
|
runtimeDepTag = dependencyTag{name: "runtime lib"}
|
2016-04-12 06:06:20 +08:00
|
|
|
)
|
|
|
|
|
2016-01-05 06:34:37 +08: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 06:37:25 +08:00
|
|
|
android.ModuleBase
|
2017-07-08 05:33:33 +08:00
|
|
|
android.DefaultableModuleBase
|
2018-10-02 23:38:19 +08:00
|
|
|
android.ApexModuleBase
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2017-09-14 09:37:08 +08:00
|
|
|
Properties BaseProperties
|
|
|
|
VendorProperties VendorProperties
|
2016-01-05 06:34:37 +08:00
|
|
|
|
|
|
|
// initialize before calling Init
|
2016-05-19 06:37:25 +08:00
|
|
|
hod android.HostOrDeviceSupported
|
|
|
|
multilib android.Multilib
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
// delegates, initialize before calling Init
|
2016-09-14 04:41:39 +08:00
|
|
|
features []feature
|
|
|
|
compiler compiler
|
|
|
|
linker linker
|
|
|
|
installer installer
|
|
|
|
stl *stl
|
|
|
|
sanitize *sanitize
|
2017-02-10 08:16:31 +08:00
|
|
|
coverage *coverage
|
2017-02-09 05:45:53 +08:00
|
|
|
sabi *sabi
|
2017-06-23 18:24:43 +08:00
|
|
|
vndkdep *vndkdep
|
2017-05-10 06:44:35 +08:00
|
|
|
lto *lto
|
2017-09-01 14:38:27 +08:00
|
|
|
pgo *pgo
|
2018-11-22 00:59:37 +08:00
|
|
|
xom *xom
|
2016-01-07 06:41:07 +08:00
|
|
|
|
|
|
|
androidMkSharedLibDeps []string
|
2015-03-18 06:06:21 +08:00
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
outputFile android.OptionalPath
|
2015-04-29 04:30:13 +08:00
|
|
|
|
2016-07-30 04:44:28 +08:00
|
|
|
cachedToolchain config.Toolchain
|
2016-07-30 08:28:03 +08:00
|
|
|
|
|
|
|
subAndroidMkOnce map[subAndroidMkProvider]bool
|
2017-01-11 08:21:22 +08:00
|
|
|
|
|
|
|
// Flags used to compile this module
|
|
|
|
flags Flags
|
2017-09-28 08:05:30 +08:00
|
|
|
|
|
|
|
// When calling a linker, if module A depends on module B, then A must precede B in its command
|
2017-11-28 07:48:57 +08:00
|
|
|
// line invocation. depsInLinkOrder stores the proper ordering of all of the transitive
|
2017-09-28 08:05:30 +08:00
|
|
|
// deps of this module
|
2017-11-28 07:48:57 +08:00
|
|
|
depsInLinkOrder android.Paths
|
|
|
|
|
|
|
|
// only non-nil when this is a shared library that reuses the objects of a static library
|
|
|
|
staticVariant *Module
|
2015-03-18 06:06:21 +08:00
|
|
|
}
|
|
|
|
|
2018-09-05 21:36:17 +08:00
|
|
|
func (c *Module) OutputFile() android.OptionalPath {
|
|
|
|
return c.outputFile
|
|
|
|
}
|
|
|
|
|
2019-01-12 23:39:51 +08:00
|
|
|
func (c *Module) UnstrippedOutputFile() android.Path {
|
2019-01-31 11:21:23 +08:00
|
|
|
if c.linker != nil {
|
|
|
|
return c.linker.unstrippedOutputFilePath()
|
2019-01-12 23:39:51 +08:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-02-01 11:03:59 +08:00
|
|
|
func (c *Module) RelativeInstallPath() string {
|
|
|
|
if c.installer != nil {
|
|
|
|
return c.installer.relativeInstallPath()
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2017-06-24 06:06:31 +08:00
|
|
|
func (c *Module) Init() android.Module {
|
2018-05-10 04:45:03 +08:00
|
|
|
c.AddProperties(&c.Properties, &c.VendorProperties)
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.compiler != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.compiler.compilerProps()...)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.linker.linkerProps()...)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
if c.installer != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.installer.installerProps()...)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-04-05 06:07:06 +08:00
|
|
|
if c.stl != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.stl.props()...)
|
2016-04-05 06:07:06 +08:00
|
|
|
}
|
2016-01-07 06:41:07 +08:00
|
|
|
if c.sanitize != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.sanitize.props()...)
|
2016-01-07 06:41:07 +08:00
|
|
|
}
|
2017-02-10 08:16:31 +08:00
|
|
|
if c.coverage != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.coverage.props()...)
|
2017-02-10 08:16:31 +08:00
|
|
|
}
|
2017-02-09 05:45:53 +08:00
|
|
|
if c.sabi != nil {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(c.sabi.props()...)
|
2017-02-09 05:45:53 +08:00
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
c.AddProperties(c.vndkdep.props()...)
|
|
|
|
}
|
2017-05-10 06:44:35 +08:00
|
|
|
if c.lto != nil {
|
|
|
|
c.AddProperties(c.lto.props()...)
|
|
|
|
}
|
2017-09-01 14:38:27 +08:00
|
|
|
if c.pgo != nil {
|
|
|
|
c.AddProperties(c.pgo.props()...)
|
|
|
|
}
|
2018-11-22 00:59:37 +08:00
|
|
|
if c.xom != nil {
|
|
|
|
c.AddProperties(c.xom.props()...)
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
for _, feature := range c.features {
|
2017-06-24 06:06:31 +08:00
|
|
|
c.AddProperties(feature.props()...)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-03-18 06:06:21 +08:00
|
|
|
|
2018-10-03 04:59:46 +08:00
|
|
|
c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, class android.OsClass) bool {
|
|
|
|
switch class {
|
|
|
|
case android.Device:
|
|
|
|
return ctx.Config().DevicePrefer32BitExecutables()
|
|
|
|
case android.HostCross:
|
|
|
|
// Windows builds always prefer 32-bit
|
|
|
|
return true
|
|
|
|
default:
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
})
|
2017-06-24 06:06:31 +08:00
|
|
|
android.InitAndroidArchModule(c, c.hod, c.multilib)
|
2015-03-18 06:06:21 +08:00
|
|
|
|
2017-07-08 05:33:33 +08:00
|
|
|
android.InitDefaultableModule(c)
|
2017-06-24 06:06:31 +08:00
|
|
|
|
2018-10-02 23:38:19 +08:00
|
|
|
android.InitApexModule(c)
|
|
|
|
|
2017-06-24 06:06:31 +08:00
|
|
|
return c
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-03-18 06:06:21 +08:00
|
|
|
|
2016-07-30 08:28:03 +08: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
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
func (c *Module) useVndk() bool {
|
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-07 03:43:22 +08:00
|
|
|
return c.Properties.UseVndk
|
|
|
|
}
|
|
|
|
|
2018-12-11 07:12:40 +08:00
|
|
|
func (c *Module) isCoverageVariant() bool {
|
|
|
|
return c.coverage.Properties.IsCoverageVariant
|
|
|
|
}
|
|
|
|
|
2019-01-16 20:19:51 +08:00
|
|
|
func (c *Module) isNdk() bool {
|
|
|
|
return inList(c.Name(), ndkMigratedLibs)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) isLlndk() bool {
|
|
|
|
// Returns true for both LLNDK (public) and LLNDK-private libs.
|
|
|
|
return inList(c.Name(), llndkLibraries)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) isLlndkPublic() bool {
|
|
|
|
// Returns true only for LLNDK (public) libs.
|
|
|
|
return c.isLlndk() && !c.isVndkPrivate()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) isVndkPrivate() bool {
|
|
|
|
// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
|
|
|
|
return inList(c.Name(), vndkPrivateLibraries)
|
|
|
|
}
|
|
|
|
|
2017-06-23 18:24:43 +08: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 18:04:35 +08:00
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.isVndk()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-02-14 18:16:12 +08:00
|
|
|
func (c *Module) isPgoCompile() bool {
|
|
|
|
if pgo := c.pgo; pgo != nil {
|
|
|
|
return pgo.Properties.PgoCompile
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-12-11 07:12:40 +08: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 18:04:35 +08: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 18:24:43 +08:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-11-13 12:19:56 +08:00
|
|
|
func (c *Module) mustUseVendorVariant() bool {
|
|
|
|
return c.isVndkSp() || inList(c.Name(), config.VndkMustUseVendorVariantList)
|
|
|
|
}
|
|
|
|
|
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 18:04:35 +08:00
|
|
|
func (c *Module) getVndkExtendsModuleName() string {
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
return vndkdep.getVndkExtendsModuleName()
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2017-08-16 13:05:54 +08:00
|
|
|
// Returns true only when this module is configured to have core and vendor
|
|
|
|
// variants.
|
|
|
|
func (c *Module) hasVendorVariant() bool {
|
|
|
|
return c.isVndk() || Bool(c.VendorProperties.Vendor_available)
|
|
|
|
}
|
|
|
|
|
2018-01-31 23:54:12 +08:00
|
|
|
func (c *Module) inRecovery() bool {
|
|
|
|
return c.Properties.InRecovery || c.ModuleBase.InstallInRecovery()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) onlyInRecovery() bool {
|
|
|
|
return c.ModuleBase.InstallInRecovery()
|
|
|
|
}
|
|
|
|
|
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 17:02:45 +08:00
|
|
|
func (c *Module) IsStubs() bool {
|
|
|
|
if library, ok := c.linker.(*libraryDecorator); ok {
|
|
|
|
return library.buildStubs()
|
2018-12-19 01:47:14 +08:00
|
|
|
} else if _, ok := c.linker.(*llndkStubDecorator); ok {
|
|
|
|
return true
|
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 17:02:45 +08:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) HasStubsVariants() bool {
|
|
|
|
if library, ok := c.linker.(*libraryDecorator); ok {
|
|
|
|
return len(library.Properties.Stubs.Versions) > 0
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-01-16 21:53:13 +08:00
|
|
|
func (c *Module) bootstrap() bool {
|
|
|
|
return Bool(c.Properties.Bootstrap)
|
|
|
|
}
|
|
|
|
|
2019-02-25 10:05:47 +08:00
|
|
|
func isBionic(name string) bool {
|
|
|
|
switch name {
|
|
|
|
case "libc", "libm", "libdl", "linker":
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type baseModuleContext struct {
|
2016-05-19 06:37:25 +08:00
|
|
|
android.BaseContext
|
2016-01-05 06:34:37 +08:00
|
|
|
moduleContextImpl
|
|
|
|
}
|
2015-11-03 08:43:11 +08:00
|
|
|
|
2016-12-14 09:06:13 +08:00
|
|
|
type depsContext struct {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
moduleContextImpl
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type moduleContext struct {
|
2016-05-19 06:37:25 +08:00
|
|
|
android.ModuleContext
|
2016-01-05 06:34:37 +08:00
|
|
|
moduleContextImpl
|
2015-03-18 06:06:21 +08:00
|
|
|
}
|
|
|
|
|
2017-11-08 15:03:48 +08:00
|
|
|
func (ctx *moduleContext) SocSpecific() bool {
|
|
|
|
return ctx.ModuleContext.SocSpecific() ||
|
|
|
|
(ctx.mod.hasVendorVariant() && ctx.mod.useVndk() && !ctx.mod.isVndk())
|
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-07 03:43:22 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type moduleContextImpl struct {
|
|
|
|
mod *Module
|
|
|
|
ctx BaseModuleContext
|
|
|
|
}
|
|
|
|
|
2016-07-30 04:44:28 +08:00
|
|
|
func (ctx *moduleContextImpl) toolchain() config.Toolchain {
|
2016-01-05 06:34:37 +08:00
|
|
|
return ctx.mod.toolchain(ctx.ctx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) static() bool {
|
2017-11-01 17:20:21 +08:00
|
|
|
return ctx.mod.static()
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
func (ctx *moduleContextImpl) staticBinary() bool {
|
2018-12-19 01:47:14 +08:00
|
|
|
return ctx.mod.staticBinary()
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
func (ctx *moduleContextImpl) useSdk() bool {
|
2019-01-18 06:44:05 +08:00
|
|
|
if ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRecovery() && !ctx.ctx.Fuchsia() {
|
2017-11-08 02:57:05 +08:00
|
|
|
return String(ctx.mod.Properties.Sdk_version) != ""
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
|
|
|
return false
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) sdkVersion() string {
|
2016-06-08 03:34:45 +08:00
|
|
|
if ctx.ctx.Device() {
|
2017-09-28 08:01:44 +08:00
|
|
|
if ctx.useVndk() {
|
2018-03-23 16:43:47 +08:00
|
|
|
vndk_ver := ctx.ctx.DeviceConfig().VndkVersion()
|
2018-03-27 12:25:27 +08:00
|
|
|
if vndk_ver == "current" {
|
2018-03-23 16:43:47 +08:00
|
|
|
platform_vndk_ver := ctx.ctx.DeviceConfig().PlatformVndkVersion()
|
|
|
|
if inList(platform_vndk_ver, ctx.ctx.Config().PlatformVersionCombinedCodenames()) {
|
|
|
|
return "current"
|
|
|
|
}
|
|
|
|
return platform_vndk_ver
|
|
|
|
}
|
|
|
|
return vndk_ver
|
2016-11-19 06:54:24 +08:00
|
|
|
}
|
2018-03-23 16:43:47 +08:00
|
|
|
return String(ctx.mod.Properties.Sdk_version)
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
|
|
|
return ""
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
func (ctx *moduleContextImpl) useVndk() bool {
|
|
|
|
return ctx.mod.useVndk()
|
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
|
2019-01-16 20:19:51 +08:00
|
|
|
func (ctx *moduleContextImpl) isNdk() bool {
|
|
|
|
return ctx.mod.isNdk()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isLlndk() bool {
|
|
|
|
return ctx.mod.isLlndk()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isLlndkPublic() bool {
|
|
|
|
return ctx.mod.isLlndkPublic()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isVndkPrivate() bool {
|
|
|
|
return ctx.mod.isVndkPrivate()
|
|
|
|
}
|
|
|
|
|
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 18:04:35 +08:00
|
|
|
func (ctx *moduleContextImpl) isVndk() bool {
|
|
|
|
return ctx.mod.isVndk()
|
|
|
|
}
|
|
|
|
|
2018-02-14 18:16:12 +08:00
|
|
|
func (ctx *moduleContextImpl) isPgoCompile() bool {
|
|
|
|
return ctx.mod.isPgoCompile()
|
|
|
|
}
|
|
|
|
|
2018-12-11 07:12:40 +08:00
|
|
|
func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
|
|
|
|
return ctx.mod.isNDKStubLibrary()
|
|
|
|
}
|
|
|
|
|
2017-06-23 18:24:43 +08: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 18:04:35 +08:00
|
|
|
return ctx.mod.isVndkSp()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isVndkExt() bool {
|
|
|
|
return ctx.mod.isVndkExt()
|
2017-06-23 18:24:43 +08:00
|
|
|
}
|
|
|
|
|
2018-11-13 12:19:56 +08:00
|
|
|
func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
|
|
|
|
return ctx.mod.mustUseVendorVariant()
|
|
|
|
}
|
|
|
|
|
2018-01-31 23:54:12 +08:00
|
|
|
func (ctx *moduleContextImpl) inRecovery() bool {
|
|
|
|
return ctx.mod.inRecovery()
|
|
|
|
}
|
|
|
|
|
2018-07-10 15:01:19 +08:00
|
|
|
// Check whether ABI dumps should be created for this module.
|
|
|
|
func (ctx *moduleContextImpl) shouldCreateVndkSourceAbiDump() bool {
|
|
|
|
if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
|
|
|
|
return false
|
2018-03-02 11:12:16 +08:00
|
|
|
}
|
2019-01-18 06:44:05 +08:00
|
|
|
|
|
|
|
if ctx.ctx.Fuchsia() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-07-10 15:01:19 +08: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
|
|
|
|
}
|
2018-12-28 16:25:39 +08:00
|
|
|
if !ctx.mod.IsForPlatform() {
|
|
|
|
// APEX variants do not need ABI dumps.
|
|
|
|
return false
|
|
|
|
}
|
2019-01-16 20:19:51 +08:00
|
|
|
if ctx.isNdk() {
|
2018-07-10 15:01:19 +08:00
|
|
|
return true
|
|
|
|
}
|
2019-01-16 20:19:51 +08:00
|
|
|
if ctx.isLlndkPublic() {
|
2018-08-02 02:27:02 +08:00
|
|
|
return true
|
|
|
|
}
|
2019-01-16 20:19:51 +08:00
|
|
|
if ctx.useVndk() && ctx.isVndk() && !ctx.isVndkPrivate() {
|
2018-07-10 15:01:19 +08:00
|
|
|
// Return true if this is VNDK-core, VNDK-SP, or VNDK-Ext and this is not
|
|
|
|
// VNDK-private.
|
2019-01-16 20:19:51 +08:00
|
|
|
return true
|
2018-07-10 15:01:19 +08:00
|
|
|
}
|
|
|
|
return false
|
2017-02-09 05:45:53 +08:00
|
|
|
}
|
|
|
|
|
2016-03-31 12:00:30 +08:00
|
|
|
func (ctx *moduleContextImpl) selectedStl() string {
|
|
|
|
if stl := ctx.mod.stl; stl != nil {
|
|
|
|
return stl.Properties.SelectedStl
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2018-11-28 06:33:03 +08:00
|
|
|
func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
|
|
|
|
return ctx.mod.linker.useClangLld(actx)
|
|
|
|
}
|
|
|
|
|
2016-10-07 07:12:58 +08: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 18:04:35 +08:00
|
|
|
func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
|
|
|
|
return ctx.mod.getVndkExtendsModuleName()
|
|
|
|
}
|
|
|
|
|
2019-01-19 18:24:06 +08:00
|
|
|
func (ctx *moduleContextImpl) apexName() string {
|
|
|
|
return ctx.mod.ApexName()
|
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 17:02:45 +08:00
|
|
|
}
|
|
|
|
|
2018-12-20 21:10:17 +08:00
|
|
|
func (ctx *moduleContextImpl) hasStubsVariants() bool {
|
|
|
|
return ctx.mod.HasStubsVariants()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isStubs() bool {
|
|
|
|
return ctx.mod.IsStubs()
|
|
|
|
}
|
|
|
|
|
2019-01-16 21:53:13 +08:00
|
|
|
func (ctx *moduleContextImpl) bootstrap() bool {
|
|
|
|
return ctx.mod.bootstrap()
|
|
|
|
}
|
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
2016-01-05 06:34:37 +08:00
|
|
|
return &Module{
|
|
|
|
hod: hod,
|
|
|
|
multilib: multilib,
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
2016-01-05 06:34:37 +08:00
|
|
|
module := newBaseModule(hod, multilib)
|
2016-09-27 06:45:04 +08:00
|
|
|
module.features = []feature{
|
|
|
|
&tidyFeature{},
|
|
|
|
}
|
2016-04-05 06:07:06 +08:00
|
|
|
module.stl = &stl{}
|
2016-01-07 06:41:07 +08:00
|
|
|
module.sanitize = &sanitize{}
|
2017-02-10 08:16:31 +08:00
|
|
|
module.coverage = &coverage{}
|
2017-02-09 05:45:53 +08:00
|
|
|
module.sabi = &sabi{}
|
2017-06-23 18:24:43 +08:00
|
|
|
module.vndkdep = &vndkdep{}
|
2017-05-10 06:44:35 +08:00
|
|
|
module.lto = <o{}
|
2017-09-01 14:38:27 +08:00
|
|
|
module.pgo = &pgo{}
|
2018-11-22 00:59:37 +08:00
|
|
|
module.xom = &xom{}
|
2016-01-05 06:34:37 +08:00
|
|
|
return module
|
|
|
|
}
|
2015-03-19 08:17:35 +08:00
|
|
|
|
2016-10-07 07:12:58 +08: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 06:21:13 +08:00
|
|
|
if p, ok := c.linker.(interface {
|
|
|
|
Name(string) string
|
|
|
|
}); ok {
|
2016-10-07 07:12:58 +08:00
|
|
|
name = p.Name(name)
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2019-01-19 06:37:31 +08:00
|
|
|
func (c *Module) Symlinks() []string {
|
|
|
|
if p, ok := c.installer.(interface {
|
|
|
|
symlinkList() []string
|
|
|
|
}); ok {
|
|
|
|
return p.symlinkList()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:05:30 +08:00
|
|
|
// orderDeps reorders dependencies into a list such that if module A depends on B, then
|
|
|
|
// A will precede B in the resultant list.
|
|
|
|
// This is convenient for passing into a linker.
|
2017-11-28 07:48:57 +08:00
|
|
|
// Note that directSharedDeps should be the analogous static library for each shared lib dep
|
|
|
|
func orderDeps(directStaticDeps []android.Path, directSharedDeps []android.Path, allTransitiveDeps map[android.Path][]android.Path) (orderedAllDeps []android.Path, orderedDeclaredDeps []android.Path) {
|
2017-09-28 08:05:30 +08:00
|
|
|
// If A depends on B, then
|
|
|
|
// Every list containing A will also contain B later in the list
|
|
|
|
// So, after concatenating all lists, the final instance of B will have come from the same
|
|
|
|
// original list as the final instance of A
|
|
|
|
// So, the final instance of B will be later in the concatenation than the final A
|
|
|
|
// So, keeping only the final instance of A and of B ensures that A is earlier in the output
|
|
|
|
// list than B
|
2017-11-28 07:48:57 +08:00
|
|
|
for _, dep := range directStaticDeps {
|
|
|
|
orderedAllDeps = append(orderedAllDeps, dep)
|
|
|
|
orderedAllDeps = append(orderedAllDeps, allTransitiveDeps[dep]...)
|
|
|
|
}
|
|
|
|
for _, dep := range directSharedDeps {
|
2017-09-28 08:05:30 +08:00
|
|
|
orderedAllDeps = append(orderedAllDeps, dep)
|
2017-11-28 07:48:57 +08:00
|
|
|
orderedAllDeps = append(orderedAllDeps, allTransitiveDeps[dep]...)
|
2017-09-28 08:05:30 +08:00
|
|
|
}
|
|
|
|
|
2017-10-25 02:13:31 +08:00
|
|
|
orderedAllDeps = android.LastUniquePaths(orderedAllDeps)
|
2017-09-28 08:05:30 +08:00
|
|
|
|
2017-11-28 07:48:57 +08:00
|
|
|
// We don't want to add any new dependencies into directStaticDeps (to allow the caller to
|
2017-09-28 08:05:30 +08:00
|
|
|
// intentionally exclude or replace any unwanted transitive dependencies), so we limit the
|
2017-11-28 07:48:57 +08:00
|
|
|
// resultant list to only what the caller has chosen to include in directStaticDeps
|
|
|
|
_, orderedDeclaredDeps = android.FilterPathList(orderedAllDeps, directStaticDeps)
|
2017-09-28 08:05:30 +08:00
|
|
|
|
|
|
|
return orderedAllDeps, orderedDeclaredDeps
|
|
|
|
}
|
|
|
|
|
2017-11-28 07:48:57 +08:00
|
|
|
func orderStaticModuleDeps(module *Module, staticDeps []*Module, sharedDeps []*Module) (results []android.Path) {
|
|
|
|
// convert Module to Path
|
|
|
|
allTransitiveDeps := make(map[android.Path][]android.Path, len(staticDeps))
|
|
|
|
staticDepFiles := []android.Path{}
|
|
|
|
for _, dep := range staticDeps {
|
|
|
|
allTransitiveDeps[dep.outputFile.Path()] = dep.depsInLinkOrder
|
|
|
|
staticDepFiles = append(staticDepFiles, dep.outputFile.Path())
|
|
|
|
}
|
|
|
|
sharedDepFiles := []android.Path{}
|
|
|
|
for _, sharedDep := range sharedDeps {
|
|
|
|
staticAnalogue := sharedDep.staticVariant
|
|
|
|
if staticAnalogue != nil {
|
|
|
|
allTransitiveDeps[staticAnalogue.outputFile.Path()] = staticAnalogue.depsInLinkOrder
|
|
|
|
sharedDepFiles = append(sharedDepFiles, staticAnalogue.outputFile.Path())
|
|
|
|
}
|
2017-09-28 08:05:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// reorder the dependencies based on transitive dependencies
|
2017-11-28 07:48:57 +08:00
|
|
|
module.depsInLinkOrder, results = orderDeps(staticDepFiles, sharedDepFiles, allTransitiveDeps)
|
2017-09-28 08:05:30 +08:00
|
|
|
|
|
|
|
return results
|
|
|
|
}
|
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
|
2016-01-05 06:34:37 +08:00
|
|
|
ctx := &moduleContext{
|
2016-05-19 06:37:25 +08:00
|
|
|
ModuleContext: actx,
|
2016-01-05 06:34:37 +08:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
|
|
|
|
2017-11-17 06:33:08 +08:00
|
|
|
deps := c.depsToPaths(ctx)
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-10-08 11:54:34 +08:00
|
|
|
if c.Properties.Clang != nil && *c.Properties.Clang == false {
|
|
|
|
ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
flags := Flags{
|
|
|
|
Toolchain: c.toolchain(ctx),
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.compiler != nil {
|
2017-11-17 06:33:08 +08:00
|
|
|
flags = c.compiler.compilerFlags(ctx, flags, deps)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
flags = c.linker.linkerFlags(ctx, flags)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-04-05 06:07:06 +08:00
|
|
|
if c.stl != nil {
|
|
|
|
flags = c.stl.flags(ctx, flags)
|
|
|
|
}
|
2016-01-07 06:41:07 +08:00
|
|
|
if c.sanitize != nil {
|
|
|
|
flags = c.sanitize.flags(ctx, flags)
|
|
|
|
}
|
2017-02-10 08:16:31 +08:00
|
|
|
if c.coverage != nil {
|
|
|
|
flags = c.coverage.flags(ctx, flags)
|
|
|
|
}
|
2017-05-10 06:44:35 +08:00
|
|
|
if c.lto != nil {
|
|
|
|
flags = c.lto.flags(ctx, flags)
|
|
|
|
}
|
2017-09-01 14:38:27 +08:00
|
|
|
if c.pgo != nil {
|
|
|
|
flags = c.pgo.flags(ctx, flags)
|
|
|
|
}
|
2018-11-22 00:59:37 +08:00
|
|
|
if c.xom != nil {
|
|
|
|
flags = c.xom.flags(ctx, flags)
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
for _, feature := range c.features {
|
|
|
|
flags = feature.flags(ctx, flags)
|
|
|
|
}
|
2015-03-19 04:28:46 +08:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-07-30 04:44:28 +08:00
|
|
|
flags.CFlags, _ = filterList(flags.CFlags, config.IllegalFlags)
|
|
|
|
flags.CppFlags, _ = filterList(flags.CppFlags, config.IllegalFlags)
|
|
|
|
flags.ConlyFlags, _ = filterList(flags.ConlyFlags, config.IllegalFlags)
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2017-01-11 08:21:22 +08:00
|
|
|
flags.GlobalFlags = append(flags.GlobalFlags, deps.Flags...)
|
|
|
|
c.flags = flags
|
2017-06-16 05:45:18 +08:00
|
|
|
// We need access to all the flags seen by a source file.
|
|
|
|
if c.sabi != nil {
|
|
|
|
flags = c.sabi.flags(ctx, flags)
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
// Optimization to reduce size of build.ninja
|
|
|
|
// Replace the long list of flags for each file with a module-local variable
|
|
|
|
ctx.Variable(pctx, "cflags", strings.Join(flags.CFlags, " "))
|
|
|
|
ctx.Variable(pctx, "cppflags", strings.Join(flags.CppFlags, " "))
|
|
|
|
ctx.Variable(pctx, "asflags", strings.Join(flags.AsFlags, " "))
|
|
|
|
flags.CFlags = []string{"$cflags"}
|
|
|
|
flags.CppFlags = []string{"$cppflags"}
|
|
|
|
flags.AsFlags = []string{"$asflags"}
|
2015-03-19 04:28:46 +08:00
|
|
|
|
2016-09-27 08:33:01 +08:00
|
|
|
var objs Objects
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.compiler != nil {
|
2016-09-27 08:33:01 +08:00
|
|
|
objs = c.compiler.compile(ctx, flags, deps)
|
2016-01-05 06:34:37 +08:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2015-03-19 05:01:18 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.linker != nil {
|
2016-09-27 08:33:01 +08:00
|
|
|
outputFile := c.linker.link(ctx, flags, deps, objs)
|
2016-01-05 06:34:37 +08:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2016-05-19 06:37:25 +08:00
|
|
|
c.outputFile = android.OptionalPathForPath(outputFile)
|
2018-12-20 21:10:17 +08: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').
|
2019-01-16 03:53:23 +08:00
|
|
|
if c.HasStubsVariants() &&
|
|
|
|
android.DirectlyInAnyApex(ctx, ctx.baseModuleName()) &&
|
2018-12-11 07:12:40 +08:00
|
|
|
!c.inRecovery() && !c.useVndk() && !c.static() && !c.isCoverageVariant() &&
|
|
|
|
c.IsStubs() {
|
2018-12-20 21:10:17 +08:00
|
|
|
c.Properties.HideFromMake = false // unhide
|
|
|
|
// Note: this is still non-installable
|
|
|
|
}
|
2016-10-07 07:12:58 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2018-10-02 23:38:19 +08:00
|
|
|
if c.installer != nil && !c.Properties.PreventInstall && c.IsForPlatform() && c.outputFile.Valid() {
|
2016-10-07 07:12:58 +08:00
|
|
|
c.installer.install(ctx, c.outputFile.Path())
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 01:47:14 +08:00
|
|
|
func (c *Module) toolchain(ctx android.BaseContext) config.Toolchain {
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.cachedToolchain == nil {
|
2016-07-30 04:44:28 +08:00
|
|
|
c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
return c.cachedToolchain
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
func (c *Module) begin(ctx BaseModuleContext) {
|
|
|
|
if c.compiler != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
c.compiler.compilerInit(ctx)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
if c.linker != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
c.linker.linkerInit(ctx)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-04-05 06:07:06 +08:00
|
|
|
if c.stl != nil {
|
|
|
|
c.stl.begin(ctx)
|
|
|
|
}
|
2016-01-07 06:41:07 +08:00
|
|
|
if c.sanitize != nil {
|
|
|
|
c.sanitize.begin(ctx)
|
|
|
|
}
|
2017-02-10 08:16:31 +08:00
|
|
|
if c.coverage != nil {
|
|
|
|
c.coverage.begin(ctx)
|
|
|
|
}
|
2017-02-09 05:45:53 +08:00
|
|
|
if c.sabi != nil {
|
|
|
|
c.sabi.begin(ctx)
|
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
c.vndkdep.begin(ctx)
|
|
|
|
}
|
2017-05-10 06:44:35 +08:00
|
|
|
if c.lto != nil {
|
|
|
|
c.lto.begin(ctx)
|
|
|
|
}
|
2017-09-01 14:38:27 +08:00
|
|
|
if c.pgo != nil {
|
|
|
|
c.pgo.begin(ctx)
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
for _, feature := range c.features {
|
|
|
|
feature.begin(ctx)
|
|
|
|
}
|
2017-09-28 08:01:44 +08:00
|
|
|
if ctx.useSdk() {
|
2017-08-18 07:19:59 +08:00
|
|
|
version, err := normalizeNdkApiLevel(ctx, ctx.sdkVersion(), ctx.Arch())
|
2016-08-06 07:37:52 +08:00
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version", err.Error())
|
|
|
|
}
|
2017-11-08 02:57:05 +08:00
|
|
|
c.Properties.Sdk_version = StringPtr(version)
|
2016-08-06 07:37:52 +08:00
|
|
|
}
|
2015-04-25 08:31:52 +08:00
|
|
|
}
|
|
|
|
|
2016-12-14 09:06:13 +08:00
|
|
|
func (c *Module) deps(ctx DepsContext) Deps {
|
2016-04-12 06:06:20 +08:00
|
|
|
deps := Deps{}
|
|
|
|
|
|
|
|
if c.compiler != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
deps = c.compiler.compilerDeps(ctx, deps)
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
2018-04-24 06:44:39 +08: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 07:47:29 +08:00
|
|
|
if c.pgo != nil {
|
|
|
|
deps = c.pgo.deps(ctx, deps)
|
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
if c.linker != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
deps = c.linker.linkerDeps(ctx, deps)
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
2016-04-05 06:07:06 +08:00
|
|
|
if c.stl != nil {
|
|
|
|
deps = c.stl.deps(ctx, deps)
|
|
|
|
}
|
2016-01-07 06:41:07 +08:00
|
|
|
if c.sanitize != nil {
|
|
|
|
deps = c.sanitize.deps(ctx, deps)
|
|
|
|
}
|
2018-04-24 06:44:39 +08:00
|
|
|
if c.coverage != nil {
|
|
|
|
deps = c.coverage.deps(ctx, deps)
|
|
|
|
}
|
2017-02-09 05:45:53 +08:00
|
|
|
if c.sabi != nil {
|
|
|
|
deps = c.sabi.deps(ctx, deps)
|
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
if c.vndkdep != nil {
|
|
|
|
deps = c.vndkdep.deps(ctx, deps)
|
|
|
|
}
|
2017-05-10 06:44:35 +08:00
|
|
|
if c.lto != nil {
|
|
|
|
deps = c.lto.deps(ctx, deps)
|
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
for _, feature := range c.features {
|
|
|
|
deps = feature.deps(ctx, deps)
|
|
|
|
}
|
|
|
|
|
2017-10-25 02:13:31 +08: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-20 01:17:32 +08:00
|
|
|
deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
|
2016-04-12 06:06:20 +08:00
|
|
|
|
2016-06-07 09:22:19 +08: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-14 04:50:57 +08: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 08:34:58 +08: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 06:06:20 +08:00
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2016-08-05 04:02:36 +08:00
|
|
|
func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
|
2016-01-05 06:34:37 +08:00
|
|
|
ctx := &baseModuleContext{
|
2016-05-19 06:37:25 +08:00
|
|
|
BaseContext: actx,
|
2016-01-05 06:34:37 +08:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
2015-03-25 05:15:58 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
c.begin(ctx)
|
2016-08-05 04:02:36 +08: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 21:25:07 +08:00
|
|
|
// Split name#version into name and version
|
|
|
|
func stubsLibNameAndVersion(name string) (string, string) {
|
|
|
|
if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
|
|
|
|
version := name[sharp+1:]
|
|
|
|
libname := name[:sharp]
|
|
|
|
return libname, version
|
|
|
|
}
|
|
|
|
return name, ""
|
|
|
|
}
|
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
2016-12-14 09:06:13 +08:00
|
|
|
ctx := &depsContext{
|
|
|
|
BottomUpMutatorContext: actx,
|
2016-08-05 04:02:36 +08:00
|
|
|
moduleContextImpl: moduleContextImpl{
|
|
|
|
mod: c,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
ctx.ctx = ctx
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
deps := c.deps(ctx)
|
2015-04-29 04:30:13 +08:00
|
|
|
|
2016-06-18 07:45:24 +08:00
|
|
|
variantNdkLibs := []string{}
|
|
|
|
variantLateNdkLibs := []string{}
|
2017-03-20 04:44:32 +08:00
|
|
|
if ctx.Os() == android.Android {
|
2016-06-18 07:45:24 +08:00
|
|
|
version := ctx.sdkVersion()
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
// rewriteNdkLibs takes a list of names of shared libraries and scans it for three types
|
|
|
|
// of names:
|
2016-06-18 07:45:24 +08:00
|
|
|
//
|
2017-09-28 08:01:44 +08: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 07:45:24 +08:00
|
|
|
//
|
2017-09-28 08:01:44 +08:00
|
|
|
// The caller can then know to add the variantLibs dependencies differently from the
|
|
|
|
// nonvariantLibs
|
|
|
|
rewriteNdkLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
|
|
|
|
variantLibs = []string{}
|
|
|
|
nonvariantLibs = []string{}
|
2016-06-18 07:45:24 +08: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 21:25:07 +08:00
|
|
|
// strip #version suffix out
|
|
|
|
name, _ := stubsLibNameAndVersion(entry)
|
|
|
|
if ctx.useSdk() && inList(name, ndkPrebuiltSharedLibraries) {
|
|
|
|
if !inList(name, ndkMigratedLibs) {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, name+".ndk."+version)
|
2016-06-18 07:45:24 +08: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 21:25:07 +08:00
|
|
|
variantLibs = append(variantLibs, name+ndkLibrarySuffix)
|
2016-06-18 07:45:24 +08: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 21:25:07 +08:00
|
|
|
} else if ctx.useVndk() && inList(name, llndkLibraries) {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, name+llndkLibrarySuffix)
|
|
|
|
} else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, vendorPublicLibraries) {
|
|
|
|
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 17:23:01 +08: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 21:25:07 +08: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 17:23:01 +08:00
|
|
|
}
|
2016-06-18 07:45:24 +08: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 21:25:07 +08:00
|
|
|
// put name#version back
|
2017-03-28 15:08:30 +08:00
|
|
|
nonvariantLibs = append(nonvariantLibs, entry)
|
2016-07-09 14:23:48 +08:00
|
|
|
}
|
|
|
|
}
|
2016-06-18 07:45:24 +08:00
|
|
|
return nonvariantLibs, variantLibs
|
2016-07-09 14:23:48 +08:00
|
|
|
}
|
|
|
|
|
2016-06-18 07:45:24 +08:00
|
|
|
deps.SharedLibs, variantNdkLibs = rewriteNdkLibs(deps.SharedLibs)
|
|
|
|
deps.LateSharedLibs, variantLateNdkLibs = rewriteNdkLibs(deps.LateSharedLibs)
|
2017-07-05 12:41:55 +08:00
|
|
|
deps.ReexportSharedLibHeaders, _ = rewriteNdkLibs(deps.ReexportSharedLibHeaders)
|
2016-07-09 14:23:48 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
|
2019-01-28 15:16:54 +08:00
|
|
|
buildStubs := 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 21:25:07 +08:00
|
|
|
if c.linker != nil {
|
|
|
|
if library, ok := c.linker.(*libraryDecorator); ok {
|
|
|
|
if library.buildStubs() {
|
2019-01-28 15:16:54 +08:00
|
|
|
buildStubs = true
|
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 21:25:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-15 23:39:51 +08:00
|
|
|
for _, lib := range deps.HeaderLibs {
|
|
|
|
depTag := headerDepTag
|
|
|
|
if inList(lib, deps.ReexportHeaderLibHeaders) {
|
|
|
|
depTag = headerExportDepTag
|
|
|
|
}
|
2019-01-28 15:16:54 +08:00
|
|
|
if buildStubs {
|
|
|
|
actx.AddFarVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "arch", Variation: ctx.Target().String()},
|
2019-01-29 10:15:04 +08:00
|
|
|
{Mutator: "image", Variation: c.imageVariation()},
|
2019-01-28 15:16:54 +08:00
|
|
|
}, depTag, lib)
|
|
|
|
} 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 23:39:51 +08:00
|
|
|
}
|
2016-12-14 04:50:57 +08:00
|
|
|
|
2019-02-08 20:00:45 +08:00
|
|
|
syspropImplLibraries := syspropImplLibraries(actx.Config())
|
|
|
|
|
2019-02-25 21:14:17 +08:00
|
|
|
for _, lib := range deps.WholeStaticLibs {
|
|
|
|
depTag := wholeStaticDepTag
|
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
|
|
|
}
|
|
|
|
|
2016-06-07 09:22:19 +08:00
|
|
|
for _, lib := range deps.StaticLibs {
|
|
|
|
depTag := staticDepTag
|
|
|
|
if inList(lib, deps.ReexportStaticLibHeaders) {
|
|
|
|
depTag = staticExportDepTag
|
|
|
|
}
|
2019-02-08 20:00:45 +08:00
|
|
|
|
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
|
|
|
|
2018-07-23 12:18:45 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
2016-06-07 09:22:19 +08:00
|
|
|
}
|
2015-03-25 05:15:58 +08:00
|
|
|
|
2018-07-23 12:18:45 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, lateStaticDepTag, deps.LateStaticLibs...)
|
2015-03-25 05:15:58 +08: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 17:02:45 +08:00
|
|
|
addSharedLibDependencies := func(depTag dependencyTag, name string, version string) {
|
|
|
|
var variations []blueprint.Variation
|
|
|
|
variations = append(variations, blueprint.Variation{Mutator: "link", Variation: "shared"})
|
2018-12-13 11:01:31 +08:00
|
|
|
versionVariantAvail := !ctx.useVndk() && !c.inRecovery()
|
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 17:02:45 +08:00
|
|
|
if version != "" && versionVariantAvail {
|
|
|
|
// Version is explicitly specified. i.e. libFoo#30
|
|
|
|
variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
|
|
|
|
depTag.explicitlyVersioned = true
|
|
|
|
}
|
|
|
|
actx.AddVariationDependencies(variations, depTag, name)
|
|
|
|
|
|
|
|
// If the version is not specified, add dependency to the latest stubs library.
|
|
|
|
// The stubs library will be used when the depending module is built for APEX and
|
|
|
|
// the dependent module is not in the same APEX.
|
|
|
|
latestVersion := latestStubsVersionFor(actx.Config(), name)
|
|
|
|
if version == "" && latestVersion != "" && versionVariantAvail {
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
{Mutator: "version", Variation: latestVersion},
|
|
|
|
}, depTag, name)
|
|
|
|
// Note that depTag.explicitlyVersioned is false in this case.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 21:25:07 +08:00
|
|
|
// shared lib names without the #version suffix
|
|
|
|
var sharedLibNames []string
|
|
|
|
|
2016-06-07 09:22:19 +08:00
|
|
|
for _, lib := range deps.SharedLibs {
|
|
|
|
depTag := sharedDepTag
|
|
|
|
if inList(lib, deps.ReexportSharedLibHeaders) {
|
|
|
|
depTag = sharedExportDepTag
|
|
|
|
}
|
2019-02-08 20:00:45 +08:00
|
|
|
|
|
|
|
if impl, ok := syspropImplLibraries[lib]; ok {
|
|
|
|
lib = impl
|
|
|
|
}
|
|
|
|
|
|
|
|
name, version := stubsLibNameAndVersion(lib)
|
|
|
|
sharedLibNames = append(sharedLibNames, name)
|
|
|
|
|
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 17:02:45 +08:00
|
|
|
addSharedLibDependencies(depTag, name, version)
|
2016-06-07 09:22:19 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08: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 21:25:07 +08: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 17:02:45 +08: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 21:25:07 +08: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
|
|
|
|
}
|
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 17:02:45 +08:00
|
|
|
addSharedLibDependencies(lateSharedDepTag, lib, "")
|
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 21:25:07 +08:00
|
|
|
}
|
2016-04-12 05:37:39 +08:00
|
|
|
|
2018-07-23 12:18:45 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, runtimeDepTag, deps.RuntimeLibs...)
|
2017-12-20 01:17:32 +08:00
|
|
|
|
2016-07-09 01:41:41 +08:00
|
|
|
actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
|
2016-09-29 08:34:58 +08:00
|
|
|
|
|
|
|
for _, gen := range deps.GeneratedHeaders {
|
|
|
|
depTag := genHeaderDepTag
|
|
|
|
if inList(gen, deps.ReexportGeneratedHeaders) {
|
|
|
|
depTag = genHeaderExportDepTag
|
|
|
|
}
|
|
|
|
actx.AddDependency(c, depTag, gen)
|
|
|
|
}
|
2016-04-21 05:21:14 +08:00
|
|
|
|
2018-08-30 05:10:52 +08:00
|
|
|
actx.AddVariationDependencies(nil, objDepTag, deps.ObjFiles...)
|
2016-04-12 06:06:20 +08:00
|
|
|
|
|
|
|
if deps.CrtBegin != "" {
|
2018-08-30 05:10:52 +08:00
|
|
|
actx.AddVariationDependencies(nil, crtBeginDepTag, deps.CrtBegin)
|
2015-03-25 05:15:58 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
if deps.CrtEnd != "" {
|
2018-08-30 05:10:52 +08:00
|
|
|
actx.AddVariationDependencies(nil, crtEndDepTag, deps.CrtEnd)
|
2015-03-25 05:15:58 +08:00
|
|
|
}
|
2018-10-12 15:24:23 +08:00
|
|
|
if deps.LinkerFlagsFile != "" {
|
|
|
|
actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
|
|
|
|
}
|
|
|
|
if deps.DynamicLinker != "" {
|
|
|
|
actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
|
2017-09-19 14:19:12 +08:00
|
|
|
}
|
2016-06-18 07:45:24 +08:00
|
|
|
|
|
|
|
version := ctx.sdkVersion()
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2018-07-23 12:18:45 +08:00
|
|
|
{Mutator: "ndk_api", Variation: version},
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, ndkStubDepTag, variantNdkLibs...)
|
2016-06-18 07:45:24 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2018-07-23 12:18:45 +08:00
|
|
|
{Mutator: "ndk_api", Variation: version},
|
|
|
|
{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 18:04:35 +08:00
|
|
|
|
|
|
|
if vndkdep := c.vndkdep; vndkdep != nil {
|
|
|
|
if vndkdep.isVndkExt() {
|
|
|
|
baseModuleMode := vendorMode
|
|
|
|
if actx.DeviceConfig().VndkVersion() == "" {
|
|
|
|
baseModuleMode = coreMode
|
|
|
|
}
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
2018-07-23 12:18:45 +08:00
|
|
|
{Mutator: "image", Variation: baseModuleMode},
|
|
|
|
{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 18:04:35 +08:00
|
|
|
}
|
|
|
|
}
|
2015-10-30 06:25:03 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2018-10-03 13:25:58 +08:00
|
|
|
func BeginMutator(ctx android.BottomUpMutatorContext) {
|
2016-08-05 04:02:36 +08:00
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
|
|
|
|
c.beginMutator(ctx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
// Whether a module can link to another module, taking into
|
|
|
|
// account NDK linking.
|
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 18:04:35 +08:00
|
|
|
func checkLinkType(ctx android.ModuleContext, from *Module, to *Module, tag dependencyTag) {
|
2017-09-28 08:01:44 +08:00
|
|
|
if from.Target().Os != android.Android {
|
|
|
|
// Host code is not restricted
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if from.Properties.UseVndk {
|
|
|
|
// Though vendor code is limited by the vendor mutator,
|
|
|
|
// each vendor-available module needs to check
|
|
|
|
// link-type for VNDK.
|
|
|
|
if from.vndkdep != nil {
|
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 18:04:35 +08:00
|
|
|
from.vndkdep.vndkCheckLinkType(ctx, to, tag)
|
2016-08-04 05:12:14 +08:00
|
|
|
}
|
2017-09-28 08:01:44 +08:00
|
|
|
return
|
|
|
|
}
|
2017-11-08 02:57:05 +08:00
|
|
|
if String(from.Properties.Sdk_version) == "" {
|
2017-09-28 08:01:44 +08:00
|
|
|
// Platform code can link to anything
|
|
|
|
return
|
|
|
|
}
|
2018-01-31 23:54:12 +08:00
|
|
|
if from.inRecovery() {
|
|
|
|
// Recovery code is not NDK
|
|
|
|
return
|
|
|
|
}
|
2017-09-28 08:01:44 +08:00
|
|
|
if _, ok := to.linker.(*toolchainLibraryDecorator); ok {
|
|
|
|
// These are always allowed
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if _, ok := to.linker.(*ndkPrebuiltStlLinker); ok {
|
|
|
|
// These are allowed, but they don't set sdk_version
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if _, ok := to.linker.(*stubDecorator); ok {
|
|
|
|
// These aren't real libraries, but are the stub shared libraries that are included in
|
|
|
|
// the NDK.
|
|
|
|
return
|
|
|
|
}
|
2019-01-14 15:39:03 +08:00
|
|
|
|
|
|
|
if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Name() == "libc++" {
|
|
|
|
// Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
|
|
|
|
// to link to libc++ (non-NDK and without sdk_version).
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-11-08 02:57:05 +08:00
|
|
|
if String(to.Properties.Sdk_version) == "" {
|
2017-09-28 08:01:44 +08:00
|
|
|
// NDK code linking to platform code is never okay.
|
|
|
|
ctx.ModuleErrorf("depends on non-NDK-built library %q",
|
|
|
|
ctx.OtherModuleName(to))
|
2019-02-07 10:30:02 +08:00
|
|
|
return
|
2017-09-28 08:01:44 +08:00
|
|
|
}
|
2016-08-04 05:12:14 +08:00
|
|
|
|
2017-09-28 08:01:44 +08: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-04 05:12:14 +08:00
|
|
|
|
2018-04-11 08:48:45 +08:00
|
|
|
// Current can link against anything.
|
|
|
|
if String(from.Properties.Sdk_version) != "current" {
|
|
|
|
// Otherwise we need to check.
|
|
|
|
if String(to.Properties.Sdk_version) == "current" {
|
|
|
|
// Current can't be linked against by anything else.
|
|
|
|
ctx.ModuleErrorf("links %q built against newer API version %q",
|
|
|
|
ctx.OtherModuleName(to), "current")
|
|
|
|
} else {
|
|
|
|
fromApi, err := strconv.Atoi(String(from.Properties.Sdk_version))
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
2018-04-11 09:13:16 +08:00
|
|
|
"Invalid sdk_version value (must be int or current): %q",
|
2018-04-11 08:48:45 +08:00
|
|
|
String(from.Properties.Sdk_version))
|
|
|
|
}
|
|
|
|
toApi, err := strconv.Atoi(String(to.Properties.Sdk_version))
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
2018-04-11 09:13:16 +08:00
|
|
|
"Invalid sdk_version value (must be int or current): %q",
|
2018-04-11 08:48:45 +08:00
|
|
|
String(to.Properties.Sdk_version))
|
|
|
|
}
|
2016-08-04 05:12:14 +08:00
|
|
|
|
2018-04-11 08:48:45 +08:00
|
|
|
if toApi > fromApi {
|
|
|
|
ctx.ModuleErrorf("links %q built against newer API version %q",
|
|
|
|
ctx.OtherModuleName(to), String(to.Properties.Sdk_version))
|
|
|
|
}
|
|
|
|
}
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
2017-12-16 05:56:59 +08:00
|
|
|
|
|
|
|
// Also check that the two STL choices are compatible.
|
|
|
|
fromStl := from.stl.Properties.SelectedStl
|
|
|
|
toStl := to.stl.Properties.SelectedStl
|
|
|
|
if fromStl == "" || toStl == "" {
|
|
|
|
// Libraries that don't use the STL are unrestricted.
|
2018-04-11 14:41:38 +08:00
|
|
|
} else if fromStl == "ndk_system" || toStl == "ndk_system" {
|
2017-12-16 05:56:59 +08: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 07:28:17 +08:00
|
|
|
} else if getNdkStlFamily(from) != getNdkStlFamily(to) {
|
2017-12-16 05:56:59 +08:00
|
|
|
ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
|
|
|
|
from.stl.Properties.SelectedStl, ctx.OtherModuleName(to),
|
|
|
|
to.stl.Properties.SelectedStl)
|
|
|
|
}
|
2017-09-28 08:01:44 +08:00
|
|
|
}
|
2016-06-08 03:34:45 +08:00
|
|
|
|
2018-04-09 11:03:06 +08:00
|
|
|
// Tests whether the dependent library is okay to be double loaded inside a single process.
|
2019-01-18 14:20:43 +08: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 11:03:06 +08:00
|
|
|
// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
|
2019-01-18 14:20:43 +08:00
|
|
|
func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
|
|
|
|
check := func(child, parent android.Module) bool {
|
|
|
|
to, ok := child.(*Module)
|
|
|
|
if !ok {
|
|
|
|
// follow thru cc.Defaults, etc.
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
|
|
|
|
return false
|
|
|
|
}
|
2018-04-09 11:03:06 +08:00
|
|
|
|
2019-01-18 14:20:43 +08:00
|
|
|
// if target lib has no vendor variant, keep checking dependency graph
|
|
|
|
if !to.hasVendorVariant() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if to.isVndkSp() || inList(child.Name(), llndkLibraries) || Bool(to.VendorProperties.Double_loadable) {
|
|
|
|
return false
|
2018-04-09 11:03:06 +08:00
|
|
|
}
|
2019-01-18 14:20:43 +08:00
|
|
|
|
|
|
|
var stringPath []string
|
|
|
|
for _, m := range ctx.GetWalkPath() {
|
|
|
|
stringPath = append(stringPath, m.Name())
|
2018-04-09 11:03:06 +08:00
|
|
|
}
|
2019-01-18 14:20:43 +08: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() {
|
|
|
|
if inList(ctx.ModuleName(), llndkLibraries) || Bool(module.VendorProperties.Double_loadable) {
|
|
|
|
ctx.WalkDeps(check)
|
|
|
|
}
|
2018-04-09 11:03:06 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
// Convert dependencies to paths. Returns a PathDeps containing paths
|
|
|
|
func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|
|
|
var depPaths PathDeps
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2017-09-28 08:05:30 +08:00
|
|
|
directStaticDeps := []*Module{}
|
2017-11-28 07:48:57 +08:00
|
|
|
directSharedDeps := []*Module{}
|
2017-09-28 08:05:30 +08:00
|
|
|
|
2017-10-24 08:59:01 +08:00
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
2017-09-28 08:01:44 +08:00
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
|
|
|
|
|
|
|
ccDep, _ := dep.(*Module)
|
|
|
|
if ccDep == nil {
|
|
|
|
// handling for a few module types that aren't cc Module but that are also supported
|
|
|
|
switch depTag {
|
2016-04-21 05:21:14 +08:00
|
|
|
case genSourceDepTag:
|
2017-09-28 08:01:44 +08:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2016-04-21 05:21:14 +08:00
|
|
|
depPaths.GeneratedSources = append(depPaths.GeneratedSources,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
|
|
|
} else {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
|
2016-04-21 05:21:14 +08:00
|
|
|
}
|
2017-04-27 07:59:26 +08:00
|
|
|
// Support exported headers from a generated_sources dependency
|
|
|
|
fallthrough
|
2016-09-29 08:34:58 +08:00
|
|
|
case genHeaderDepTag, genHeaderExportDepTag:
|
2017-09-28 08:01:44 +08:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2016-04-21 05:21:14 +08:00
|
|
|
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders,
|
2018-02-22 10:28:18 +08:00
|
|
|
genRule.GeneratedDeps()...)
|
2016-11-23 04:55:55 +08:00
|
|
|
flags := includeDirsToFlags(genRule.GeneratedHeaderDirs())
|
2016-09-29 08:34:58 +08:00
|
|
|
depPaths.Flags = append(depPaths.Flags, flags)
|
2017-09-28 08:01:44 +08:00
|
|
|
if depTag == genHeaderExportDepTag {
|
2016-09-29 08:34:58 +08:00
|
|
|
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags)
|
2016-09-30 03:13:36 +08:00
|
|
|
depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps,
|
2018-02-22 10:28:18 +08:00
|
|
|
genRule.GeneratedDeps()...)
|
2017-04-20 21:53:59 +08:00
|
|
|
// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
|
|
|
|
c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags)
|
|
|
|
|
2016-09-29 08:34:58 +08:00
|
|
|
}
|
2016-04-21 05:21:14 +08:00
|
|
|
} else {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q is not a genrule", depName)
|
2016-04-21 05:21:14 +08:00
|
|
|
}
|
2018-10-12 15:24:23 +08:00
|
|
|
case linkerFlagsDepTag:
|
2017-09-28 08:01:44 +08:00
|
|
|
if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
|
2017-09-19 14:19:12 +08:00
|
|
|
files := genRule.GeneratedSourceFiles()
|
|
|
|
if len(files) == 1 {
|
2018-10-12 15:24:23 +08:00
|
|
|
depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
|
2017-09-19 14:19:12 +08:00
|
|
|
} else if len(files) > 1 {
|
2018-10-12 15:24:23 +08:00
|
|
|
ctx.ModuleErrorf("module %q can only generate a single file if used for a linker flag file", depName)
|
2017-09-19 14:19:12 +08:00
|
|
|
}
|
|
|
|
} else {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q is not a genrule", depName)
|
2017-09-19 14:19:12 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
return
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2017-10-24 08:59:01 +08:00
|
|
|
if dep.Target().Os != ctx.Os() {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
|
2016-06-02 08:09:44 +08:00
|
|
|
return
|
|
|
|
}
|
2017-10-24 08:59:01 +08:00
|
|
|
if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName)
|
2016-04-12 06:06:20 +08:00
|
|
|
return
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2015-04-23 04:07:53 +08:00
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
// re-exporting flags
|
|
|
|
if depTag == reuseObjTag {
|
|
|
|
if l, ok := ccDep.compiler.(libraryInterface); ok {
|
2017-11-28 07:48:57 +08:00
|
|
|
c.staticVariant = ccDep
|
2017-05-04 07:24:55 +08:00
|
|
|
objs, flags, deps := l.reuseObjs()
|
2017-05-04 02:01:58 +08:00
|
|
|
depPaths.Objs = depPaths.Objs.Append(objs)
|
|
|
|
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...)
|
2017-05-04 07:24:55 +08:00
|
|
|
depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...)
|
2016-11-24 07:45:05 +08:00
|
|
|
return
|
|
|
|
}
|
2016-04-12 06:06:20 +08: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 17:02:45 +08:00
|
|
|
|
2019-01-31 23:31:10 +08:00
|
|
|
if depTag == staticVariantTag {
|
|
|
|
if _, ok := ccDep.compiler.(libraryInterface); ok {
|
|
|
|
c.staticVariant = ccDep
|
|
|
|
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 17:02:45 +08:00
|
|
|
// Extract explicitlyVersioned field from the depTag and reset it inside the struct.
|
|
|
|
// Otherwise, sharedDepTag and lateSharedDepTag with explicitlyVersioned set to true
|
|
|
|
// won't be matched to sharedDepTag and lateSharedDepTag.
|
|
|
|
explicitlyVersioned := false
|
|
|
|
if t, ok := depTag.(dependencyTag); ok {
|
|
|
|
explicitlyVersioned = t.explicitlyVersioned
|
|
|
|
t.explicitlyVersioned = false
|
|
|
|
depTag = t
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
if t, ok := depTag.(dependencyTag); ok && t.library {
|
2018-12-20 17:18:08 +08:00
|
|
|
depIsStatic := false
|
|
|
|
switch depTag {
|
|
|
|
case staticDepTag, staticExportDepTag, lateStaticDepTag, wholeStaticDepTag:
|
|
|
|
depIsStatic = true
|
|
|
|
}
|
|
|
|
if dependentLibrary, ok := ccDep.linker.(*libraryDecorator); ok && !depIsStatic {
|
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 17:02:45 +08:00
|
|
|
depIsStubs := dependentLibrary.buildStubs()
|
|
|
|
depHasStubs := ccDep.HasStubsVariants()
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-11 00:35:25 +08:00
|
|
|
depInSameApex := android.DirectlyInApex(c.ApexName(), depName)
|
2019-01-16 03:53:23 +08:00
|
|
|
depInPlatform := !android.DirectlyInAnyApex(ctx, depName)
|
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 17:02:45 +08:00
|
|
|
|
|
|
|
var useThisDep bool
|
|
|
|
if depIsStubs && explicitlyVersioned {
|
|
|
|
// Always respect dependency to the versioned stubs (i.e. libX#10)
|
|
|
|
useThisDep = true
|
|
|
|
} else if !depHasStubs {
|
|
|
|
// Use non-stub variant if that is the only choice
|
|
|
|
// (i.e. depending on a lib without stubs.version property)
|
|
|
|
useThisDep = true
|
|
|
|
} else if c.IsForPlatform() {
|
|
|
|
// If not building for APEX, use stubs only when it is from
|
|
|
|
// an APEX (and not from platform)
|
|
|
|
useThisDep = (depInPlatform != depIsStubs)
|
2019-01-16 21:53:13 +08:00
|
|
|
if c.inRecovery() || c.bootstrap() {
|
2018-12-20 21:10:17 +08:00
|
|
|
// However, for 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 17:02:45 +08:00
|
|
|
// always link to non-stub variant
|
|
|
|
useThisDep = !depIsStubs
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// If building for APEX, use stubs only when it is not from
|
|
|
|
// the same APEX
|
|
|
|
useThisDep = (depInSameApex != depIsStubs)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !useThisDep {
|
|
|
|
return // stop processing this dep
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
if i, ok := ccDep.linker.(exportedFlagsProducer); ok {
|
2016-07-09 15:14:08 +08:00
|
|
|
flags := i.exportedFlags()
|
2016-09-30 03:13:36 +08:00
|
|
|
deps := i.exportedFlagsDeps()
|
2016-07-09 15:14:08 +08:00
|
|
|
depPaths.Flags = append(depPaths.Flags, flags...)
|
2016-09-30 03:13:36 +08:00
|
|
|
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, deps...)
|
2016-06-07 09:22:19 +08:00
|
|
|
|
|
|
|
if t.reexportFlags {
|
2016-07-09 15:14:08 +08:00
|
|
|
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...)
|
2016-09-30 03:13:36 +08:00
|
|
|
depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...)
|
2017-04-20 21:53:59 +08:00
|
|
|
// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
|
2017-08-24 07:08:29 +08:00
|
|
|
// 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).
|
|
|
|
c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags...)
|
2016-06-07 09:22:19 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
2016-06-08 03:34:45 +08: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 18:04:35 +08:00
|
|
|
checkLinkType(ctx, c, ccDep, t)
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
var ptr *android.Paths
|
2016-05-19 06:37:25 +08:00
|
|
|
var depPtr *android.Paths
|
2016-04-12 06:06:20 +08:00
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
linkFile := ccDep.outputFile
|
2016-10-01 08:10:16 +08:00
|
|
|
depFile := android.OptionalPath{}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
switch depTag {
|
2016-06-18 07:45:24 +08:00
|
|
|
case ndkStubDepTag, sharedDepTag, sharedExportDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
ptr = &depPaths.SharedLibs
|
|
|
|
depPtr = &depPaths.SharedLibsDeps
|
2017-09-28 08:01:44 +08:00
|
|
|
depFile = ccDep.linker.(libraryInterface).toc()
|
2017-11-28 07:48:57 +08:00
|
|
|
directSharedDeps = append(directSharedDeps, ccDep)
|
2019-01-18 13:37:08 +08:00
|
|
|
case earlySharedDepTag:
|
|
|
|
ptr = &depPaths.EarlySharedLibs
|
|
|
|
depPtr = &depPaths.EarlySharedLibsDeps
|
|
|
|
depFile = ccDep.linker.(libraryInterface).toc()
|
|
|
|
directSharedDeps = append(directSharedDeps, ccDep)
|
2016-06-18 07:45:24 +08:00
|
|
|
case lateSharedDepTag, ndkLateStubDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
ptr = &depPaths.LateSharedLibs
|
|
|
|
depPtr = &depPaths.LateSharedLibsDeps
|
2017-09-28 08:01:44 +08:00
|
|
|
depFile = ccDep.linker.(libraryInterface).toc()
|
2016-06-07 09:22:19 +08:00
|
|
|
case staticDepTag, staticExportDepTag:
|
2017-09-28 08:05:30 +08:00
|
|
|
ptr = nil
|
|
|
|
directStaticDeps = append(directStaticDeps, ccDep)
|
2016-04-12 06:06:20 +08:00
|
|
|
case lateStaticDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
ptr = &depPaths.LateStaticLibs
|
2016-04-12 06:06:20 +08:00
|
|
|
case wholeStaticDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
ptr = &depPaths.WholeStaticLibs
|
2017-09-28 08:01:44 +08:00
|
|
|
staticLib, ok := ccDep.linker.(libraryInterface)
|
2016-07-30 08:28:03 +08:00
|
|
|
if !ok || !staticLib.static() {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q not a static library", depName)
|
2016-04-12 06:06:20 +08:00
|
|
|
return
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
if missingDeps := staticLib.getWholeStaticMissingDeps(); missingDeps != nil {
|
2017-09-28 08:01:44 +08:00
|
|
|
postfix := " (required by " + ctx.OtherModuleName(dep) + ")"
|
2016-04-12 06:06:20 +08:00
|
|
|
for i := range missingDeps {
|
|
|
|
missingDeps[i] += postfix
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
ctx.AddMissingDependencies(missingDeps)
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-09-27 08:33:01 +08:00
|
|
|
depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLib.objs())
|
2016-12-14 04:50:57 +08:00
|
|
|
case headerDepTag:
|
|
|
|
// Nothing
|
2016-04-12 06:06:20 +08:00
|
|
|
case objDepTag:
|
2016-09-27 08:33:01 +08:00
|
|
|
depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
|
2016-04-12 06:06:20 +08:00
|
|
|
case crtBeginDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
depPaths.CrtBegin = linkFile
|
2016-04-12 06:06:20 +08:00
|
|
|
case crtEndDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
depPaths.CrtEnd = linkFile
|
2018-10-12 15:24:23 +08:00
|
|
|
case dynamicLinkerDepTag:
|
|
|
|
depPaths.DynamicLinker = linkFile
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
|
|
|
|
2017-09-28 08:01:44 +08:00
|
|
|
switch depTag {
|
2017-02-10 08:16:31 +08:00
|
|
|
case staticDepTag, staticExportDepTag, lateStaticDepTag:
|
2017-09-28 08:01:44 +08:00
|
|
|
staticLib, ok := ccDep.linker.(libraryInterface)
|
2017-02-10 08:16:31 +08:00
|
|
|
if !ok || !staticLib.static() {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q not a static library", depName)
|
2017-02-10 08:16:31 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// When combining coverage files for shared libraries and executables, coverage files
|
2017-02-09 05:45:53 +08:00
|
|
|
// in static libraries act as if they were whole static libraries. The same goes for
|
|
|
|
// source based Abi dump files.
|
2017-02-10 08:16:31 +08:00
|
|
|
depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
|
|
|
|
staticLib.objs().coverageFiles...)
|
2017-02-09 05:45:53 +08:00
|
|
|
depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
|
|
|
|
staticLib.objs().sAbiDumpFiles...)
|
2017-09-28 08:01:44 +08:00
|
|
|
|
2017-02-10 08:16:31 +08:00
|
|
|
}
|
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
if ptr != nil {
|
2016-10-07 07:12:58 +08:00
|
|
|
if !linkFile.Valid() {
|
2017-09-28 08:01:44 +08:00
|
|
|
ctx.ModuleErrorf("module %q missing output file", depName)
|
2016-10-07 07:12:58 +08:00
|
|
|
return
|
|
|
|
}
|
2016-10-01 08:10:16 +08:00
|
|
|
*ptr = append(*ptr, linkFile.Path())
|
|
|
|
}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
if depPtr != nil {
|
2016-10-01 08:10:16 +08:00
|
|
|
dep := depFile
|
|
|
|
if !dep.Valid() {
|
|
|
|
dep = linkFile
|
|
|
|
}
|
|
|
|
*depPtr = append(*depPtr, dep.Path())
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2017-07-18 12:23:39 +08:00
|
|
|
|
2017-12-20 01:17:32 +08:00
|
|
|
makeLibName := func(depName string) string {
|
2017-09-28 08:01:44 +08:00
|
|
|
libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
|
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 17:23:01 +08:00
|
|
|
libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
|
2017-07-18 12:23:39 +08:00
|
|
|
libName = strings.TrimPrefix(libName, "prebuilt_")
|
2017-08-03 20:22:50 +08:00
|
|
|
isLLndk := inList(libName, llndkLibraries)
|
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 17:23:01 +08:00
|
|
|
isVendorPublicLib := inList(libName, vendorPublicLibraries)
|
2017-09-28 08:01:44 +08:00
|
|
|
bothVendorAndCoreVariantsExist := ccDep.hasVendorVariant() || isLLndk
|
2018-11-13 12:19:56 +08:00
|
|
|
|
|
|
|
if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.isVndk() && !ccDep.mustUseVendorVariant() {
|
|
|
|
// The vendor module is a no-vendor-variant VNDK library. Depend on the
|
|
|
|
// core module instead.
|
|
|
|
return libName
|
|
|
|
} else if c.useVndk() && bothVendorAndCoreVariantsExist {
|
2017-09-28 08:01:44 +08:00
|
|
|
// The vendor module in Make will have been renamed to not conflict with the core
|
|
|
|
// module, so update the dependency name here accordingly.
|
2017-12-20 01:17:32 +08:00
|
|
|
return libName + vendorSuffix
|
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 17:23:01 +08:00
|
|
|
} else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
|
2017-12-20 01:17:32 +08:00
|
|
|
return libName + vendorPublicLibrarySuffix
|
2018-01-31 23:54:12 +08:00
|
|
|
} else if ccDep.inRecovery() && !ccDep.onlyInRecovery() {
|
|
|
|
return libName + recoverySuffix
|
2017-09-28 08:01:44 +08:00
|
|
|
} else {
|
2017-12-20 01:17:32 +08:00
|
|
|
return libName
|
2017-07-18 12:23:39 +08:00
|
|
|
}
|
2017-12-20 01:17:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Export the shared libs to Make.
|
|
|
|
switch depTag {
|
2019-01-18 13:37:08 +08:00
|
|
|
case sharedDepTag, sharedExportDepTag, lateSharedDepTag, earlySharedDepTag:
|
2018-12-07 22:08:36 +08:00
|
|
|
if dependentLibrary, ok := ccDep.linker.(*libraryDecorator); ok {
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-11 00:35:25 +08:00
|
|
|
if dependentLibrary.buildStubs() && android.InAnyApex(depName) {
|
2019-01-18 14:57:48 +08:00
|
|
|
// Add the dependency to the APEX(es) providing the library so that
|
2018-12-07 22:08:36 +08:00
|
|
|
// m <module> can trigger building the APEXes as well.
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-11 00:35:25 +08:00
|
|
|
for _, an := range android.GetApexesForModule(depName) {
|
2018-12-07 22:08:36 +08:00
|
|
|
c.Properties.ApexesProvidingSharedLibs = append(
|
|
|
|
c.Properties.ApexesProvidingSharedLibs, an)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-18 12:23:39 +08:00
|
|
|
// Note: the order of libs in this list is not important because
|
2017-09-28 08:01:44 +08:00
|
|
|
// they merely serve as Make dependencies and do not affect this lib itself.
|
2017-12-20 01:17:32 +08:00
|
|
|
c.Properties.AndroidMkSharedLibs = append(
|
|
|
|
c.Properties.AndroidMkSharedLibs, makeLibName(depName))
|
2019-01-14 15:35:08 +08:00
|
|
|
case ndkStubDepTag, ndkLateStubDepTag:
|
|
|
|
ndkStub := ccDep.linker.(*stubDecorator)
|
|
|
|
c.Properties.AndroidMkSharedLibs = append(
|
|
|
|
c.Properties.AndroidMkSharedLibs,
|
|
|
|
depName+"."+ndkStub.properties.ApiLevel)
|
2018-11-16 09:19:56 +08:00
|
|
|
case staticDepTag, staticExportDepTag, lateStaticDepTag:
|
|
|
|
c.Properties.AndroidMkStaticLibs = append(
|
|
|
|
c.Properties.AndroidMkStaticLibs, makeLibName(depName))
|
2017-12-20 01:17:32 +08:00
|
|
|
case runtimeDepTag:
|
|
|
|
c.Properties.AndroidMkRuntimeLibs = append(
|
|
|
|
c.Properties.AndroidMkRuntimeLibs, makeLibName(depName))
|
2018-11-16 09:19:56 +08:00
|
|
|
case wholeStaticDepTag:
|
|
|
|
c.Properties.AndroidMkWholeStaticLibs = append(
|
|
|
|
c.Properties.AndroidMkWholeStaticLibs, makeLibName(depName))
|
2017-07-18 12:23:39 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
})
|
|
|
|
|
2017-09-28 08:05:30 +08:00
|
|
|
// use the ordered dependencies as this module's dependencies
|
2017-11-28 07:48:57 +08:00
|
|
|
depPaths.StaticLibs = append(depPaths.StaticLibs, orderStaticModuleDeps(c, directStaticDeps, directSharedDeps)...)
|
2017-09-28 08:05:30 +08:00
|
|
|
|
2017-05-18 04:44:16 +08:00
|
|
|
// Dedup exported flags from dependencies
|
2017-10-25 02:13:31 +08:00
|
|
|
depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
|
2017-08-30 03:28:37 +08:00
|
|
|
depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders)
|
2017-10-25 02:13:31 +08:00
|
|
|
depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
|
2017-08-30 03:28:37 +08:00
|
|
|
depPaths.ReexportedFlagsDeps = android.FirstUniquePaths(depPaths.ReexportedFlagsDeps)
|
|
|
|
|
|
|
|
if c.sabi != nil {
|
2017-10-25 02:13:31 +08:00
|
|
|
c.sabi.Properties.ReexportedIncludeFlags = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludeFlags)
|
2017-08-30 03:28:37 +08:00
|
|
|
}
|
2017-05-18 04:44:16 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
return depPaths
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) InstallInData() bool {
|
|
|
|
if c.installer == nil {
|
|
|
|
return false
|
|
|
|
}
|
2017-03-30 13:00:18 +08: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-30 04:41:32 +08:00
|
|
|
return true
|
|
|
|
}
|
2017-03-30 13:00:18 +08:00
|
|
|
return c.installer.inSanitizerDir()
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2018-01-31 23:54:12 +08:00
|
|
|
func (c *Module) InstallInRecovery() bool {
|
|
|
|
return c.inRecovery()
|
|
|
|
}
|
|
|
|
|
2016-09-29 07:18:03 +08:00
|
|
|
func (c *Module) HostToolPath() android.OptionalPath {
|
|
|
|
if c.installer == nil {
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
return c.installer.hostToolPath()
|
|
|
|
}
|
|
|
|
|
2017-07-13 03:55:28 +08:00
|
|
|
func (c *Module) IntermPathForModuleOut() android.OptionalPath {
|
|
|
|
return c.outputFile
|
|
|
|
}
|
|
|
|
|
2017-09-14 09:37:08 +08:00
|
|
|
func (c *Module) Srcs() android.Paths {
|
|
|
|
if c.outputFile.Valid() {
|
|
|
|
return android.Paths{c.outputFile.Path()}
|
|
|
|
}
|
|
|
|
return android.Paths{}
|
|
|
|
}
|
|
|
|
|
2017-11-01 17:20:21 +08:00
|
|
|
func (c *Module) static() bool {
|
|
|
|
if static, ok := c.linker.(interface {
|
|
|
|
static() bool
|
|
|
|
}); ok {
|
|
|
|
return static.static()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-12-19 01:47:14 +08:00
|
|
|
func (c *Module) staticBinary() bool {
|
|
|
|
if static, ok := c.linker.(interface {
|
|
|
|
staticBinary() bool
|
|
|
|
}); ok {
|
|
|
|
return static.staticBinary()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-09-05 07:28:17 +08:00
|
|
|
func (c *Module) getMakeLinkType() string {
|
|
|
|
if c.useVndk() {
|
|
|
|
if inList(c.Name(), vndkCoreLibraries) || inList(c.Name(), vndkSpLibraries) || inList(c.Name(), llndkLibraries) {
|
|
|
|
if inList(c.Name(), vndkPrivateLibraries) {
|
|
|
|
return "native:vndk_private"
|
|
|
|
} else {
|
|
|
|
return "native:vndk"
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return "native:vendor"
|
|
|
|
}
|
|
|
|
} else if c.inRecovery() {
|
|
|
|
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)
|
2018-11-13 12:19:56 +08:00
|
|
|
} else if inList(c.Name(), vndkUsingCoreVariantLibraries) {
|
|
|
|
return "native:platform_vndk"
|
2018-09-05 07:28:17 +08:00
|
|
|
} else {
|
|
|
|
return "native:platform"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-02 23:38:19 +08:00
|
|
|
// Overrides ApexModule.IsInstallabeToApex()
|
|
|
|
// Only shared libraries are installable to APEX.
|
|
|
|
func (c *Module) IsInstallableToApex() bool {
|
|
|
|
if shared, ok := c.linker.(interface {
|
|
|
|
shared() bool
|
|
|
|
}); ok {
|
|
|
|
return shared.shared()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-01-29 10:15:04 +08:00
|
|
|
func (c *Module) imageVariation() string {
|
|
|
|
variation := "core"
|
|
|
|
if c.useVndk() {
|
|
|
|
variation = "vendor"
|
|
|
|
} else if c.inRecovery() {
|
|
|
|
variation = "recovery"
|
|
|
|
}
|
|
|
|
return variation
|
|
|
|
}
|
|
|
|
|
2019-03-04 06:58:15 +08:00
|
|
|
func (c *Module) IDEInfo(dpInfo *android.IdeInfo) {
|
|
|
|
dpInfo.Srcs = append(dpInfo.Srcs, c.Srcs().Strings()...)
|
|
|
|
}
|
|
|
|
|
2016-07-30 03:48:20 +08:00
|
|
|
//
|
|
|
|
// Defaults
|
|
|
|
//
|
|
|
|
type Defaults struct {
|
|
|
|
android.ModuleBase
|
2017-07-08 05:33:33 +08:00
|
|
|
android.DefaultsModuleBase
|
2018-10-02 23:38:19 +08:00
|
|
|
android.ApexModuleBase
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2016-07-30 03:48:20 +08:00
|
|
|
func (*Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
2016-04-21 05:21:14 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2019-03-20 08:00:29 +08: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 06:06:31 +08:00
|
|
|
func defaultsFactory() android.Module {
|
2016-08-19 05:18:32 +08:00
|
|
|
return DefaultsFactory()
|
|
|
|
}
|
|
|
|
|
2017-06-24 06:06:31 +08:00
|
|
|
func DefaultsFactory(props ...interface{}) android.Module {
|
2016-07-30 03:48:20 +08:00
|
|
|
module := &Defaults{}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2017-06-24 06:06:31 +08:00
|
|
|
module.AddProperties(props...)
|
|
|
|
module.AddProperties(
|
2016-07-30 03:48:20 +08:00
|
|
|
&BaseProperties{},
|
2017-09-14 09:37:08 +08:00
|
|
|
&VendorProperties{},
|
2016-07-30 03:48:20 +08:00
|
|
|
&BaseCompilerProperties{},
|
|
|
|
&BaseLinkerProperties{},
|
2016-07-30 08:28:03 +08:00
|
|
|
&LibraryProperties{},
|
2016-07-30 03:48:20 +08:00
|
|
|
&FlagExporterProperties{},
|
|
|
|
&BinaryLinkerProperties{},
|
2016-07-30 08:28:03 +08:00
|
|
|
&TestProperties{},
|
|
|
|
&TestBinaryProperties{},
|
2016-07-30 03:48:20 +08:00
|
|
|
&StlProperties{},
|
|
|
|
&SanitizeProperties{},
|
|
|
|
&StripProperties{},
|
2016-09-02 04:45:39 +08:00
|
|
|
&InstallerProperties{},
|
2016-09-27 06:45:04 +08:00
|
|
|
&TidyProperties{},
|
2017-02-10 08:16:31 +08:00
|
|
|
&CoverageProperties{},
|
2017-02-09 05:45:53 +08:00
|
|
|
&SAbiProperties{},
|
2017-07-26 13:22:10 +08:00
|
|
|
&VndkProperties{},
|
2017-05-10 06:44:35 +08:00
|
|
|
<OProperties{},
|
2017-09-01 14:38:27 +08:00
|
|
|
&PgoProperties{},
|
2018-11-22 00:59:37 +08:00
|
|
|
&XomProperties{},
|
2018-03-09 05:27:59 +08:00
|
|
|
&android.ProtoProperties{},
|
2016-08-19 05:18:32 +08:00
|
|
|
)
|
2016-04-21 05:21:14 +08:00
|
|
|
|
2017-07-08 05:33:33 +08:00
|
|
|
android.InitDefaultsModule(module)
|
2018-10-02 23:38:19 +08:00
|
|
|
android.InitApexModule(module)
|
2017-06-24 06:06:31 +08:00
|
|
|
|
|
|
|
return module
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
|
|
|
|
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-07 03:43:22 +08:00
|
|
|
const (
|
|
|
|
// coreMode is the variant used for framework-private libraries, or
|
|
|
|
// SDK libraries. (which framework-private libraries can use)
|
|
|
|
coreMode = "core"
|
|
|
|
|
|
|
|
// vendorMode is the variant used for /vendor code that compiles
|
|
|
|
// against the VNDK.
|
|
|
|
vendorMode = "vendor"
|
2018-01-31 23:54:12 +08:00
|
|
|
|
|
|
|
recoveryMode = "recovery"
|
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-07 03:43:22 +08: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 22:05:00 +08: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...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-31 23:54:12 +08: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...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-19 16:12:36 +08:00
|
|
|
func ImageMutator(mctx android.BottomUpMutatorContext) {
|
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-07 03:43:22 +08:00
|
|
|
if mctx.Os() != android.Android {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
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 21:25:07 +08:00
|
|
|
if g, ok := mctx.Module().(*genrule.Module); ok {
|
|
|
|
if props, ok := g.Extra.(*GenruleExtraProperties); ok {
|
2018-05-24 12:36:56 +08:00
|
|
|
var coreVariantNeeded bool = false
|
|
|
|
var vendorVariantNeeded bool = false
|
|
|
|
var recoveryVariantNeeded bool = false
|
Install VNDK snapshot libraries for system build
When BOARD_VNDK_VERSION := <VNDK version>, or
PRODUCT_EXTRA_VNDK_VERSIONS includes the needed <VNDK version> list,
the prebuilt VNDK libs in prebuilts/vndk/ directory will be
installed.
Each prebuilt VNDK module uses "vndk_prebuilt_shared" for shared
VNDK/VNDK-SP libs.
Following is the sample configuration of a vndk snapshot module:
vndk_prebuilt_shared {
name: "libfoo",
version: "27",
vendor_available: true,
vndk: {
enabled: true,
},
arch: {
arm64: {
srcs: ["arm/lib64/libfoo.so"],
},
arm: {
srcs: ["arm/lib/libfoo.so"],
},
},
}
The Android.bp for the snapshot modules will be auto-generated by a
script.
Bug: 38304393
Bug: 65377115
Bug: 68123344
Test: set BOARD_VNDK_VERSION := 27
copy a snapshot for v27
build with make command
Change-Id: Ib93107530dbabb4a24583f4d6e4f0c513c9adfec
2017-11-17 11:10:28 +08:00
|
|
|
if mctx.DeviceConfig().VndkVersion() == "" {
|
2018-05-24 12:36:56 +08:00
|
|
|
coreVariantNeeded = true
|
2017-09-14 09:37:08 +08:00
|
|
|
} else if Bool(props.Vendor_available) {
|
2018-05-24 12:36:56 +08:00
|
|
|
coreVariantNeeded = true
|
|
|
|
vendorVariantNeeded = true
|
2017-11-08 15:03:48 +08:00
|
|
|
} else if mctx.SocSpecific() || mctx.DeviceSpecific() {
|
2018-05-24 12:36:56 +08:00
|
|
|
vendorVariantNeeded = true
|
2017-09-14 09:37:08 +08:00
|
|
|
} else {
|
2018-05-24 12:36:56 +08:00
|
|
|
coreVariantNeeded = true
|
2017-09-14 09:37:08 +08:00
|
|
|
}
|
2018-05-24 12:36:56 +08:00
|
|
|
if Bool(props.Recovery_available) {
|
|
|
|
recoveryVariantNeeded = true
|
|
|
|
}
|
|
|
|
|
2018-06-19 00:46:06 +08:00
|
|
|
if recoveryVariantNeeded {
|
2018-07-07 17:02:07 +08:00
|
|
|
primaryArch := mctx.Config().DevicePrimaryArchType()
|
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 21:25:07 +08:00
|
|
|
moduleArch := g.Target().Arch.ArchType
|
2018-07-07 17:02:07 +08:00
|
|
|
if moduleArch != primaryArch {
|
2018-06-19 00:46:06 +08:00
|
|
|
recoveryVariantNeeded = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-24 12:36:56 +08:00
|
|
|
var variants []string
|
|
|
|
if coreVariantNeeded {
|
|
|
|
variants = append(variants, coreMode)
|
|
|
|
}
|
|
|
|
if vendorVariantNeeded {
|
|
|
|
variants = append(variants, vendorMode)
|
|
|
|
}
|
|
|
|
if recoveryVariantNeeded {
|
|
|
|
variants = append(variants, recoveryMode)
|
|
|
|
}
|
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 21:25:07 +08:00
|
|
|
mod := mctx.CreateVariations(variants...)
|
|
|
|
for i, v := range variants {
|
|
|
|
if v == recoveryMode {
|
|
|
|
m := mod[i].(*genrule.Module)
|
|
|
|
m.Extra.(*GenruleExtraProperties).InRecovery = true
|
|
|
|
}
|
|
|
|
}
|
2017-09-14 09:37:08 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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-07 03:43:22 +08:00
|
|
|
m, ok := mctx.Module().(*Module)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sanity check
|
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 18:04:35 +08:00
|
|
|
vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific()
|
2018-11-28 14:14:47 +08:00
|
|
|
productSpecific := mctx.ProductSpecific()
|
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 18:04:35 +08:00
|
|
|
|
|
|
|
if m.VendorProperties.Vendor_available != nil && vendorSpecific {
|
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-07 03:43:22 +08:00
|
|
|
mctx.PropertyErrorf("vendor_available",
|
2017-11-08 15:03:48 +08:00
|
|
|
"doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific: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-07 03:43:22 +08:00
|
|
|
return
|
|
|
|
}
|
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 18:04:35 +08:00
|
|
|
|
|
|
|
if vndkdep := m.vndkdep; vndkdep != nil {
|
|
|
|
if vndkdep.isVndk() {
|
2018-11-28 14:14:47 +08:00
|
|
|
if productSpecific {
|
|
|
|
mctx.PropertyErrorf("product_specific",
|
|
|
|
"product_specific must not be true when `vndk: {enabled: true}`")
|
|
|
|
return
|
|
|
|
}
|
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 18:04:35 +08:00
|
|
|
if vendorSpecific {
|
|
|
|
if !vndkdep.isVndkExt() {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"must set `extends: \"...\"` to vndk extension")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if vndkdep.isVndkExt() {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"must set `vendor: true` to set `extends: %q`",
|
|
|
|
m.getVndkExtendsModuleName())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if m.VendorProperties.Vendor_available == nil {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"vendor_available must be set to either true or false when `vndk: {enabled: true}`")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if vndkdep.isVndkSp() {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"must set `enabled: true` to set `support_system_process: true`")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if vndkdep.isVndkExt() {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"must set `enabled: true` to set `extends: %q`",
|
|
|
|
m.getVndkExtendsModuleName())
|
|
|
|
return
|
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
}
|
|
|
|
}
|
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-07 03:43:22 +08:00
|
|
|
|
2018-01-31 23:54:12 +08:00
|
|
|
var coreVariantNeeded bool = false
|
|
|
|
var vendorVariantNeeded bool = false
|
|
|
|
var recoveryVariantNeeded bool = false
|
|
|
|
|
Install VNDK snapshot libraries for system build
When BOARD_VNDK_VERSION := <VNDK version>, or
PRODUCT_EXTRA_VNDK_VERSIONS includes the needed <VNDK version> list,
the prebuilt VNDK libs in prebuilts/vndk/ directory will be
installed.
Each prebuilt VNDK module uses "vndk_prebuilt_shared" for shared
VNDK/VNDK-SP libs.
Following is the sample configuration of a vndk snapshot module:
vndk_prebuilt_shared {
name: "libfoo",
version: "27",
vendor_available: true,
vndk: {
enabled: true,
},
arch: {
arm64: {
srcs: ["arm/lib64/libfoo.so"],
},
arm: {
srcs: ["arm/lib/libfoo.so"],
},
},
}
The Android.bp for the snapshot modules will be auto-generated by a
script.
Bug: 38304393
Bug: 65377115
Bug: 68123344
Test: set BOARD_VNDK_VERSION := 27
copy a snapshot for v27
build with make command
Change-Id: Ib93107530dbabb4a24583f4d6e4f0c513c9adfec
2017-11-17 11:10:28 +08:00
|
|
|
if mctx.DeviceConfig().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-07 03:43:22 +08:00
|
|
|
// If the device isn't compiling against the VNDK, we always
|
|
|
|
// use the core mode.
|
2018-01-31 23:54:12 +08:00
|
|
|
coreVariantNeeded = 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-07 03:43:22 +08:00
|
|
|
} else if _, ok := m.linker.(*llndkStubDecorator); ok {
|
|
|
|
// LL-NDK stubs only exist in the vendor variant, since the
|
|
|
|
// real libraries will be used in the core variant.
|
2018-01-31 23:54:12 +08:00
|
|
|
vendorVariantNeeded = true
|
2017-10-19 14:59:33 +08:00
|
|
|
} else if _, ok := m.linker.(*llndkHeadersDecorator); ok {
|
|
|
|
// ... and LL-NDK headers as well
|
2018-01-31 23:54:12 +08:00
|
|
|
vendorVariantNeeded = true
|
2018-01-23 11:07:46 +08:00
|
|
|
} else if _, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
Install VNDK snapshot libraries for system build
When BOARD_VNDK_VERSION := <VNDK version>, or
PRODUCT_EXTRA_VNDK_VERSIONS includes the needed <VNDK version> list,
the prebuilt VNDK libs in prebuilts/vndk/ directory will be
installed.
Each prebuilt VNDK module uses "vndk_prebuilt_shared" for shared
VNDK/VNDK-SP libs.
Following is the sample configuration of a vndk snapshot module:
vndk_prebuilt_shared {
name: "libfoo",
version: "27",
vendor_available: true,
vndk: {
enabled: true,
},
arch: {
arm64: {
srcs: ["arm/lib64/libfoo.so"],
},
arm: {
srcs: ["arm/lib/libfoo.so"],
},
},
}
The Android.bp for the snapshot modules will be auto-generated by a
script.
Bug: 38304393
Bug: 65377115
Bug: 68123344
Test: set BOARD_VNDK_VERSION := 27
copy a snapshot for v27
build with make command
Change-Id: Ib93107530dbabb4a24583f4d6e4f0c513c9adfec
2017-11-17 11:10:28 +08:00
|
|
|
// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
|
|
|
|
// PRODUCT_EXTRA_VNDK_VERSIONS.
|
2018-01-31 23:54:12 +08:00
|
|
|
vendorVariantNeeded = true
|
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 18:04:35 +08:00
|
|
|
} else if m.hasVendorVariant() && !vendorSpecific {
|
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-07 03:43:22 +08:00
|
|
|
// This will be available in both /system and /vendor
|
2017-06-23 18:24:43 +08:00
|
|
|
// or a /system directory that is available to vendor.
|
2018-01-31 23:54:12 +08:00
|
|
|
coreVariantNeeded = true
|
|
|
|
vendorVariantNeeded = true
|
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 18:04:35 +08:00
|
|
|
} else if vendorSpecific && String(m.Properties.Sdk_version) == "" {
|
2017-11-08 15:03:48 +08:00
|
|
|
// This will be available in /vendor (or /odm) only
|
2018-01-31 23:54:12 +08:00
|
|
|
vendorVariantNeeded = 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-07 03:43:22 +08:00
|
|
|
} else {
|
|
|
|
// This is either in /system (or similar: /data), or is a
|
|
|
|
// modules built with the NDK. Modules built with the NDK
|
|
|
|
// will be restricted using the existing link type checks.
|
2018-01-31 23:54:12 +08:00
|
|
|
coreVariantNeeded = true
|
|
|
|
}
|
|
|
|
|
|
|
|
if Bool(m.Properties.Recovery_available) {
|
|
|
|
recoveryVariantNeeded = true
|
|
|
|
}
|
|
|
|
|
|
|
|
if m.ModuleBase.InstallInRecovery() {
|
|
|
|
recoveryVariantNeeded = true
|
|
|
|
coreVariantNeeded = false
|
|
|
|
}
|
|
|
|
|
2018-06-19 00:46:06 +08:00
|
|
|
if recoveryVariantNeeded {
|
2018-07-07 17:02:07 +08:00
|
|
|
primaryArch := mctx.Config().DevicePrimaryArchType()
|
|
|
|
moduleArch := m.Target().Arch.ArchType
|
|
|
|
if moduleArch != primaryArch {
|
2018-06-19 00:46:06 +08:00
|
|
|
recoveryVariantNeeded = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-31 23:54:12 +08:00
|
|
|
var variants []string
|
|
|
|
if coreVariantNeeded {
|
|
|
|
variants = append(variants, coreMode)
|
|
|
|
}
|
|
|
|
if vendorVariantNeeded {
|
|
|
|
variants = append(variants, vendorMode)
|
|
|
|
}
|
|
|
|
if recoveryVariantNeeded {
|
|
|
|
variants = append(variants, recoveryMode)
|
|
|
|
}
|
|
|
|
mod := mctx.CreateVariations(variants...)
|
|
|
|
for i, v := range variants {
|
|
|
|
if v == vendorMode {
|
|
|
|
m := mod[i].(*Module)
|
|
|
|
m.Properties.UseVndk = true
|
|
|
|
squashVendorSrcs(m)
|
|
|
|
} else if v == recoveryMode {
|
|
|
|
m := mod[i].(*Module)
|
|
|
|
m.Properties.InRecovery = true
|
2018-08-28 08:55:37 +08:00
|
|
|
m.MakeAsPlatform()
|
2018-01-31 23:54:12 +08:00
|
|
|
squashRecoverySrcs(m)
|
|
|
|
}
|
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-07 03:43:22 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-10 01:21:52 +08:00
|
|
|
func getCurrentNdkPrebuiltVersion(ctx DepsContext) string {
|
2017-11-29 16:27:14 +08:00
|
|
|
if ctx.Config().PlatformSdkVersionInt() > config.NdkMaxPrebuiltVersionInt {
|
2017-05-10 01:21:52 +08:00
|
|
|
return strconv.Itoa(config.NdkMaxPrebuiltVersionInt)
|
|
|
|
}
|
2017-11-29 16:27:14 +08:00
|
|
|
return ctx.Config().PlatformSdkVersion()
|
2017-05-10 01:21:52 +08:00
|
|
|
}
|
|
|
|
|
2015-10-29 08:23:31 +08:00
|
|
|
var Bool = proptools.Bool
|
2018-04-11 07:14:46 +08:00
|
|
|
var BoolDefault = proptools.BoolDefault
|
2017-11-08 02:57:05 +08:00
|
|
|
var BoolPtr = proptools.BoolPtr
|
|
|
|
var String = proptools.String
|
|
|
|
var StringPtr = proptools.StringPtr
|