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) {
|
|
|
|
ctx.BottomUp("link", linkageMutator).Parallel()
|
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
|
|
|
ctx.BottomUp("image", vendorMutator).Parallel()
|
2016-10-13 05:38:15 +08:00
|
|
|
ctx.BottomUp("ndk_api", ndkApiMutator).Parallel()
|
|
|
|
ctx.BottomUp("test_per_src", testPerSrcMutator).Parallel()
|
|
|
|
ctx.BottomUp("begin", beginMutator).Parallel()
|
|
|
|
})
|
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
|
|
|
|
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
|
|
|
|
|
|
|
ctx.BottomUp("coverage", coverageLinkingMutator).Parallel()
|
2017-02-09 05:45:53 +08:00
|
|
|
ctx.TopDown("vndk_deps", sabiDepsMutator)
|
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
|
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
|
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
|
|
|
|
SharedLibs, LateSharedLibs android.Paths
|
|
|
|
// Paths to the dependencies to use for .so files (.so.toc files)
|
|
|
|
SharedLibsDeps, LateSharedLibsDeps android.Paths
|
|
|
|
// 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
|
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
|
|
|
|
protoFlags []string // Flags that apply to proto 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
|
2015-04-23 04:07:53 +08:00
|
|
|
Clang bool
|
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
|
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
CFlagsDeps android.Paths // Files depended on by compiler flags
|
2016-12-02 06:45:23 +08:00
|
|
|
|
|
|
|
GroupStaticLibs 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"`
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
// Properties used to compile all C or C++ modules
|
|
|
|
type BaseProperties struct {
|
|
|
|
// compile module with clang instead of gcc
|
|
|
|
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
|
|
|
|
Sdk_version string
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
// don't insert default compiler flags into asflags, cflags,
|
|
|
|
// cppflags, conlyflags, ldflags, or include_dirs
|
|
|
|
No_default_compiler_flags *bool
|
2016-04-12 06:06:20 +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
|
|
|
// whether this module should be allowed to install onto /vendor as
|
|
|
|
// well as /system. The 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.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
|
|
|
// Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
|
|
|
|
Vendor_available *bool
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
AndroidMkSharedLibs []string `blueprint:"mutated"`
|
2016-05-25 06:39:04 +08:00
|
|
|
HideFromMake bool `blueprint:"mutated"`
|
2016-09-20 07:46:53 +08:00
|
|
|
PreventInstall bool `blueprint:"mutated"`
|
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
|
|
|
|
|
|
|
UseVndk bool `blueprint:"mutated"`
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type UnusedProperties struct {
|
2017-02-10 08:16:31 +08:00
|
|
|
Tags []string
|
2015-11-03 08:43:11 +08:00
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
type ModuleContextIntf interface {
|
|
|
|
static() bool
|
|
|
|
staticBinary() bool
|
|
|
|
clang() bool
|
2016-07-30 04:44:28 +08:00
|
|
|
toolchain() config.Toolchain
|
2016-01-05 06:34:37 +08:00
|
|
|
noDefaultCompilerFlags() bool
|
|
|
|
sdk() bool
|
|
|
|
sdkVersion() string
|
2016-11-19 06:54:24 +08:00
|
|
|
vndk() bool
|
2017-06-23 18:24:43 +08:00
|
|
|
isVndk() bool
|
|
|
|
isVndkSp() bool
|
2017-02-09 05:45:53 +08:00
|
|
|
createVndkSourceAbiDump() bool
|
2016-03-31 12:00:30 +08:00
|
|
|
selectedStl() string
|
2016-10-07 07:12:58 +08:00
|
|
|
baseModuleName() string
|
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
|
2016-08-02 04:20:05 +08:00
|
|
|
compilerFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
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{}
|
|
|
|
|
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)
|
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
|
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
|
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}
|
|
|
|
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"}
|
|
|
|
reuseObjTag = dependencyTag{name: "reuse objects"}
|
|
|
|
ndkStubDepTag = dependencyTag{name: "ndk stub", library: true}
|
|
|
|
ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true}
|
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
|
2015-04-25 08:31:52 +08:00
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
Properties BaseProperties
|
|
|
|
unused UnusedProperties
|
|
|
|
|
|
|
|
// 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
|
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
|
2015-03-18 06:06:21 +08:00
|
|
|
}
|
|
|
|
|
2017-06-24 06:06:31 +08:00
|
|
|
func (c *Module) Init() android.Module {
|
|
|
|
c.AddProperties(&c.Properties, &c.unused)
|
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()...)
|
|
|
|
}
|
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
|
|
|
|
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
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
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
|
|
|
func (c *Module) vndk() bool {
|
|
|
|
return c.Properties.UseVndk
|
|
|
|
}
|
|
|
|
|
2017-06-23 18:24:43 +08:00
|
|
|
func (c *Module) isVndk() bool {
|
|
|
|
if c.vndkdep != nil {
|
|
|
|
return c.vndkdep.isVndk()
|
|
|
|
}
|
|
|
|
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-06-23 18:24:43 +08:00
|
|
|
// Vendor returns true for vendor modules excluding VNDK libraries so that
|
|
|
|
// they get installed onto the correct partition
|
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
|
|
|
func (ctx *moduleContext) Vendor() bool {
|
2017-06-23 18:24:43 +08:00
|
|
|
return ctx.ModuleContext.Vendor() || (ctx.mod.vndk() && !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
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) clang() bool {
|
|
|
|
return ctx.mod.clang(ctx.ctx)
|
|
|
|
}
|
|
|
|
|
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 {
|
2016-07-30 08:28:03 +08:00
|
|
|
if static, ok := ctx.mod.linker.(interface {
|
|
|
|
static() bool
|
|
|
|
}); ok {
|
|
|
|
return static.static()
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
2016-07-30 08:28:03 +08:00
|
|
|
return false
|
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 {
|
2016-07-30 08:28:03 +08:00
|
|
|
if static, ok := ctx.mod.linker.(interface {
|
|
|
|
staticBinary() bool
|
|
|
|
}); ok {
|
|
|
|
return static.staticBinary()
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
2016-07-30 08:28:03 +08:00
|
|
|
return false
|
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) noDefaultCompilerFlags() bool {
|
|
|
|
return Bool(ctx.mod.Properties.No_default_compiler_flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) sdk() 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
|
|
|
if ctx.ctx.Device() && !ctx.vndk() {
|
2016-06-08 03:34:45 +08:00
|
|
|
return ctx.mod.Properties.Sdk_version != ""
|
|
|
|
}
|
|
|
|
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-03-20 09:30:37 +08:00
|
|
|
if ctx.vndk() {
|
|
|
|
return "current"
|
2016-11-19 06:54:24 +08:00
|
|
|
} else {
|
|
|
|
return ctx.mod.Properties.Sdk_version
|
|
|
|
}
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
|
|
|
return ""
|
2016-01-05 06:34:37 +08:00
|
|
|
}
|
|
|
|
|
2016-11-19 06:54:24 +08:00
|
|
|
func (ctx *moduleContextImpl) vndk() 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 ctx.mod.vndk()
|
2016-11-19 06:54:24 +08:00
|
|
|
}
|
|
|
|
|
2017-06-23 18:24:43 +08:00
|
|
|
func (ctx *moduleContextImpl) isVndk() bool {
|
|
|
|
return ctx.mod.isVndk()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContextImpl) isVndkSp() bool {
|
|
|
|
if vndk := ctx.mod.vndkdep; vndk != nil {
|
|
|
|
return vndk.isVndkSp()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2017-02-09 05:45:53 +08:00
|
|
|
// Create source abi dumps if the module belongs to the list of VndkLibraries.
|
|
|
|
func (ctx *moduleContextImpl) createVndkSourceAbiDump() bool {
|
2017-06-23 18:24:43 +08:00
|
|
|
return ctx.ctx.Device() && (ctx.mod.isVndk() || inList(ctx.baseModuleName(), config.LLndkLibraries()))
|
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 ""
|
|
|
|
}
|
|
|
|
|
2016-10-07 07:12:58 +08:00
|
|
|
func (ctx *moduleContextImpl) baseModuleName() string {
|
|
|
|
return ctx.mod.ModuleBase.BaseModuleName()
|
|
|
|
}
|
|
|
|
|
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{}
|
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
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
|
|
|
flags := Flags{
|
|
|
|
Toolchain: c.toolchain(ctx),
|
|
|
|
Clang: c.clang(ctx),
|
2015-01-31 09:27:36 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
if c.compiler != nil {
|
2016-08-02 04:20:05 +08:00
|
|
|
flags = c.compiler.compilerFlags(ctx, flags)
|
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)
|
|
|
|
}
|
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
|
|
|
deps := c.depsToPaths(ctx)
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
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)
|
2016-10-07 07:12:58 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-10-07 07:12:58 +08:00
|
|
|
if c.installer != nil && !c.Properties.PreventInstall && c.outputFile.Valid() {
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2016-07-30 04:44:28 +08:00
|
|
|
func (c *Module) toolchain(ctx BaseModuleContext) 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)
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
for _, feature := range c.features {
|
|
|
|
feature.begin(ctx)
|
|
|
|
}
|
2016-08-06 07:37:52 +08:00
|
|
|
if ctx.sdk() {
|
|
|
|
version, err := normalizeNdkApiLevel(ctx.sdkVersion(), ctx.Arch())
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version", err.Error())
|
|
|
|
}
|
2016-11-09 06:34:24 +08:00
|
|
|
c.Properties.Sdk_version = 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
|
|
|
}
|
|
|
|
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)
|
|
|
|
}
|
2017-02-10 08:16:31 +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)
|
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
for _, feature := range c.features {
|
|
|
|
deps = feature.deps(ctx, deps)
|
|
|
|
}
|
|
|
|
|
|
|
|
deps.WholeStaticLibs = lastUniqueElements(deps.WholeStaticLibs)
|
|
|
|
deps.StaticLibs = lastUniqueElements(deps.StaticLibs)
|
|
|
|
deps.LateStaticLibs = lastUniqueElements(deps.LateStaticLibs)
|
|
|
|
deps.SharedLibs = lastUniqueElements(deps.SharedLibs)
|
|
|
|
deps.LateSharedLibs = lastUniqueElements(deps.LateSharedLibs)
|
2016-12-14 04:50:57 +08:00
|
|
|
deps.HeaderLibs = lastUniqueElements(deps.HeaderLibs)
|
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
|
|
|
}
|
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|
|
|
if !c.Enabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
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-07-12 07:11:59 +08:00
|
|
|
c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, deps.SharedLibs...)
|
|
|
|
c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, deps.LateSharedLibs...)
|
2016-07-09 14:23:48 +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()
|
|
|
|
|
|
|
|
// Rewrites the names of shared libraries into the names of the NDK
|
|
|
|
// libraries where appropriate. This returns two slices.
|
|
|
|
//
|
|
|
|
// The first is a list of non-variant shared libraries (either rewritten
|
|
|
|
// NDK libraries to the modules in prebuilts/ndk, or not rewritten
|
|
|
|
// because they are not NDK libraries).
|
|
|
|
//
|
|
|
|
// The second is a list of ndk_library modules. These need to be
|
|
|
|
// separated because they are a variation dependency and must be added
|
|
|
|
// in a different manner.
|
|
|
|
rewriteNdkLibs := func(list []string) ([]string, []string) {
|
|
|
|
variantLibs := []string{}
|
|
|
|
nonvariantLibs := []string{}
|
|
|
|
for _, entry := range list {
|
2017-03-20 04:44:32 +08:00
|
|
|
if ctx.sdk() && inList(entry, ndkPrebuiltSharedLibraries) {
|
2016-06-18 07:45:24 +08:00
|
|
|
if !inList(entry, ndkMigratedLibs) {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, entry+".ndk."+version)
|
|
|
|
} else {
|
|
|
|
variantLibs = append(variantLibs, entry+ndkLibrarySuffix)
|
|
|
|
}
|
2017-03-20 04:44:32 +08:00
|
|
|
} else if ctx.vndk() && inList(entry, config.LLndkLibraries()) {
|
|
|
|
nonvariantLibs = append(nonvariantLibs, entry+llndkLibrarySuffix)
|
2016-06-18 07:45:24 +08:00
|
|
|
} else {
|
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
|
|
|
|
2016-12-15 23:39:51 +08:00
|
|
|
for _, lib := range deps.HeaderLibs {
|
|
|
|
depTag := headerDepTag
|
|
|
|
if inList(lib, deps.ReexportHeaderLibHeaders) {
|
|
|
|
depTag = headerExportDepTag
|
|
|
|
}
|
|
|
|
actx.AddVariationDependencies(nil, depTag, lib)
|
|
|
|
}
|
2016-12-14 04:50:57 +08:00
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, wholeStaticDepTag,
|
|
|
|
deps.WholeStaticLibs...)
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-06-07 09:22:19 +08:00
|
|
|
for _, lib := range deps.StaticLibs {
|
|
|
|
depTag := staticDepTag
|
|
|
|
if inList(lib, deps.ReexportStaticLibHeaders) {
|
|
|
|
depTag = staticExportDepTag
|
|
|
|
}
|
2016-07-15 05:49:58 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, depTag, lib)
|
2016-06-07 09:22:19 +08:00
|
|
|
}
|
2015-03-25 05:15:58 +08:00
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, lateStaticDepTag,
|
|
|
|
deps.LateStaticLibs...)
|
2015-03-25 05:15:58 +08:00
|
|
|
|
2016-06-07 09:22:19 +08:00
|
|
|
for _, lib := range deps.SharedLibs {
|
|
|
|
depTag := sharedDepTag
|
|
|
|
if inList(lib, deps.ReexportSharedLibHeaders) {
|
|
|
|
depTag = sharedExportDepTag
|
|
|
|
}
|
2016-07-15 05:49:58 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, depTag, lib)
|
2016-06-07 09:22:19 +08:00
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, lateSharedDepTag,
|
|
|
|
deps.LateSharedLibs...)
|
2016-04-12 05:37:39 +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
|
|
|
|
2016-07-09 01:41:41 +08:00
|
|
|
actx.AddDependency(c, objDepTag, deps.ObjFiles...)
|
2016-04-12 06:06:20 +08:00
|
|
|
|
|
|
|
if deps.CrtBegin != "" {
|
2016-07-09 01:41:41 +08:00
|
|
|
actx.AddDependency(c, crtBeginDepTag, deps.CrtBegin)
|
2015-03-25 05:15:58 +08:00
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
if deps.CrtEnd != "" {
|
2016-07-09 01:41:41 +08:00
|
|
|
actx.AddDependency(c, crtEndDepTag, deps.CrtEnd)
|
2015-03-25 05:15:58 +08:00
|
|
|
}
|
2016-06-18 07:45:24 +08:00
|
|
|
|
|
|
|
version := ctx.sdkVersion()
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{"ndk_api", version}, {"link", "shared"}}, ndkStubDepTag, variantNdkLibs...)
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{"ndk_api", version}, {"link", "shared"}}, ndkLateStubDepTag, variantLateNdkLibs...)
|
2015-10-30 06:25:03 +08:00
|
|
|
}
|
2015-01-31 09:27:36 +08:00
|
|
|
|
2016-08-05 04:02:36 +08:00
|
|
|
func beginMutator(ctx android.BottomUpMutatorContext) {
|
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
|
|
|
|
c.beginMutator(ctx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-05 06:34:37 +08:00
|
|
|
func (c *Module) clang(ctx BaseModuleContext) bool {
|
|
|
|
clang := Bool(c.Properties.Clang)
|
|
|
|
|
|
|
|
if c.Properties.Clang == nil {
|
|
|
|
if ctx.Host() {
|
|
|
|
clang = true
|
|
|
|
}
|
|
|
|
|
|
|
|
if ctx.Device() && ctx.AConfig().DeviceUsesClang() {
|
|
|
|
clang = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !c.toolchain(ctx).ClangSupported() {
|
|
|
|
clang = false
|
|
|
|
}
|
|
|
|
|
|
|
|
return clang
|
|
|
|
}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
// Convert dependencies to paths. Returns a PathDeps containing paths
|
2016-05-19 06:37:25 +08:00
|
|
|
func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
2016-04-12 06:06:20 +08:00
|
|
|
var depPaths PathDeps
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-06-08 03:34:45 +08:00
|
|
|
// Whether a module can link to another module, taking into
|
|
|
|
// account NDK linking.
|
2016-08-04 05:12:14 +08:00
|
|
|
checkLinkType := func(from, to *Module) {
|
2016-06-08 03:34:45 +08:00
|
|
|
if from.Target().Os != android.Android {
|
|
|
|
// Host code is not restricted
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
2016-06-08 03:34:45 +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
|
|
|
if from.Properties.UseVndk {
|
2017-06-23 18:24:43 +08:00
|
|
|
// Though vendor code is limited by the vendor mutator,
|
|
|
|
// each vendor-available module needs to check
|
|
|
|
// link-type for VNDK.
|
|
|
|
if from.vndkdep != nil {
|
|
|
|
from.vndkdep.vndkCheckLinkType(ctx, to)
|
|
|
|
}
|
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
|
|
|
|
}
|
2016-06-08 03:34:45 +08:00
|
|
|
if from.Properties.Sdk_version == "" {
|
|
|
|
// Platform code can link to anything
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
2016-07-30 08:28:03 +08:00
|
|
|
if _, ok := to.linker.(*toolchainLibraryDecorator); ok {
|
2016-06-08 03:34:45 +08:00
|
|
|
// These are always allowed
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
|
|
|
if _, ok := to.linker.(*ndkPrebuiltLibraryLinker); ok {
|
|
|
|
// These are allowed, but don't set sdk_version
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
2016-07-08 11:41:36 +08:00
|
|
|
if _, ok := to.linker.(*ndkPrebuiltStlLinker); ok {
|
|
|
|
// These are allowed, but don't set sdk_version
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
2016-07-08 11:41:36 +08:00
|
|
|
}
|
2016-07-30 08:28:03 +08:00
|
|
|
if _, ok := to.linker.(*stubDecorator); ok {
|
2016-06-18 07:45:24 +08:00
|
|
|
// These aren't real libraries, but are the stub shared libraries that are included in
|
|
|
|
// the NDK.
|
2016-08-04 05:12:14 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
if to.Properties.Sdk_version == "" {
|
|
|
|
// NDK code linking to platform code is never okay.
|
|
|
|
ctx.ModuleErrorf("depends on non-NDK-built library %q",
|
|
|
|
ctx.OtherModuleName(to))
|
|
|
|
}
|
|
|
|
|
|
|
|
// All 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.
|
|
|
|
|
|
|
|
if from.Properties.Sdk_version == "current" {
|
|
|
|
// Current can link against anything.
|
|
|
|
return
|
|
|
|
} else if 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")
|
|
|
|
}
|
|
|
|
|
|
|
|
fromApi, err := strconv.Atoi(from.Properties.Sdk_version)
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
|
|
|
"Invalid sdk_version value (must be int): %q",
|
|
|
|
from.Properties.Sdk_version)
|
|
|
|
}
|
|
|
|
toApi, err := strconv.Atoi(to.Properties.Sdk_version)
|
|
|
|
if err != nil {
|
|
|
|
ctx.PropertyErrorf("sdk_version",
|
|
|
|
"Invalid sdk_version value (must be int): %q",
|
|
|
|
to.Properties.Sdk_version)
|
|
|
|
}
|
|
|
|
|
|
|
|
if toApi > fromApi {
|
|
|
|
ctx.ModuleErrorf("links %q built against newer API version %q",
|
|
|
|
ctx.OtherModuleName(to), to.Properties.Sdk_version)
|
2016-06-18 07:45:24 +08:00
|
|
|
}
|
2016-06-08 03:34:45 +08:00
|
|
|
}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
ctx.VisitDirectDeps(func(m blueprint.Module) {
|
|
|
|
name := ctx.OtherModuleName(m)
|
|
|
|
tag := ctx.OtherModuleDependencyTag(m)
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-05-19 06:37:25 +08:00
|
|
|
a, _ := m.(android.Module)
|
2016-04-12 06:06:20 +08:00
|
|
|
if a == nil {
|
|
|
|
ctx.ModuleErrorf("module %q not an android module", name)
|
|
|
|
return
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-06-08 03:34:45 +08:00
|
|
|
cc, _ := m.(*Module)
|
|
|
|
if cc == nil {
|
2016-04-21 05:21:14 +08:00
|
|
|
switch tag {
|
2016-12-14 07:23:47 +08:00
|
|
|
case android.DefaultsDepTag, android.SourceDepTag:
|
2016-04-21 05:21:14 +08:00
|
|
|
case genSourceDepTag:
|
|
|
|
if genRule, ok := m.(genrule.SourceFileGenerator); ok {
|
|
|
|
depPaths.GeneratedSources = append(depPaths.GeneratedSources,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
|
|
|
} else {
|
|
|
|
ctx.ModuleErrorf("module %q is not a gensrcs or genrule", name)
|
|
|
|
}
|
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:
|
2016-04-21 05:21:14 +08:00
|
|
|
if genRule, ok := m.(genrule.SourceFileGenerator); ok {
|
|
|
|
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
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)
|
|
|
|
if tag == genHeaderExportDepTag {
|
|
|
|
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags)
|
2016-09-30 03:13:36 +08:00
|
|
|
depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps,
|
|
|
|
genRule.GeneratedSourceFiles()...)
|
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 {
|
|
|
|
ctx.ModuleErrorf("module %q is not a genrule", name)
|
|
|
|
}
|
|
|
|
default:
|
2016-04-12 06:06:20 +08:00
|
|
|
ctx.ModuleErrorf("depends on non-cc module %q", name)
|
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
|
|
|
}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
if !a.Enabled() {
|
2016-12-14 04:51:11 +08:00
|
|
|
if ctx.AConfig().AllowMissingDependencies() {
|
|
|
|
ctx.AddMissingDependencies([]string{name})
|
|
|
|
} else {
|
|
|
|
ctx.ModuleErrorf("depends on disabled module %q", name)
|
|
|
|
}
|
2016-04-12 06:06:20 +08:00
|
|
|
return
|
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-06-02 08:09:44 +08:00
|
|
|
if a.Target().Os != ctx.Os() {
|
|
|
|
ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), name)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if a.Target().Arch.ArchType != ctx.Arch().ArchType {
|
|
|
|
ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), name)
|
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
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
if tag == reuseObjTag {
|
2016-11-24 07:45:05 +08:00
|
|
|
if l, ok := cc.compiler.(libraryInterface); ok {
|
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
|
|
|
}
|
2016-01-05 06:34:37 +08:00
|
|
|
|
2016-06-07 09:22:19 +08:00
|
|
|
if t, ok := tag.(dependencyTag); ok && t.library {
|
2016-06-08 03:34:45 +08:00
|
|
|
if i, ok := cc.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.
|
|
|
|
// Re-exported flags from shared library dependencies are not included as those shared libraries
|
|
|
|
// will be included in the vndk set.
|
|
|
|
if tag == staticExportDepTag || tag == headerExportDepTag {
|
|
|
|
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
|
|
|
|
2016-08-04 05:12:14 +08:00
|
|
|
checkLinkType(c, cc)
|
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
|
|
|
|
2016-10-01 08:10:16 +08:00
|
|
|
linkFile := cc.outputFile
|
|
|
|
depFile := android.OptionalPath{}
|
|
|
|
|
2016-04-12 06:06:20 +08:00
|
|
|
switch tag {
|
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
|
|
|
|
depFile = cc.linker.(libraryInterface).toc()
|
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
|
|
|
|
depFile = cc.linker.(libraryInterface).toc()
|
2016-06-07 09:22:19 +08:00
|
|
|
case staticDepTag, staticExportDepTag:
|
2016-10-01 08:10:16 +08:00
|
|
|
ptr = &depPaths.StaticLibs
|
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
|
2016-07-30 08:28:03 +08:00
|
|
|
staticLib, ok := cc.linker.(libraryInterface)
|
|
|
|
if !ok || !staticLib.static() {
|
2016-06-08 03:34:45 +08:00
|
|
|
ctx.ModuleErrorf("module %q not a static library", name)
|
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 {
|
|
|
|
postfix := " (required by " + ctx.OtherModuleName(m) + ")"
|
|
|
|
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
|
2016-04-12 06:06:20 +08:00
|
|
|
}
|
|
|
|
|
2017-02-10 08:16:31 +08:00
|
|
|
switch tag {
|
|
|
|
case staticDepTag, staticExportDepTag, lateStaticDepTag:
|
|
|
|
staticLib, ok := cc.linker.(libraryInterface)
|
|
|
|
if !ok || !staticLib.static() {
|
|
|
|
ctx.ModuleErrorf("module %q not a static library", name)
|
|
|
|
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-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() {
|
|
|
|
ctx.ModuleErrorf("module %q missing output file", name)
|
|
|
|
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-05-18 04:44:16 +08:00
|
|
|
// Dedup exported flags from dependencies
|
|
|
|
depPaths.Flags = firstUniqueElements(depPaths.Flags)
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2016-07-30 03:48:20 +08:00
|
|
|
//
|
|
|
|
// Defaults
|
|
|
|
//
|
|
|
|
type Defaults struct {
|
|
|
|
android.ModuleBase
|
2017-07-08 05:33:33 +08:00
|
|
|
android.DefaultsModuleBase
|
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
|
|
|
|
2016-10-13 05:38:15 +08:00
|
|
|
func (d *Defaults) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
|
|
}
|
|
|
|
|
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{},
|
|
|
|
&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
|
|
|
&UnusedProperties{},
|
|
|
|
&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{},
|
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)
|
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"
|
|
|
|
)
|
|
|
|
|
|
|
|
func vendorMutator(mctx android.BottomUpMutatorContext) {
|
|
|
|
if mctx.Os() != android.Android {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
m, ok := mctx.Module().(*Module)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sanity check
|
|
|
|
if Bool(m.Properties.Vendor_available) && mctx.Vendor() {
|
|
|
|
mctx.PropertyErrorf("vendor_available",
|
|
|
|
"doesn't make sense at the same time as `vendor: true` or `proprietary: true`")
|
|
|
|
return
|
|
|
|
}
|
2017-06-23 18:24:43 +08:00
|
|
|
if vndk := m.vndkdep; vndk != nil {
|
|
|
|
if vndk.isVndk() && !Bool(m.Properties.Vendor_available) {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"has to define `vendor_available: true` to enable vndk")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if !vndk.isVndk() && vndk.isVndkSp() {
|
|
|
|
mctx.PropertyErrorf("vndk",
|
|
|
|
"must set `enabled: true` to set `support_system_process: true`")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
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.DeviceConfig().CompileVndk() {
|
|
|
|
// If the device isn't compiling against the VNDK, we always
|
|
|
|
// use the core mode.
|
|
|
|
mctx.CreateVariations(coreMode)
|
|
|
|
} 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.
|
|
|
|
mctx.CreateVariations(vendorMode)
|
|
|
|
} else if Bool(m.Properties.Vendor_available) {
|
|
|
|
// 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.
|
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
|
|
|
mod := mctx.CreateVariations(coreMode, vendorMode)
|
|
|
|
mod[1].(*Module).Properties.UseVndk = true
|
|
|
|
} else if mctx.Vendor() && m.Properties.Sdk_version == "" {
|
|
|
|
// This will be available in /vendor only
|
|
|
|
mod := mctx.CreateVariations(vendorMode)
|
|
|
|
mod[0].(*Module).Properties.UseVndk = true
|
|
|
|
} 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.
|
|
|
|
mctx.CreateVariations(coreMode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 04:44:16 +08:00
|
|
|
// firstUniqueElements returns all unique elements of a slice, keeping the first copy of each
|
|
|
|
// modifies the slice contents in place, and returns a subslice of the original slice
|
|
|
|
func firstUniqueElements(list []string) []string {
|
|
|
|
k := 0
|
|
|
|
outer:
|
|
|
|
for i := 0; i < len(list); i++ {
|
|
|
|
for j := 0; j < k; j++ {
|
|
|
|
if list[i] == list[j] {
|
|
|
|
continue outer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
list[k] = list[i]
|
|
|
|
k++
|
|
|
|
}
|
|
|
|
return list[:k]
|
|
|
|
}
|
|
|
|
|
2015-04-29 04:30:13 +08:00
|
|
|
// lastUniqueElements returns all unique elements of a slice, keeping the last copy of each
|
|
|
|
// modifies the slice contents in place, and returns a subslice of the original slice
|
|
|
|
func lastUniqueElements(list []string) []string {
|
|
|
|
totalSkip := 0
|
|
|
|
for i := len(list) - 1; i >= totalSkip; i-- {
|
|
|
|
skip := 0
|
|
|
|
for j := i - 1; j >= totalSkip; j-- {
|
|
|
|
if list[i] == list[j] {
|
|
|
|
skip++
|
|
|
|
} else {
|
|
|
|
list[j+skip] = list[j]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
totalSkip += skip
|
|
|
|
}
|
|
|
|
return list[totalSkip:]
|
|
|
|
}
|
2015-10-29 08:23:31 +08:00
|
|
|
|
2017-05-10 01:21:52 +08:00
|
|
|
func getCurrentNdkPrebuiltVersion(ctx DepsContext) string {
|
|
|
|
if ctx.AConfig().PlatformSdkVersionInt() > config.NdkMaxPrebuiltVersionInt {
|
|
|
|
return strconv.Itoa(config.NdkMaxPrebuiltVersionInt)
|
|
|
|
}
|
|
|
|
return ctx.AConfig().PlatformSdkVersion()
|
|
|
|
}
|
|
|
|
|
2015-10-29 08:23:31 +08:00
|
|
|
var Bool = proptools.Bool
|