2019-08-27 21:03:00 +02:00
|
|
|
// Copyright 2019 The Android Open Source Project
|
|
|
|
//
|
|
|
|
// 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 rust
|
|
|
|
|
|
|
|
import (
|
2023-09-19 22:09:00 +02:00
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2023-08-24 17:10:01 +02:00
|
|
|
"android/soong/bazel"
|
2022-04-19 05:12:56 +02:00
|
|
|
"android/soong/bloaty"
|
2023-11-17 16:27:06 +01:00
|
|
|
"android/soong/testing"
|
2023-08-24 17:10:01 +02:00
|
|
|
"android/soong/ui/metrics/bp2build_metrics_proto"
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
"github.com/google/blueprint"
|
|
|
|
"github.com/google/blueprint/proptools"
|
|
|
|
|
|
|
|
"android/soong/android"
|
|
|
|
"android/soong/cc"
|
2020-08-27 13:37:29 +02:00
|
|
|
cc_config "android/soong/cc/config"
|
2021-07-22 21:05:08 +02:00
|
|
|
"android/soong/fuzz"
|
2023-03-16 23:51:40 +01:00
|
|
|
"android/soong/multitree"
|
2019-08-27 21:03:00 +02:00
|
|
|
"android/soong/rust/config"
|
2022-03-23 22:31:39 +01:00
|
|
|
"android/soong/snapshot"
|
2019-08-27 21:03:00 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var pctx = android.NewPackageContext("android/soong/rust")
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
android.RegisterModuleType("rust_defaults", defaultsFactory)
|
|
|
|
android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
|
|
|
ctx.BottomUp("rust_libraries", LibraryMutator).Parallel()
|
2020-09-08 18:46:52 +02:00
|
|
|
ctx.BottomUp("rust_stdlinkage", LibstdMutator).Parallel()
|
2020-04-09 15:56:02 +02:00
|
|
|
ctx.BottomUp("rust_begin", BeginMutator).Parallel()
|
2020-02-11 14:24:25 +01:00
|
|
|
})
|
|
|
|
android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
|
|
|
ctx.BottomUp("rust_sanitizers", rustSanitizerRuntimeMutator).Parallel()
|
2019-08-27 21:03:00 +02:00
|
|
|
})
|
2023-07-11 06:31:36 +02:00
|
|
|
pctx.Import("android/soong/android")
|
2019-08-27 21:03:00 +02:00
|
|
|
pctx.Import("android/soong/rust/config")
|
2020-08-31 10:06:16 +02:00
|
|
|
pctx.ImportAs("cc_config", "android/soong/cc/config")
|
2023-05-16 02:58:37 +02:00
|
|
|
android.InitRegistrationContext.RegisterParallelSingletonType("kythe_rust_extract", kytheExtractRustFactory)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type Flags struct {
|
2020-06-16 16:26:57 +02:00
|
|
|
GlobalRustFlags []string // Flags that apply globally to rust
|
|
|
|
GlobalLinkFlags []string // Flags that apply globally to linker
|
|
|
|
RustFlags []string // Flags that apply to rust
|
|
|
|
LinkFlags []string // Flags that apply to linker
|
2020-06-22 13:28:02 +02:00
|
|
|
ClippyFlags []string // Flags that apply to clippy-driver, during the linting
|
2021-03-19 23:06:02 +01:00
|
|
|
RustdocFlags []string // Flags that apply to rustdoc
|
2019-09-20 20:00:37 +02:00
|
|
|
Toolchain config.Toolchain
|
2020-04-09 15:56:02 +02:00
|
|
|
Coverage bool
|
2020-06-22 13:28:02 +02:00
|
|
|
Clippy bool
|
2022-04-19 05:12:56 +02:00
|
|
|
EmitXrefs bool // If true, emit rules to aid cross-referencing
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type BaseProperties struct {
|
2023-02-28 20:29:13 +01:00
|
|
|
AndroidMkRlibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkDylibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkProcMacroLibs []string `blueprint:"mutated"`
|
|
|
|
AndroidMkStaticLibs []string `blueprint:"mutated"`
|
2020-07-10 03:03:28 +02:00
|
|
|
|
2020-12-02 15:15:16 +01:00
|
|
|
ImageVariationPrefix string `blueprint:"mutated"`
|
|
|
|
VndkVersion string `blueprint:"mutated"`
|
|
|
|
SubName string `blueprint:"mutated"`
|
|
|
|
|
2021-04-02 18:41:32 +02:00
|
|
|
// SubName is used by CC for tracking image variants / SDK versions. RustSubName is used for Rust-specific
|
|
|
|
// subnaming which shouldn't be visible to CC modules (such as the rlib stdlinkage subname). This should be
|
|
|
|
// appended before SubName.
|
|
|
|
RustSubName string `blueprint:"mutated"`
|
|
|
|
|
2020-12-02 15:15:16 +01:00
|
|
|
// Set by imageMutator
|
2021-02-05 16:57:43 +01:00
|
|
|
CoreVariantNeeded bool `blueprint:"mutated"`
|
|
|
|
VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
|
2021-07-13 23:12:37 +02:00
|
|
|
RamdiskVariantNeeded bool `blueprint:"mutated"`
|
2021-02-11 21:31:46 +01:00
|
|
|
RecoveryVariantNeeded bool `blueprint:"mutated"`
|
2021-02-05 16:57:43 +01:00
|
|
|
ExtraVariants []string `blueprint:"mutated"`
|
|
|
|
|
2021-07-22 16:52:06 +02:00
|
|
|
// Allows this module to use non-APEX version of libraries. Useful
|
|
|
|
// for building binaries that are started before APEXes are activated.
|
|
|
|
Bootstrap *bool
|
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// Used by vendor snapshot to record dependencies from snapshot modules.
|
|
|
|
SnapshotSharedLibs []string `blueprint:"mutated"`
|
2021-06-29 13:50:37 +02:00
|
|
|
SnapshotStaticLibs []string `blueprint:"mutated"`
|
2023-07-13 17:01:41 +02:00
|
|
|
SnapshotRlibs []string `blueprint:"mutated"`
|
|
|
|
SnapshotDylibs []string `blueprint:"mutated"`
|
2021-05-20 19:39:16 +02:00
|
|
|
|
2021-07-13 23:12:37 +02:00
|
|
|
// Make this module available when building for ramdisk.
|
|
|
|
// On device without a dedicated recovery partition, the module is only
|
|
|
|
// available after switching root into
|
|
|
|
// /first_stage_ramdisk. To expose the module before switching root, install
|
|
|
|
// the recovery variant instead.
|
|
|
|
Ramdisk_available *bool
|
|
|
|
|
2021-02-05 16:57:43 +01:00
|
|
|
// Make this module available when building for vendor ramdisk.
|
|
|
|
// On device without a dedicated recovery partition, the module is only
|
|
|
|
// available after switching root into
|
|
|
|
// /first_stage_ramdisk. To expose the module before switching root, install
|
2021-02-11 21:31:46 +01:00
|
|
|
// the recovery variant instead
|
2021-02-05 16:57:43 +01:00
|
|
|
Vendor_ramdisk_available *bool
|
2020-07-31 19:40:31 +02:00
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// Normally Soong uses the directory structure to decide which modules
|
|
|
|
// should be included (framework) or excluded (non-framework) from the
|
|
|
|
// different snapshots (vendor, recovery, etc.), but this property
|
|
|
|
// allows a partner to exclude a module normally thought of as a
|
|
|
|
// framework module from the vendor snapshot.
|
|
|
|
Exclude_from_vendor_snapshot *bool
|
|
|
|
|
|
|
|
// Normally Soong uses the directory structure to decide which modules
|
|
|
|
// should be included (framework) or excluded (non-framework) from the
|
|
|
|
// different snapshots (vendor, recovery, etc.), but this property
|
|
|
|
// allows a partner to exclude a module normally thought of as a
|
|
|
|
// framework module from the recovery snapshot.
|
|
|
|
Exclude_from_recovery_snapshot *bool
|
|
|
|
|
2021-02-11 21:31:46 +01:00
|
|
|
// Make this module available when building for recovery
|
|
|
|
Recovery_available *bool
|
|
|
|
|
2020-12-04 21:05:43 +01:00
|
|
|
// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
|
|
|
|
Min_sdk_version *string
|
|
|
|
|
2021-10-05 02:12:41 +02:00
|
|
|
HideFromMake bool `blueprint:"mutated"`
|
|
|
|
PreventInstall bool `blueprint:"mutated"`
|
|
|
|
|
|
|
|
Installable *bool
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type Module struct {
|
2021-07-22 21:05:08 +02:00
|
|
|
fuzz.FuzzModule
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2020-12-02 15:15:16 +01:00
|
|
|
VendorProperties cc.VendorProperties
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
Properties BaseProperties
|
|
|
|
|
2023-11-17 16:27:06 +01:00
|
|
|
hod android.HostOrDeviceSupported
|
|
|
|
multilib android.Multilib
|
|
|
|
testModule bool
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2020-12-02 15:15:16 +01:00
|
|
|
makeLinkType string
|
|
|
|
|
2022-01-20 15:55:00 +01:00
|
|
|
afdo *afdo
|
2019-08-27 21:03:00 +02:00
|
|
|
compiler compiler
|
2020-04-09 15:56:02 +02:00
|
|
|
coverage *coverage
|
2020-06-22 13:28:02 +02:00
|
|
|
clippy *clippy
|
2020-02-11 14:24:25 +01:00
|
|
|
sanitize *sanitize
|
2019-08-27 21:03:00 +02:00
|
|
|
cachedToolchain config.Toolchain
|
2020-07-08 14:39:44 +02:00
|
|
|
sourceProvider SourceProvider
|
2020-08-05 15:36:19 +02:00
|
|
|
subAndroidMkOnce map[SubAndroidMkProvider]bool
|
2020-07-08 14:39:44 +02:00
|
|
|
|
2021-11-05 21:36:47 +01:00
|
|
|
// Output file to be installed, may be stripped or unstripped.
|
|
|
|
outputFile android.OptionalPath
|
|
|
|
|
2022-04-19 05:12:56 +02:00
|
|
|
// Cross-reference input file
|
|
|
|
kytheFiles android.Paths
|
|
|
|
|
2021-11-05 21:36:47 +01:00
|
|
|
docTimestampFile android.OptionalPath
|
2020-11-17 14:21:02 +01:00
|
|
|
|
|
|
|
hideApexVariantFromMake bool
|
2021-11-09 17:26:04 +01:00
|
|
|
|
|
|
|
// For apex variants, this is set as apex.min_sdk_version
|
|
|
|
apexSdkVersion android.ApiLevel
|
2023-08-18 02:42:26 +02:00
|
|
|
|
|
|
|
transitiveAndroidMkSharedLibs *android.DepSet[string]
|
2023-08-24 17:10:01 +02:00
|
|
|
|
|
|
|
android.BazelModuleBase
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-12-14 17:27:52 +01:00
|
|
|
func (mod *Module) Header() bool {
|
|
|
|
//TODO: If Rust libraries provide header variants, this needs to be updated.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SetPreventInstall() {
|
|
|
|
mod.Properties.PreventInstall = true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SetHideFromMake() {
|
|
|
|
mod.Properties.HideFromMake = true
|
|
|
|
}
|
|
|
|
|
2021-10-05 02:12:41 +02:00
|
|
|
func (mod *Module) HiddenFromMake() bool {
|
|
|
|
return mod.Properties.HideFromMake
|
2021-04-01 15:49:36 +02:00
|
|
|
}
|
|
|
|
|
2020-12-14 17:27:52 +01:00
|
|
|
func (mod *Module) SanitizePropDefined() bool {
|
2020-02-11 14:24:25 +01:00
|
|
|
// Because compiler is not set for some Rust modules where sanitize might be set, check that compiler is also not
|
|
|
|
// nil since we need compiler to actually sanitize.
|
|
|
|
return mod.sanitize != nil && mod.compiler != nil
|
2020-12-14 17:27:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) IsPrebuilt() bool {
|
|
|
|
if _, ok := mod.compiler.(*prebuiltLibraryDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-07-10 03:03:28 +02:00
|
|
|
func (mod *Module) OutputFiles(tag string) (android.Paths, error) {
|
|
|
|
switch tag {
|
|
|
|
case "":
|
2020-08-07 00:27:45 +02:00
|
|
|
if mod.sourceProvider != nil && (mod.compiler == nil || mod.compiler.Disabled()) {
|
2020-07-10 03:03:28 +02:00
|
|
|
return mod.sourceProvider.Srcs(), nil
|
|
|
|
} else {
|
2021-04-07 08:08:04 +02:00
|
|
|
if mod.OutputFile().Valid() {
|
|
|
|
return android.Paths{mod.OutputFile().Path()}, nil
|
2020-07-10 03:03:28 +02:00
|
|
|
}
|
|
|
|
return android.Paths{}, nil
|
|
|
|
}
|
2023-02-06 19:31:02 +01:00
|
|
|
case "unstripped":
|
|
|
|
if mod.compiler != nil {
|
|
|
|
return android.PathsIfNonNil(mod.compiler.unstrippedOutputFilePath()), nil
|
|
|
|
}
|
|
|
|
return nil, nil
|
2020-07-10 03:03:28 +02:00
|
|
|
default:
|
|
|
|
return nil, fmt.Errorf("unsupported module reference tag %q", tag)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) SelectedStl() string {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2019-11-21 21:30:50 +01:00
|
|
|
func (mod *Module) NonCcVariants() bool {
|
|
|
|
if mod.compiler != nil {
|
2020-07-31 17:01:18 +02:00
|
|
|
if _, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return false
|
2019-11-21 21:30:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("NonCcVariants called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) Static() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return library.static()
|
|
|
|
}
|
|
|
|
}
|
2020-07-31 17:01:18 +02:00
|
|
|
return false
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) Shared() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
2020-07-31 17:01:18 +02:00
|
|
|
return library.shared()
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
}
|
2020-07-31 17:01:18 +02:00
|
|
|
return false
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) Dylib() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return library.dylib()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2023-09-22 05:30:26 +02:00
|
|
|
func (mod *Module) Source() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok && mod.sourceProvider != nil {
|
|
|
|
return library.source()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2023-07-13 17:01:41 +02:00
|
|
|
func (mod *Module) RlibStd() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok && library.rlib() {
|
|
|
|
return library.rlibStd()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("RlibStd() called on non-rlib module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) Rlib() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return library.rlib()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) Binary() bool {
|
2021-11-01 14:19:45 +01:00
|
|
|
if binary, ok := mod.compiler.(binaryInterface); ok {
|
|
|
|
return binary.binary()
|
2021-04-01 15:49:36 +02:00
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-06-29 13:50:37 +02:00
|
|
|
func (mod *Module) StaticExecutable() bool {
|
|
|
|
if !mod.Binary() {
|
|
|
|
return false
|
|
|
|
}
|
2021-11-01 14:19:45 +01:00
|
|
|
return mod.StaticallyLinked()
|
2021-06-29 13:50:37 +02:00
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) Object() bool {
|
|
|
|
// Rust has no modules which produce only object files.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) Toc() android.OptionalPath {
|
|
|
|
if mod.compiler != nil {
|
2021-11-03 20:30:18 +01:00
|
|
|
if lib, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return lib.toc()
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("Toc() called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
func (mod *Module) UseSdk() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) RelativeInstallPath() string {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
return mod.compiler.relativeInstallPath()
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) UseVndk() bool {
|
2020-12-02 15:15:16 +01:00
|
|
|
return mod.Properties.VndkVersion != ""
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
|
2021-06-11 10:22:09 +02:00
|
|
|
func (mod *Module) Bootstrap() bool {
|
2021-07-22 16:52:06 +02:00
|
|
|
return Bool(mod.Properties.Bootstrap)
|
2021-06-11 10:22:09 +02:00
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) MustUseVendorVariant() bool {
|
2021-04-02 18:41:32 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SubName() string {
|
|
|
|
return mod.Properties.SubName
|
2019-10-18 23:49:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) IsVndk() bool {
|
2020-12-02 15:15:16 +01:00
|
|
|
// TODO(b/165791368)
|
2019-10-18 23:49:46 +02:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-12-02 15:00:51 +01:00
|
|
|
func (mod *Module) IsVndkExt() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) IsVndkSp() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:08:36 +02:00
|
|
|
func (mod *Module) IsVndkPrebuiltLibrary() bool {
|
|
|
|
// Rust modules do not provide VNDK prebuilts
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) IsVendorPublicLibrary() bool {
|
|
|
|
return mod.VendorProperties.IsVendorPublicLibrary
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SdkAndPlatformVariantVisibleToMake() bool {
|
|
|
|
// Rust modules to not provide Sdk variants
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-12-17 01:46:01 +01:00
|
|
|
func (c *Module) IsVndkPrivate() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) IsLlndk() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Module) IsLlndkPublic() bool {
|
2020-12-02 15:00:51 +01:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-03-30 18:19:36 +02:00
|
|
|
func (mod *Module) KernelHeadersDecorator() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-27 03:37:44 +02:00
|
|
|
func (m *Module) NeedsLlndkVariants() bool {
|
2021-04-27 22:06:04 +02:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Module) NeedsVendorPublicLibraryVariants() bool {
|
2021-03-30 18:19:36 +02:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) HasLlndkStubs() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) StubsVersion() string {
|
|
|
|
panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:49:46 +02:00
|
|
|
func (mod *Module) SdkVersion() string {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:50:32 +02:00
|
|
|
func (mod *Module) AlwaysSdk() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
Don't create version variants for SDK variants
When a lib has sdk_version set, an SDK variant and a platform variant
are created by the sdkMutator. Then by the versionMutator, if the
library had 'stubs.versions' property, one or more versioned variants
and one impl variant are created for each of the two (SDK and platform)
variants. As a concrete example,
cc_library {
name: "foo",
sdk_version: "current",
stubs: { versions: ["1", "2"], },
}
would create 6 variants:
1) (sdk: "", version: "")
2) (sdk: "", version: "1")
3) (sdk: "", version: "2")
4) (sdk: "sdk", version: "")
5) (sdk: "sdk", version: "1")
6) (sdk: "sdk", version: "2")
This is somewhat uncessary because the need for the SDK mutator is to
have the platform variant (sdk:"") of a lib where sdk_version is unset,
which actually makes sens for the impl variant (version:""), but not
the versioned variants (version:"1" or version:"2").
This is not only unncessary, but also causes duplicate module
definitions in the Make side when doing an unbundled build. Specifically,
The #1 and #4 above both are emitted to Make and get the same name
"foo".
To fix the problem and not to create unnecessary variants, the versioned
variants are no longer created for the sdk variant. So, foo now has
the following variants only.
1) (sdk: "", version: "") // not emitted to Make (by versionMutator)
2) (sdk: "", version: "1") // not emitted to Make (by versionMutator)
3) (sdk: "", version: "2") // emitted to Make (by versionMutator)
4) (sdk: "sdk", version: "") // not emitted to Make (by versionMutator)
Bug: 159106705
Test: Add sdk_version:"minimum" to libnativehelper in libnativehelper/Android.bp.
m SOONG_ALLOW_MISSING_DEPENDENCIES=true TARGET_BUILD_UNBUNDLED=true libnativehelper
Change-Id: I6f02f4189e5504286174ccff1642166da82d00c9
2020-06-16 14:58:53 +02:00
|
|
|
func (mod *Module) IsSdkVariant() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-10-01 22:37:16 +02:00
|
|
|
func (mod *Module) SplitPerApiLevel() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-04-19 05:12:56 +02:00
|
|
|
func (mod *Module) XrefRustFiles() android.Paths {
|
|
|
|
return mod.kytheFiles
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
type Deps struct {
|
2021-03-23 20:53:44 +01:00
|
|
|
Dylibs []string
|
|
|
|
Rlibs []string
|
|
|
|
Rustlibs []string
|
|
|
|
Stdlibs []string
|
|
|
|
ProcMacros []string
|
|
|
|
SharedLibs []string
|
|
|
|
StaticLibs []string
|
|
|
|
WholeStaticLibs []string
|
|
|
|
HeaderLibs []string
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2021-11-04 19:09:38 +01:00
|
|
|
// Used for data dependencies adjacent to tests
|
|
|
|
DataLibs []string
|
|
|
|
DataBins []string
|
|
|
|
|
2022-01-24 05:46:16 +01:00
|
|
|
CrtBegin, CrtEnd []string
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type PathDeps struct {
|
2023-10-02 20:39:17 +02:00
|
|
|
DyLibs RustLibraries
|
|
|
|
RLibs RustLibraries
|
|
|
|
SharedLibs android.Paths
|
|
|
|
SharedLibDeps android.Paths
|
|
|
|
StaticLibs android.Paths
|
|
|
|
ProcMacros RustLibraries
|
|
|
|
AfdoProfiles android.Paths
|
2021-02-04 17:29:41 +01:00
|
|
|
|
|
|
|
// depFlags and depLinkFlags are rustc and linker (clang) flags.
|
|
|
|
depFlags []string
|
|
|
|
depLinkFlags []string
|
|
|
|
|
|
|
|
// linkDirs are link paths passed via -L to rustc. linkObjects are objects passed directly to the linker.
|
|
|
|
// Both of these are exported and propagate to dependencies.
|
2023-09-22 05:58:59 +02:00
|
|
|
linkDirs []string
|
2023-10-02 20:39:17 +02:00
|
|
|
linkObjects []string
|
2019-09-20 20:00:37 +02:00
|
|
|
|
2020-07-24 22:05:01 +02:00
|
|
|
// Used by bindgen modules which call clang
|
|
|
|
depClangFlags []string
|
|
|
|
depIncludePaths android.Paths
|
2020-08-28 23:00:26 +02:00
|
|
|
depGeneratedHeaders android.Paths
|
2020-07-24 22:05:01 +02:00
|
|
|
depSystemIncludePaths android.Paths
|
|
|
|
|
2022-01-24 05:46:16 +01:00
|
|
|
CrtBegin android.Paths
|
|
|
|
CrtEnd android.Paths
|
2020-05-16 02:36:30 +02:00
|
|
|
|
|
|
|
// Paths to generated source files
|
2020-12-01 15:25:22 +01:00
|
|
|
SrcDeps android.Paths
|
|
|
|
srcProviderFiles android.Paths
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type RustLibraries []RustLibrary
|
|
|
|
|
|
|
|
type RustLibrary struct {
|
|
|
|
Path android.Path
|
|
|
|
CrateName string
|
|
|
|
}
|
|
|
|
|
|
|
|
type compiler interface {
|
2021-02-25 16:30:57 +01:00
|
|
|
initialize(ctx ModuleContext)
|
2019-08-27 21:03:00 +02:00
|
|
|
compilerFlags(ctx ModuleContext, flags Flags) Flags
|
2021-09-23 17:50:33 +02:00
|
|
|
cfgFlags(ctx ModuleContext, flags Flags) Flags
|
|
|
|
featureFlags(ctx ModuleContext, flags Flags) Flags
|
2019-08-27 21:03:00 +02:00
|
|
|
compilerProps() []interface{}
|
2022-04-19 05:12:56 +02:00
|
|
|
compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput
|
2019-08-27 21:03:00 +02:00
|
|
|
compilerDeps(ctx DepsContext, deps Deps) Deps
|
|
|
|
crateName() string
|
2021-03-19 23:06:02 +01:00
|
|
|
rustdoc(ctx ModuleContext, flags Flags, deps PathDeps) android.OptionalPath
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2021-02-25 16:30:57 +01:00
|
|
|
// Output directory in which source-generated code from dependencies is
|
|
|
|
// copied. This is equivalent to Cargo's OUT_DIR variable.
|
|
|
|
CargoOutDir() android.OptionalPath
|
2021-03-19 23:06:02 +01:00
|
|
|
|
2021-08-11 21:13:43 +02:00
|
|
|
// CargoPkgVersion returns the value of the Cargo_pkg_version property.
|
|
|
|
CargoPkgVersion() string
|
|
|
|
|
|
|
|
// CargoEnvCompat returns whether Cargo environment variables should be used.
|
|
|
|
CargoEnvCompat() bool
|
|
|
|
|
2019-12-13 04:36:05 +01:00
|
|
|
inData() bool
|
2020-08-27 13:48:36 +02:00
|
|
|
install(ctx ModuleContext)
|
2019-08-27 21:03:00 +02:00
|
|
|
relativeInstallPath() string
|
2021-04-01 15:49:36 +02:00
|
|
|
everInstallable() bool
|
2020-04-09 15:56:02 +02:00
|
|
|
|
|
|
|
nativeCoverage() bool
|
2020-07-31 19:40:31 +02:00
|
|
|
|
|
|
|
Disabled() bool
|
|
|
|
SetDisabled()
|
2020-08-18 20:31:23 +02:00
|
|
|
|
2020-09-28 19:22:45 +02:00
|
|
|
stdLinkage(ctx *depsContext) RustLinkage
|
2023-02-14 16:56:14 +01:00
|
|
|
noStdlibs() bool
|
2021-04-07 08:08:04 +02:00
|
|
|
|
2021-11-05 21:36:47 +01:00
|
|
|
unstrippedOutputFilePath() android.Path
|
2021-04-07 08:08:04 +02:00
|
|
|
strippedOutputFilePath() android.OptionalPath
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
|
2020-06-25 18:34:12 +02:00
|
|
|
type exportedFlagsProducer interface {
|
2023-09-22 05:58:59 +02:00
|
|
|
exportLinkDirs(...string)
|
2023-10-02 20:39:17 +02:00
|
|
|
exportLinkObjects(...string)
|
2020-06-25 18:34:12 +02:00
|
|
|
}
|
|
|
|
|
2022-04-19 05:12:56 +02:00
|
|
|
type xref interface {
|
|
|
|
XrefRustFiles() android.Paths
|
|
|
|
}
|
|
|
|
|
2020-06-25 18:34:12 +02:00
|
|
|
type flagExporter struct {
|
2023-09-22 05:58:59 +02:00
|
|
|
linkDirs []string
|
2023-10-02 20:39:17 +02:00
|
|
|
linkObjects []string
|
2020-06-25 18:34:12 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 05:58:59 +02:00
|
|
|
func (flagExporter *flagExporter) exportLinkDirs(dirs ...string) {
|
|
|
|
flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...))
|
2020-06-25 18:34:12 +02:00
|
|
|
}
|
|
|
|
|
2023-10-02 20:39:17 +02:00
|
|
|
func (flagExporter *flagExporter) exportLinkObjects(flags ...string) {
|
|
|
|
flagExporter.linkObjects = android.FirstUniqueStrings(append(flagExporter.linkObjects, flags...))
|
2020-08-25 18:48:19 +02:00
|
|
|
}
|
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
func (flagExporter *flagExporter) setProvider(ctx ModuleContext) {
|
|
|
|
ctx.SetProvider(FlagExporterInfoProvider, FlagExporterInfo{
|
|
|
|
LinkDirs: flagExporter.linkDirs,
|
|
|
|
LinkObjects: flagExporter.linkObjects,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-06-25 18:34:12 +02:00
|
|
|
var _ exportedFlagsProducer = (*flagExporter)(nil)
|
|
|
|
|
|
|
|
func NewFlagExporter() *flagExporter {
|
2020-09-18 23:15:30 +02:00
|
|
|
return &flagExporter{}
|
2020-06-25 18:34:12 +02:00
|
|
|
}
|
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
type FlagExporterInfo struct {
|
|
|
|
Flags []string
|
2023-09-22 05:58:59 +02:00
|
|
|
LinkDirs []string // TODO: this should be android.Paths
|
2023-10-02 20:39:17 +02:00
|
|
|
LinkObjects []string // TODO: this should be android.Paths
|
2020-09-18 23:15:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var FlagExporterInfoProvider = blueprint.NewProvider(FlagExporterInfo{})
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (mod *Module) isCoverageVariant() bool {
|
|
|
|
return mod.coverage.Properties.IsCoverageVariant
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ cc.Coverage = (*Module)(nil)
|
|
|
|
|
|
|
|
func (mod *Module) IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool {
|
|
|
|
return mod.coverage != nil && mod.coverage.Properties.NeedCoverageVariant
|
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) VndkVersion() string {
|
|
|
|
return mod.Properties.VndkVersion
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) PreventInstall() bool {
|
|
|
|
return mod.Properties.PreventInstall
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) MarkAsCoverageVariant(coverage bool) {
|
|
|
|
mod.coverage.Properties.IsCoverageVariant = coverage
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) EnableCoverageIfNeeded() {
|
|
|
|
mod.coverage.Properties.CoverageEnabled = mod.coverage.Properties.NeedCoverageBuild
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func defaultsFactory() android.Module {
|
|
|
|
return DefaultsFactory()
|
|
|
|
}
|
|
|
|
|
|
|
|
type Defaults struct {
|
|
|
|
android.ModuleBase
|
|
|
|
android.DefaultsModuleBase
|
|
|
|
}
|
|
|
|
|
|
|
|
func DefaultsFactory(props ...interface{}) android.Module {
|
|
|
|
module := &Defaults{}
|
|
|
|
|
|
|
|
module.AddProperties(props...)
|
|
|
|
module.AddProperties(
|
|
|
|
&BaseProperties{},
|
2022-01-20 15:55:00 +01:00
|
|
|
&cc.AfdoProperties{},
|
2020-12-02 15:15:16 +01:00
|
|
|
&cc.VendorProperties{},
|
2021-01-06 12:40:43 +01:00
|
|
|
&BenchmarkProperties{},
|
2020-09-25 22:08:34 +02:00
|
|
|
&BindgenProperties{},
|
2019-08-27 21:03:00 +02:00
|
|
|
&BaseCompilerProperties{},
|
|
|
|
&BinaryCompilerProperties{},
|
|
|
|
&LibraryCompilerProperties{},
|
|
|
|
&ProcMacroCompilerProperties{},
|
|
|
|
&PrebuiltProperties{},
|
2020-07-08 14:39:44 +02:00
|
|
|
&SourceProviderProperties{},
|
2019-11-01 04:56:47 +01:00
|
|
|
&TestProperties{},
|
2020-04-09 15:56:02 +02:00
|
|
|
&cc.CoverageProperties{},
|
2020-09-25 22:08:34 +02:00
|
|
|
&cc.RustBindgenClangProperties{},
|
2020-06-22 13:28:02 +02:00
|
|
|
&ClippyProperties{},
|
2020-02-11 14:24:25 +01:00
|
|
|
&SanitizeProperties{},
|
2023-08-17 01:58:25 +02:00
|
|
|
&fuzz.FuzzProperties{},
|
2019-08-27 21:03:00 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
android.InitDefaultsModule(module)
|
|
|
|
return module
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) CrateName() string {
|
2019-11-01 03:38:29 +01:00
|
|
|
return mod.compiler.crateName()
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2019-10-18 23:18:45 +02:00
|
|
|
func (mod *Module) CcLibrary() bool {
|
|
|
|
if mod.compiler != nil {
|
2021-11-13 13:42:36 +01:00
|
|
|
if _, ok := mod.compiler.(libraryInterface); ok {
|
2019-10-18 23:18:45 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) CcLibraryInterface() bool {
|
|
|
|
if mod.compiler != nil {
|
2020-07-31 17:01:18 +02:00
|
|
|
// use build{Static,Shared}() instead of {static,shared}() here because this might be called before
|
|
|
|
// VariantIs{Static,Shared} is set.
|
|
|
|
if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic()) {
|
2019-10-18 23:18:45 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2023-06-09 20:06:44 +02:00
|
|
|
func (mod *Module) RustLibraryInterface() bool {
|
|
|
|
if mod.compiler != nil {
|
|
|
|
if _, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2023-02-06 19:31:02 +01:00
|
|
|
func (mod *Module) IsFuzzModule() bool {
|
|
|
|
if _, ok := mod.compiler.(*fuzzDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) FuzzModuleStruct() fuzz.FuzzModule {
|
|
|
|
return mod.FuzzModule
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
|
|
|
|
if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok {
|
|
|
|
return fuzzer.fuzzPackagedModule
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2023-04-06 00:08:46 +02:00
|
|
|
func (mod *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
|
2023-02-06 19:31:02 +01:00
|
|
|
if fuzzer, ok := mod.compiler.(*fuzzDecorator); ok {
|
|
|
|
return fuzzer.sharedLibraries
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2021-10-14 18:22:09 +02:00
|
|
|
func (mod *Module) UnstrippedOutputFile() android.Path {
|
2021-11-05 21:36:47 +01:00
|
|
|
if mod.compiler != nil {
|
|
|
|
return mod.compiler.unstrippedOutputFilePath()
|
2021-10-14 18:22:09 +02:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-11-07 04:15:49 +01:00
|
|
|
func (mod *Module) IncludeDirs() android.Paths {
|
2019-10-18 23:18:45 +02:00
|
|
|
if mod.compiler != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := mod.compiler.(*libraryDecorator); ok {
|
2019-11-07 04:15:49 +01:00
|
|
|
return library.includeDirs
|
2019-10-18 23:18:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("IncludeDirs called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SetStatic() {
|
|
|
|
if mod.compiler != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
library.setStatic()
|
2019-10-18 23:18:45 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("SetStatic called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) SetShared() {
|
|
|
|
if mod.compiler != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
library.setShared()
|
2019-10-18 23:18:45 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("SetShared called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) BuildStaticVariant() bool {
|
|
|
|
if mod.compiler != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return library.buildStatic()
|
2019-10-18 23:18:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) BuildSharedVariant() bool {
|
|
|
|
if mod.compiler != nil {
|
2019-10-18 23:49:46 +02:00
|
|
|
if library, ok := mod.compiler.(libraryInterface); ok {
|
|
|
|
return library.buildShared()
|
2019-10-18 23:18:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) Module() android.Module {
|
|
|
|
return mod
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) OutputFile() android.OptionalPath {
|
2021-11-05 21:36:47 +01:00
|
|
|
return mod.outputFile
|
2019-10-18 23:18:45 +02:00
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (mod *Module) CoverageFiles() android.Paths {
|
|
|
|
if mod.compiler != nil {
|
2021-01-15 01:03:18 +01:00
|
|
|
return android.Paths{}
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
panic(fmt.Errorf("CoverageFiles called on non-library module: %q", mod.BaseModuleName()))
|
|
|
|
}
|
|
|
|
|
2022-06-27 22:00:26 +02:00
|
|
|
// Rust does not produce gcno files, and therefore does not produce a coverage archive.
|
|
|
|
func (mod *Module) CoverageOutputFile() android.OptionalPath {
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) IsNdk(config android.Config) bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) IsStubs() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-12-15 03:02:21 +01:00
|
|
|
func (mod *Module) installable(apexInfo android.ApexInfo) bool {
|
2021-09-30 10:25:21 +02:00
|
|
|
if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) {
|
2021-05-17 06:19:33 +02:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2020-12-15 03:02:21 +01:00
|
|
|
// The apex variant is not installable because it is included in the APEX and won't appear
|
|
|
|
// in the system partition as a standalone file.
|
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-07 08:08:04 +02:00
|
|
|
return mod.OutputFile().Valid() && !mod.Properties.PreventInstall
|
2020-12-15 03:02:21 +01:00
|
|
|
}
|
|
|
|
|
2021-11-09 17:26:04 +01:00
|
|
|
func (ctx moduleContext) apexVariationName() string {
|
|
|
|
return ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
|
|
|
|
}
|
|
|
|
|
2019-10-18 23:18:45 +02:00
|
|
|
var _ cc.LinkableInterface = (*Module)(nil)
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (mod *Module) Init() android.Module {
|
|
|
|
mod.AddProperties(&mod.Properties)
|
2020-12-02 15:15:16 +01:00
|
|
|
mod.AddProperties(&mod.VendorProperties)
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2022-01-20 15:55:00 +01:00
|
|
|
if mod.afdo != nil {
|
|
|
|
mod.AddProperties(mod.afdo.props()...)
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
if mod.compiler != nil {
|
|
|
|
mod.AddProperties(mod.compiler.compilerProps()...)
|
|
|
|
}
|
2020-04-09 15:56:02 +02:00
|
|
|
if mod.coverage != nil {
|
|
|
|
mod.AddProperties(mod.coverage.props()...)
|
|
|
|
}
|
2020-06-22 13:28:02 +02:00
|
|
|
if mod.clippy != nil {
|
|
|
|
mod.AddProperties(mod.clippy.props()...)
|
|
|
|
}
|
2020-07-08 14:39:44 +02:00
|
|
|
if mod.sourceProvider != nil {
|
2020-08-05 15:36:19 +02:00
|
|
|
mod.AddProperties(mod.sourceProvider.SourceProviderProps()...)
|
2020-07-08 14:39:44 +02:00
|
|
|
}
|
2020-02-11 14:24:25 +01:00
|
|
|
if mod.sanitize != nil {
|
|
|
|
mod.AddProperties(mod.sanitize.props()...)
|
|
|
|
}
|
2020-04-09 15:56:02 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
android.InitAndroidArchModule(mod, mod.hod, mod.multilib)
|
2020-11-17 14:21:02 +01:00
|
|
|
android.InitApexModule(mod)
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
android.InitDefaultableModule(mod)
|
|
|
|
return mod
|
|
|
|
}
|
|
|
|
|
|
|
|
func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
|
|
|
return &Module{
|
|
|
|
hod: hod,
|
|
|
|
multilib: multilib,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
|
|
|
|
module := newBaseModule(hod, multilib)
|
2022-01-20 15:55:00 +01:00
|
|
|
module.afdo = &afdo{}
|
2020-04-09 15:56:02 +02:00
|
|
|
module.coverage = &coverage{}
|
2020-06-22 13:28:02 +02:00
|
|
|
module.clippy = &clippy{}
|
2020-02-11 14:24:25 +01:00
|
|
|
module.sanitize = &sanitize{}
|
2019-08-27 21:03:00 +02:00
|
|
|
return module
|
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContext interface {
|
|
|
|
android.ModuleContext
|
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
|
|
|
type BaseModuleContext interface {
|
|
|
|
android.BaseModuleContext
|
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
|
|
|
type DepsContext interface {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
ModuleContextIntf
|
|
|
|
}
|
|
|
|
|
|
|
|
type ModuleContextIntf interface {
|
2020-06-24 11:32:48 +02:00
|
|
|
RustModule() *Module
|
2019-08-27 21:03:00 +02:00
|
|
|
toolchain() config.Toolchain
|
|
|
|
}
|
|
|
|
|
|
|
|
type depsContext struct {
|
|
|
|
android.BottomUpMutatorContext
|
|
|
|
}
|
|
|
|
|
|
|
|
type moduleContext struct {
|
|
|
|
android.ModuleContext
|
|
|
|
}
|
|
|
|
|
2020-06-24 11:32:48 +02:00
|
|
|
type baseModuleContext struct {
|
|
|
|
android.BaseModuleContext
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
|
2020-06-24 11:32:48 +02:00
|
|
|
func (ctx *moduleContext) RustModule() *Module {
|
|
|
|
return ctx.Module().(*Module)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *moduleContext) toolchain() config.Toolchain {
|
|
|
|
return ctx.RustModule().toolchain(ctx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *depsContext) RustModule() *Module {
|
|
|
|
return ctx.Module().(*Module)
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
|
2020-06-24 11:32:48 +02:00
|
|
|
func (ctx *depsContext) toolchain() config.Toolchain {
|
|
|
|
return ctx.RustModule().toolchain(ctx)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-06-24 11:32:48 +02:00
|
|
|
func (ctx *baseModuleContext) RustModule() *Module {
|
|
|
|
return ctx.Module().(*Module)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *baseModuleContext) toolchain() config.Toolchain {
|
|
|
|
return ctx.RustModule().toolchain(ctx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) nativeCoverage() bool {
|
2021-05-27 20:09:11 +02:00
|
|
|
// Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
|
|
|
|
if mod.Target().NativeBridge == android.NativeBridgeEnabled {
|
|
|
|
return false
|
|
|
|
}
|
2020-06-24 11:32:48 +02:00
|
|
|
return mod.compiler != nil && mod.compiler.nativeCoverage()
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2021-04-01 15:49:36 +02:00
|
|
|
func (mod *Module) EverInstallable() bool {
|
|
|
|
return mod.compiler != nil &&
|
|
|
|
// Check to see whether the module is actually ever installable.
|
|
|
|
mod.compiler.everInstallable()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) Installable() *bool {
|
|
|
|
return mod.Properties.Installable
|
|
|
|
}
|
|
|
|
|
2022-03-23 22:31:39 +01:00
|
|
|
func (mod *Module) ProcMacro() bool {
|
|
|
|
if pm, ok := mod.compiler.(procMacroInterface); ok {
|
|
|
|
return pm.ProcMacro()
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (mod *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
|
|
|
|
if mod.cachedToolchain == nil {
|
|
|
|
mod.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
|
|
|
|
}
|
|
|
|
return mod.cachedToolchain
|
|
|
|
}
|
|
|
|
|
2020-08-27 13:37:29 +02:00
|
|
|
func (mod *Module) ccToolchain(ctx android.BaseModuleContext) cc_config.Toolchain {
|
|
|
|
return cc_config.FindToolchain(ctx.Os(), ctx.Arch())
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (d *Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
|
|
|
|
ctx := &moduleContext{
|
|
|
|
ModuleContext: actx,
|
|
|
|
}
|
|
|
|
|
2020-11-17 14:21:02 +01:00
|
|
|
apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
|
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
mod.hideApexVariantFromMake = true
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
toolchain := mod.toolchain(ctx)
|
2020-12-02 15:15:16 +01:00
|
|
|
mod.makeLinkType = cc.GetMakeLinkType(actx, mod)
|
|
|
|
|
2022-04-12 19:08:36 +02:00
|
|
|
mod.Properties.SubName = cc.GetSubnameProperty(actx, mod)
|
2021-05-27 20:09:11 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
if !toolchain.Supported() {
|
|
|
|
// This toolchain's unsupported, there's nothing to do for this mod.
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
deps := mod.depsToPaths(ctx)
|
|
|
|
flags := Flags{
|
|
|
|
Toolchain: toolchain,
|
|
|
|
}
|
|
|
|
|
2021-09-23 17:50:33 +02:00
|
|
|
// Calculate rustc flags
|
2022-01-20 15:55:00 +01:00
|
|
|
if mod.afdo != nil {
|
2023-03-10 04:07:19 +01:00
|
|
|
flags, deps = mod.afdo.flags(actx, flags, deps)
|
2022-01-20 15:55:00 +01:00
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
if mod.compiler != nil {
|
|
|
|
flags = mod.compiler.compilerFlags(ctx, flags)
|
2021-09-23 17:50:33 +02:00
|
|
|
flags = mod.compiler.cfgFlags(ctx, flags)
|
|
|
|
flags = mod.compiler.featureFlags(ctx, flags)
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
if mod.coverage != nil {
|
|
|
|
flags, deps = mod.coverage.flags(ctx, flags, deps)
|
|
|
|
}
|
2020-06-22 13:28:02 +02:00
|
|
|
if mod.clippy != nil {
|
|
|
|
flags, deps = mod.clippy.flags(ctx, flags, deps)
|
|
|
|
}
|
2020-02-11 14:24:25 +01:00
|
|
|
if mod.sanitize != nil {
|
|
|
|
flags, deps = mod.sanitize.flags(ctx, flags, deps)
|
|
|
|
}
|
2020-04-09 15:56:02 +02:00
|
|
|
|
2020-09-23 18:10:17 +02:00
|
|
|
// SourceProvider needs to call GenerateSource() before compiler calls
|
|
|
|
// compile() so it can provide the source. A SourceProvider has
|
|
|
|
// multiple variants (e.g. source, rlib, dylib). Only the "source"
|
|
|
|
// variant is responsible for effectively generating the source. The
|
|
|
|
// remaining variants relies on the "source" variant output.
|
2020-07-31 19:40:31 +02:00
|
|
|
if mod.sourceProvider != nil {
|
2020-09-23 18:10:17 +02:00
|
|
|
if mod.compiler.(libraryInterface).source() {
|
|
|
|
mod.sourceProvider.GenerateSource(ctx, deps)
|
|
|
|
mod.sourceProvider.setSubName(ctx.ModuleSubDir())
|
|
|
|
} else {
|
|
|
|
sourceMod := actx.GetDirectDepWithTag(mod.Name(), sourceDepTag)
|
|
|
|
sourceLib := sourceMod.(*Module).compiler.(*libraryDecorator)
|
2020-10-02 06:25:05 +02:00
|
|
|
mod.sourceProvider.setOutputFiles(sourceLib.sourceProvider.Srcs())
|
2020-09-23 18:10:17 +02:00
|
|
|
}
|
2020-07-31 19:40:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if mod.compiler != nil && !mod.compiler.Disabled() {
|
2021-02-25 16:30:57 +01:00
|
|
|
mod.compiler.initialize(ctx)
|
2022-04-19 05:12:56 +02:00
|
|
|
buildOutput := mod.compiler.compile(ctx, flags, deps)
|
2021-11-05 21:36:47 +01:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2022-04-19 05:12:56 +02:00
|
|
|
mod.outputFile = android.OptionalPathForPath(buildOutput.outputFile)
|
|
|
|
if buildOutput.kytheFile != nil {
|
|
|
|
mod.kytheFiles = append(mod.kytheFiles, buildOutput.kytheFile)
|
|
|
|
}
|
2021-11-05 21:36:47 +01:00
|
|
|
bloaty.MeasureSizeForPaths(ctx, mod.compiler.strippedOutputFilePath(), android.OptionalPathForPath(mod.compiler.unstrippedOutputFilePath()))
|
2020-12-15 03:02:21 +01:00
|
|
|
|
2021-03-19 23:06:02 +01:00
|
|
|
mod.docTimestampFile = mod.compiler.rustdoc(ctx, flags, deps)
|
2021-12-10 22:57:21 +01:00
|
|
|
if mod.docTimestampFile.Valid() {
|
|
|
|
ctx.CheckbuildFile(mod.docTimestampFile.Path())
|
|
|
|
}
|
2021-03-19 23:06:02 +01:00
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
|
|
|
|
// RECOVERY_SNAPSHOT_VERSION is current.
|
|
|
|
if lib, ok := mod.compiler.(snapshotLibraryInterface); ok {
|
|
|
|
if cc.ShouldCollectHeadersForSnapshot(ctx, mod, apexInfo) {
|
|
|
|
lib.collectHeadersForSnapshot(ctx, deps)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-15 03:02:21 +01:00
|
|
|
apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
|
2022-03-23 22:31:39 +01:00
|
|
|
if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) && !mod.ProcMacro() {
|
2021-10-05 02:12:41 +02:00
|
|
|
// If the module has been specifically configure to not be installed then
|
|
|
|
// hide from make as otherwise it will break when running inside make as the
|
|
|
|
// output path to install will not be specified. Not all uninstallable
|
|
|
|
// modules can be hidden from make as some are needed for resolving make
|
2022-03-23 22:31:39 +01:00
|
|
|
// side dependencies. In particular, proc-macros need to be captured in the
|
|
|
|
// host snapshot.
|
2021-10-05 02:12:41 +02:00
|
|
|
mod.HideFromMake()
|
|
|
|
} else if !mod.installable(apexInfo) {
|
|
|
|
mod.SkipInstall()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Still call install though, the installs will be stored as PackageSpecs to allow
|
|
|
|
// using the outputs in a genrule.
|
|
|
|
if mod.OutputFile().Valid() {
|
2020-08-27 13:48:36 +02:00
|
|
|
mod.compiler.install(ctx)
|
2021-10-05 02:12:41 +02:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
2021-07-23 01:20:28 +02:00
|
|
|
|
|
|
|
ctx.Phony("rust", ctx.RustModule().OutputFile().Path())
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
2023-11-17 16:27:06 +01:00
|
|
|
if mod.testModule {
|
|
|
|
ctx.SetProvider(testing.TestModuleProviderKey, testing.TestModuleProviderData{})
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) deps(ctx DepsContext) Deps {
|
|
|
|
deps := Deps{}
|
|
|
|
|
|
|
|
if mod.compiler != nil {
|
|
|
|
deps = mod.compiler.compilerDeps(ctx, deps)
|
2020-07-31 19:40:31 +02:00
|
|
|
}
|
|
|
|
if mod.sourceProvider != nil {
|
2020-08-05 15:36:19 +02:00
|
|
|
deps = mod.sourceProvider.SourceProviderDeps(ctx, deps)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
if mod.coverage != nil {
|
|
|
|
deps = mod.coverage.deps(ctx, deps)
|
|
|
|
}
|
|
|
|
|
2020-02-11 14:24:25 +01:00
|
|
|
if mod.sanitize != nil {
|
|
|
|
deps = mod.sanitize.deps(ctx, deps)
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
deps.Rlibs = android.LastUniqueStrings(deps.Rlibs)
|
|
|
|
deps.Dylibs = android.LastUniqueStrings(deps.Dylibs)
|
2020-06-29 23:34:06 +02:00
|
|
|
deps.Rustlibs = android.LastUniqueStrings(deps.Rustlibs)
|
2019-08-27 21:03:00 +02:00
|
|
|
deps.ProcMacros = android.LastUniqueStrings(deps.ProcMacros)
|
|
|
|
deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
|
|
|
|
deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
|
2022-03-07 16:41:53 +01:00
|
|
|
deps.Stdlibs = android.LastUniqueStrings(deps.Stdlibs)
|
2021-03-23 20:53:44 +01:00
|
|
|
deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
|
2019-08-27 21:03:00 +02:00
|
|
|
return deps
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
type dependencyTag struct {
|
|
|
|
blueprint.BaseDependencyTag
|
2020-12-21 18:11:10 +01:00
|
|
|
name string
|
|
|
|
library bool
|
|
|
|
procMacro bool
|
2021-12-11 00:05:02 +01:00
|
|
|
dynamic bool
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-11-25 04:44:59 +01:00
|
|
|
// InstallDepNeeded returns true for rlibs, dylibs, and proc macros so that they or their transitive
|
|
|
|
// dependencies (especially C/C++ shared libs) are installed as dependencies of a rust binary.
|
|
|
|
func (d dependencyTag) InstallDepNeeded() bool {
|
2020-12-21 18:11:10 +01:00
|
|
|
return d.library || d.procMacro
|
2020-11-25 04:44:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ android.InstallNeededDependencyTag = dependencyTag{}
|
|
|
|
|
2021-12-11 00:05:02 +01:00
|
|
|
func (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
|
|
|
|
if d.library && d.dynamic {
|
|
|
|
return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ android.LicenseAnnotationsDependencyTag = dependencyTag{}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
var (
|
2020-08-04 21:43:37 +02:00
|
|
|
customBindgenDepTag = dependencyTag{name: "customBindgenTag"}
|
|
|
|
rlibDepTag = dependencyTag{name: "rlibTag", library: true}
|
2021-12-11 00:05:02 +01:00
|
|
|
dylibDepTag = dependencyTag{name: "dylib", library: true, dynamic: true}
|
2020-12-21 18:11:10 +01:00
|
|
|
procMacroDepTag = dependencyTag{name: "procMacro", procMacro: true}
|
2020-08-04 21:43:37 +02:00
|
|
|
testPerSrcDepTag = dependencyTag{name: "rust_unit_tests"}
|
2020-09-23 18:10:17 +02:00
|
|
|
sourceDepTag = dependencyTag{name: "source"}
|
2021-11-04 19:09:38 +01:00
|
|
|
dataLibDepTag = dependencyTag{name: "data lib"}
|
|
|
|
dataBinDepTag = dependencyTag{name: "data bin"}
|
2019-08-27 21:03:00 +02:00
|
|
|
)
|
|
|
|
|
2020-11-17 14:21:02 +01:00
|
|
|
func IsDylibDepTag(depTag blueprint.DependencyTag) bool {
|
|
|
|
tag, ok := depTag.(dependencyTag)
|
|
|
|
return ok && tag == dylibDepTag
|
|
|
|
}
|
|
|
|
|
2021-04-08 11:19:15 +02:00
|
|
|
func IsRlibDepTag(depTag blueprint.DependencyTag) bool {
|
|
|
|
tag, ok := depTag.(dependencyTag)
|
|
|
|
return ok && tag == rlibDepTag
|
|
|
|
}
|
|
|
|
|
2020-06-29 23:34:06 +02:00
|
|
|
type autoDep struct {
|
|
|
|
variation string
|
|
|
|
depTag dependencyTag
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
2020-09-23 18:10:17 +02:00
|
|
|
rlibVariation = "rlib"
|
|
|
|
dylibVariation = "dylib"
|
|
|
|
rlibAutoDep = autoDep{variation: rlibVariation, depTag: rlibDepTag}
|
|
|
|
dylibAutoDep = autoDep{variation: dylibVariation, depTag: dylibDepTag}
|
2020-06-29 23:34:06 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type autoDeppable interface {
|
2021-01-26 15:18:53 +01:00
|
|
|
autoDep(ctx android.BottomUpMutatorContext) autoDep
|
2020-06-29 23:34:06 +02:00
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func (mod *Module) begin(ctx BaseModuleContext) {
|
|
|
|
if mod.coverage != nil {
|
|
|
|
mod.coverage.begin(ctx)
|
|
|
|
}
|
2020-02-11 14:24:25 +01:00
|
|
|
if mod.sanitize != nil {
|
|
|
|
mod.sanitize.begin(ctx)
|
|
|
|
}
|
2020-04-09 15:56:02 +02:00
|
|
|
}
|
|
|
|
|
2021-11-11 15:29:07 +01:00
|
|
|
func (mod *Module) Prebuilt() *android.Prebuilt {
|
2022-03-23 22:31:39 +01:00
|
|
|
if p, ok := mod.compiler.(rustPrebuilt); ok {
|
2021-11-11 15:29:07 +01:00
|
|
|
return p.prebuilt()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-03-16 02:36:16 +01:00
|
|
|
func rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string {
|
|
|
|
if rustDep, ok := dep.(*Module); ok {
|
|
|
|
// Use base module name for snapshots when exporting to Makefile.
|
|
|
|
if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok {
|
|
|
|
baseName := rustDep.BaseModuleName()
|
|
|
|
return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return cc.MakeLibName(ctx, c, dep, depName)
|
|
|
|
}
|
|
|
|
|
2023-09-22 05:30:26 +02:00
|
|
|
func collectIncludedProtos(mod *Module, dep *Module) {
|
|
|
|
if protoMod, ok := mod.sourceProvider.(*protobufDecorator); ok {
|
|
|
|
if _, ok := dep.sourceProvider.(*protobufDecorator); ok {
|
|
|
|
protoMod.additionalCrates = append(protoMod.additionalCrates, dep.CrateName())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
|
|
|
var depPaths PathDeps
|
|
|
|
|
|
|
|
directRlibDeps := []*Module{}
|
|
|
|
directDylibDeps := []*Module{}
|
|
|
|
directProcMacroDeps := []*Module{}
|
2021-06-11 10:22:09 +02:00
|
|
|
directSharedLibDeps := []cc.SharedLibraryInfo{}
|
2019-10-18 23:49:46 +02:00
|
|
|
directStaticLibDeps := [](cc.LinkableInterface){}
|
2020-07-22 22:09:13 +02:00
|
|
|
directSrcProvidersDeps := []*Module{}
|
|
|
|
directSrcDeps := [](android.SourceFileProducer){}
|
2019-08-27 21:03:00 +02:00
|
|
|
|
2021-11-09 17:26:04 +01:00
|
|
|
// For the dependency from platform to apex, use the latest stubs
|
|
|
|
mod.apexSdkVersion = android.FutureApiLevel
|
|
|
|
apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
|
|
|
|
if !apexInfo.IsForPlatform() {
|
|
|
|
mod.apexSdkVersion = apexInfo.MinSdkVersion
|
|
|
|
}
|
|
|
|
|
|
|
|
if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
|
|
|
|
// In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
|
|
|
|
// so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
|
|
|
|
// (b/144430859)
|
|
|
|
mod.apexSdkVersion = android.FutureApiLevel
|
|
|
|
}
|
|
|
|
|
2023-03-16 23:51:40 +01:00
|
|
|
skipModuleList := map[string]bool{}
|
|
|
|
|
|
|
|
var apiImportInfo multitree.ApiImportInfo
|
|
|
|
hasApiImportInfo := false
|
|
|
|
|
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
if dep.Name() == "api_imports" {
|
|
|
|
apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
|
|
|
|
hasApiImportInfo = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
if hasApiImportInfo {
|
|
|
|
targetStubModuleList := map[string]string{}
|
|
|
|
targetOrigModuleList := map[string]string{}
|
|
|
|
|
|
|
|
// Search for dependency which both original module and API imported library with APEX stub exists
|
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
|
|
|
|
targetStubModuleList[apiLibrary] = depName
|
|
|
|
}
|
|
|
|
})
|
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
if origLibrary, ok := targetStubModuleList[depName]; ok {
|
|
|
|
targetOrigModuleList[origLibrary] = depName
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
// Decide which library should be used between original and API imported library
|
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
if apiLibrary, ok := targetOrigModuleList[depName]; ok {
|
|
|
|
if cc.ShouldUseStubForApex(ctx, dep) {
|
|
|
|
skipModuleList[depName] = true
|
|
|
|
} else {
|
|
|
|
skipModuleList[apiLibrary] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2023-08-18 02:42:26 +02:00
|
|
|
var transitiveAndroidMkSharedLibs []*android.DepSet[string]
|
|
|
|
var directAndroidMkSharedLibs []string
|
2023-09-22 05:58:59 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
ctx.VisitDirectDeps(func(dep android.Module) {
|
|
|
|
depName := ctx.OtherModuleName(dep)
|
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
2021-04-02 18:41:32 +02:00
|
|
|
|
2023-03-16 23:51:40 +01:00
|
|
|
if _, exists := skipModuleList[depName]; exists {
|
|
|
|
return
|
|
|
|
}
|
2023-08-15 06:09:47 +02:00
|
|
|
|
|
|
|
if depTag == android.DarwinUniversalVariantTag {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-07-31 17:01:18 +02:00
|
|
|
if rustDep, ok := dep.(*Module); ok && !rustDep.CcLibraryInterface() {
|
2019-08-27 21:03:00 +02:00
|
|
|
//Handle Rust Modules
|
2023-03-16 02:36:16 +01:00
|
|
|
makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName)
|
2019-09-13 23:23:15 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
switch depTag {
|
|
|
|
case dylibDepTag:
|
|
|
|
dylib, ok := rustDep.compiler.(libraryInterface)
|
|
|
|
if !ok || !dylib.dylib() {
|
|
|
|
ctx.ModuleErrorf("mod %q not an dylib library", depName)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
directDylibDeps = append(directDylibDeps, rustDep)
|
2021-04-02 18:41:32 +02:00
|
|
|
mod.Properties.AndroidMkDylibs = append(mod.Properties.AndroidMkDylibs, makeLibName)
|
2023-07-13 17:01:41 +02:00
|
|
|
mod.Properties.SnapshotDylibs = append(mod.Properties.SnapshotDylibs, cc.BaseLibName(depName))
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
case rlibDepTag:
|
2023-09-22 05:58:59 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
rlib, ok := rustDep.compiler.(libraryInterface)
|
|
|
|
if !ok || !rlib.rlib() {
|
2021-04-02 18:41:32 +02:00
|
|
|
ctx.ModuleErrorf("mod %q not an rlib library", makeLibName)
|
2019-08-27 21:03:00 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
directRlibDeps = append(directRlibDeps, rustDep)
|
2021-04-02 18:41:32 +02:00
|
|
|
mod.Properties.AndroidMkRlibs = append(mod.Properties.AndroidMkRlibs, makeLibName)
|
2023-07-13 17:01:41 +02:00
|
|
|
mod.Properties.SnapshotRlibs = append(mod.Properties.SnapshotRlibs, cc.BaseLibName(depName))
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
case procMacroDepTag:
|
|
|
|
directProcMacroDeps = append(directProcMacroDeps, rustDep)
|
2021-04-02 18:41:32 +02:00
|
|
|
mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName)
|
2023-09-22 05:30:26 +02:00
|
|
|
|
|
|
|
case sourceDepTag:
|
|
|
|
if _, ok := mod.sourceProvider.(*protobufDecorator); ok {
|
|
|
|
collectIncludedProtos(mod, rustDep)
|
|
|
|
}
|
Support customizing behavior around sourceOrOutputDependencyTag
Previously, modules customized behavior around the handling of
sourceOrOutputDependencyTag by comparing them to android.SourceDepTag
and retrieving the module using something like this:
ctx.GetDirectDepWithTag(m, android.SourceDepTag)
The problem with that is it does not allow an output tag to be
specified and does not handle fully qualified names properly.
This adds the following:
* IsSourceDepTag and IsSourceDepTagWithOutputTag to check whether a
blueprint.DependencyTag is a sourceOrOutputDependencyTag. The latter
also checks that it has the correct output tag.
* GetModuleFromPathDep(ctx, moduleName, outputTag) as a replacement for
ctx.GetDirectDepWithTag(m, android.SourceDepTag).
Replaces usages of:
* t == SourceDepTag with IsSourceDepTagWithOutputTag(t, "")
* ctx.GetDirectDepWithTag(m, android.SourceDepTag) with
GetModuleFromPathDep(ctx, m, "")
It also deprecates the following:
* android.SourcDepTag - as a follow up change needs to modify the
sourceOrOutputDependencyTag will make this useless.
* ExpandSources, ExpandsSources - copies existing deprecated messages
from the implementation to the interface so that they can be seen
by users of that interface.
Bug: 193228441
Test: m nothing
Change-Id: I8c397232b8d7dc1f9702c04ad45ea7819d4631ae
2021-07-09 18:38:55 +02:00
|
|
|
}
|
|
|
|
|
2023-08-18 02:42:26 +02:00
|
|
|
transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs)
|
|
|
|
|
Support customizing behavior around sourceOrOutputDependencyTag
Previously, modules customized behavior around the handling of
sourceOrOutputDependencyTag by comparing them to android.SourceDepTag
and retrieving the module using something like this:
ctx.GetDirectDepWithTag(m, android.SourceDepTag)
The problem with that is it does not allow an output tag to be
specified and does not handle fully qualified names properly.
This adds the following:
* IsSourceDepTag and IsSourceDepTagWithOutputTag to check whether a
blueprint.DependencyTag is a sourceOrOutputDependencyTag. The latter
also checks that it has the correct output tag.
* GetModuleFromPathDep(ctx, moduleName, outputTag) as a replacement for
ctx.GetDirectDepWithTag(m, android.SourceDepTag).
Replaces usages of:
* t == SourceDepTag with IsSourceDepTagWithOutputTag(t, "")
* ctx.GetDirectDepWithTag(m, android.SourceDepTag) with
GetModuleFromPathDep(ctx, m, "")
It also deprecates the following:
* android.SourcDepTag - as a follow up change needs to modify the
sourceOrOutputDependencyTag will make this useless.
* ExpandSources, ExpandsSources - copies existing deprecated messages
from the implementation to the interface so that they can be seen
by users of that interface.
Bug: 193228441
Test: m nothing
Change-Id: I8c397232b8d7dc1f9702c04ad45ea7819d4631ae
2021-07-09 18:38:55 +02:00
|
|
|
if android.IsSourceDepTagWithOutputTag(depTag, "") {
|
2020-07-22 22:09:13 +02:00
|
|
|
// Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct
|
|
|
|
// OS/Arch variant is used.
|
|
|
|
var helper string
|
|
|
|
if ctx.Host() {
|
|
|
|
helper = "missing 'host_supported'?"
|
|
|
|
} else {
|
|
|
|
helper = "device module defined?"
|
|
|
|
}
|
|
|
|
|
|
|
|
if dep.Target().Os != ctx.Os() {
|
|
|
|
ctx.ModuleErrorf("OS mismatch on dependency %q (%s)", dep.Name(), helper)
|
|
|
|
return
|
|
|
|
} else if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
|
|
|
|
ctx.ModuleErrorf("Arch mismatch on dependency %q (%s)", dep.Name(), helper)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
directSrcProvidersDeps = append(directSrcProvidersDeps, rustDep)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-08-07 15:00:50 +02:00
|
|
|
//Append the dependencies exportedDirs, except for proc-macros which target a different arch/OS
|
2020-09-18 23:15:30 +02:00
|
|
|
if depTag != procMacroDepTag {
|
|
|
|
exportedInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
|
|
|
|
depPaths.linkDirs = append(depPaths.linkDirs, exportedInfo.LinkDirs...)
|
|
|
|
depPaths.depFlags = append(depPaths.depFlags, exportedInfo.Flags...)
|
|
|
|
depPaths.linkObjects = append(depPaths.linkObjects, exportedInfo.LinkObjects...)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if depTag == dylibDepTag || depTag == rlibDepTag || depTag == procMacroDepTag {
|
2021-11-05 21:36:47 +01:00
|
|
|
linkFile := rustDep.UnstrippedOutputFile()
|
2023-09-22 05:58:59 +02:00
|
|
|
linkDir := linkPathFromFilePath(linkFile)
|
2020-06-25 18:34:12 +02:00
|
|
|
if lib, ok := mod.compiler.(exportedFlagsProducer); ok {
|
2023-09-22 05:58:59 +02:00
|
|
|
lib.exportLinkDirs(linkDir)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
}
|
2023-09-22 05:30:26 +02:00
|
|
|
if depTag == sourceDepTag {
|
|
|
|
if _, ok := mod.sourceProvider.(*protobufDecorator); ok && mod.Source() {
|
|
|
|
if _, ok := rustDep.sourceProvider.(*protobufDecorator); ok {
|
|
|
|
exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo)
|
|
|
|
depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-07-31 17:01:18 +02:00
|
|
|
} else if ccDep, ok := dep.(cc.LinkableInterface); ok {
|
2019-10-18 23:49:46 +02:00
|
|
|
//Handle C dependencies
|
2021-04-02 18:41:32 +02:00
|
|
|
makeLibName := cc.MakeLibName(ctx, mod, ccDep, depName)
|
2019-10-18 23:49:46 +02:00
|
|
|
if _, ok := ccDep.(*Module); !ok {
|
|
|
|
if ccDep.Module().Target().Os != ctx.Os() {
|
|
|
|
ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if ccDep.Module().Target().Arch.ArchType != ctx.Arch().ArchType {
|
|
|
|
ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName)
|
|
|
|
return
|
|
|
|
}
|
2019-09-13 23:23:15 +02:00
|
|
|
}
|
2020-08-25 18:48:19 +02:00
|
|
|
linkObject := ccDep.OutputFile()
|
|
|
|
if !linkObject.Valid() {
|
2023-08-01 18:57:22 +02:00
|
|
|
if !ctx.Config().AllowMissingDependencies() {
|
|
|
|
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
|
|
|
|
} else {
|
|
|
|
ctx.AddMissingDependencies([]string{depName})
|
|
|
|
}
|
|
|
|
return
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 05:58:59 +02:00
|
|
|
linkPath := linkPathFromFilePath(linkObject.Path())
|
2023-08-01 18:57:22 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
exportDep := false
|
2020-07-28 06:26:48 +02:00
|
|
|
switch {
|
|
|
|
case cc.IsStaticDepTag(depTag):
|
2021-03-23 20:53:44 +01:00
|
|
|
if cc.IsWholeStaticLib(depTag) {
|
|
|
|
// rustc will bundle static libraries when they're passed with "-lstatic=<lib>". This will fail
|
|
|
|
// if the library is not prefixed by "lib".
|
2021-11-01 14:04:23 +01:00
|
|
|
if mod.Binary() {
|
|
|
|
// Binaries may sometimes need to link whole static libraries that don't start with 'lib'.
|
|
|
|
// Since binaries don't need to 'rebundle' these like libraries and only use these for the
|
|
|
|
// final linkage, pass the args directly to the linker to handle these cases.
|
|
|
|
depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", linkObject.Path().String(), "-Wl,--no-whole-archive"}...)
|
|
|
|
} else if libName, ok := libNameFromFilePath(linkObject.Path()); ok {
|
2021-02-05 18:27:08 +01:00
|
|
|
depPaths.depFlags = append(depPaths.depFlags, "-lstatic="+libName)
|
2021-03-23 20:53:44 +01:00
|
|
|
} else {
|
|
|
|
ctx.ModuleErrorf("'%q' cannot be listed as a whole_static_library in Rust modules unless the output is prefixed by 'lib'", depName, ctx.ModuleName())
|
2021-02-05 18:27:08 +01:00
|
|
|
}
|
2021-02-04 17:29:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add this to linkObjects to pass the library directly to the linker as well. This propagates
|
|
|
|
// to dependencies to avoid having to redeclare static libraries for dependents of the dylib variant.
|
2023-10-02 20:39:17 +02:00
|
|
|
depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
|
2021-02-04 17:29:41 +01:00
|
|
|
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
|
|
|
|
|
2020-09-18 23:15:30 +02:00
|
|
|
exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo)
|
|
|
|
depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
|
|
|
|
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
|
|
|
|
depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...)
|
|
|
|
depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
|
2019-08-27 21:03:00 +02:00
|
|
|
directStaticLibDeps = append(directStaticLibDeps, ccDep)
|
2022-02-16 00:15:07 +01:00
|
|
|
|
|
|
|
// Record baseLibName for snapshots.
|
|
|
|
mod.Properties.SnapshotStaticLibs = append(mod.Properties.SnapshotStaticLibs, cc.BaseLibName(depName))
|
|
|
|
|
2021-04-02 18:41:32 +02:00
|
|
|
mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, makeLibName)
|
2020-07-28 06:26:48 +02:00
|
|
|
case cc.IsSharedDepTag(depTag):
|
2021-06-11 10:22:09 +02:00
|
|
|
// For the shared lib dependencies, we may link to the stub variant
|
|
|
|
// of the dependency depending on the context (e.g. if this
|
|
|
|
// dependency crosses the APEX boundaries).
|
|
|
|
sharedLibraryInfo, exportedInfo := cc.ChooseStubOrImpl(ctx, dep)
|
|
|
|
|
|
|
|
// Re-get linkObject as ChooseStubOrImpl actually tells us which
|
|
|
|
// object (either from stub or non-stub) to use.
|
|
|
|
linkObject = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
|
2023-08-01 18:57:22 +02:00
|
|
|
if !linkObject.Valid() {
|
|
|
|
if !ctx.Config().AllowMissingDependencies() {
|
|
|
|
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
|
|
|
|
} else {
|
|
|
|
ctx.AddMissingDependencies([]string{depName})
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2023-09-22 05:58:59 +02:00
|
|
|
linkPath = linkPathFromFilePath(linkObject.Path())
|
2021-06-11 10:22:09 +02:00
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
|
2023-10-02 20:39:17 +02:00
|
|
|
depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
|
2020-09-18 23:15:30 +02:00
|
|
|
depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
|
|
|
|
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
|
|
|
|
depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...)
|
|
|
|
depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
|
2021-06-11 10:22:09 +02:00
|
|
|
directSharedLibDeps = append(directSharedLibDeps, sharedLibraryInfo)
|
2021-05-20 19:39:16 +02:00
|
|
|
|
|
|
|
// Record baseLibName for snapshots.
|
|
|
|
mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName))
|
|
|
|
|
2023-08-18 02:42:26 +02:00
|
|
|
directAndroidMkSharedLibs = append(directAndroidMkSharedLibs, makeLibName)
|
2019-08-27 21:03:00 +02:00
|
|
|
exportDep = true
|
2020-11-06 20:56:27 +01:00
|
|
|
case cc.IsHeaderDepTag(depTag):
|
|
|
|
exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo)
|
|
|
|
depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
|
|
|
|
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
|
|
|
|
depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
|
2020-07-28 06:26:48 +02:00
|
|
|
case depTag == cc.CrtBeginDepTag:
|
2022-01-24 05:46:16 +01:00
|
|
|
depPaths.CrtBegin = append(depPaths.CrtBegin, linkObject.Path())
|
2020-07-28 06:26:48 +02:00
|
|
|
case depTag == cc.CrtEndDepTag:
|
2022-01-24 05:46:16 +01:00
|
|
|
depPaths.CrtEnd = append(depPaths.CrtEnd, linkObject.Path())
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure these dependencies are propagated
|
2020-06-25 18:34:12 +02:00
|
|
|
if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep {
|
|
|
|
lib.exportLinkDirs(linkPath)
|
2023-10-02 20:39:17 +02:00
|
|
|
lib.exportLinkObjects(linkObject.String())
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
2022-01-25 02:22:45 +01:00
|
|
|
} else {
|
|
|
|
switch {
|
|
|
|
case depTag == cc.CrtBeginDepTag:
|
|
|
|
depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
|
|
|
|
case depTag == cc.CrtEndDepTag:
|
|
|
|
depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
2020-07-31 17:01:18 +02:00
|
|
|
|
|
|
|
if srcDep, ok := dep.(android.SourceFileProducer); ok {
|
Support customizing behavior around sourceOrOutputDependencyTag
Previously, modules customized behavior around the handling of
sourceOrOutputDependencyTag by comparing them to android.SourceDepTag
and retrieving the module using something like this:
ctx.GetDirectDepWithTag(m, android.SourceDepTag)
The problem with that is it does not allow an output tag to be
specified and does not handle fully qualified names properly.
This adds the following:
* IsSourceDepTag and IsSourceDepTagWithOutputTag to check whether a
blueprint.DependencyTag is a sourceOrOutputDependencyTag. The latter
also checks that it has the correct output tag.
* GetModuleFromPathDep(ctx, moduleName, outputTag) as a replacement for
ctx.GetDirectDepWithTag(m, android.SourceDepTag).
Replaces usages of:
* t == SourceDepTag with IsSourceDepTagWithOutputTag(t, "")
* ctx.GetDirectDepWithTag(m, android.SourceDepTag) with
GetModuleFromPathDep(ctx, m, "")
It also deprecates the following:
* android.SourcDepTag - as a follow up change needs to modify the
sourceOrOutputDependencyTag will make this useless.
* ExpandSources, ExpandsSources - copies existing deprecated messages
from the implementation to the interface so that they can be seen
by users of that interface.
Bug: 193228441
Test: m nothing
Change-Id: I8c397232b8d7dc1f9702c04ad45ea7819d4631ae
2021-07-09 18:38:55 +02:00
|
|
|
if android.IsSourceDepTagWithOutputTag(depTag, "") {
|
2020-07-31 17:01:18 +02:00
|
|
|
// These are usually genrules which don't have per-target variants.
|
|
|
|
directSrcDeps = append(directSrcDeps, srcDep)
|
|
|
|
}
|
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
})
|
|
|
|
|
2023-09-22 05:58:59 +02:00
|
|
|
mod.transitiveAndroidMkSharedLibs = android.NewDepSet[string](android.PREORDER, directAndroidMkSharedLibs, transitiveAndroidMkSharedLibs)
|
|
|
|
|
|
|
|
var rlibDepFiles RustLibraries
|
|
|
|
for _, dep := range directRlibDeps {
|
|
|
|
rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()})
|
|
|
|
}
|
|
|
|
var dylibDepFiles RustLibraries
|
|
|
|
for _, dep := range directDylibDeps {
|
|
|
|
dylibDepFiles = append(dylibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()})
|
|
|
|
}
|
|
|
|
var procMacroDepFiles RustLibraries
|
|
|
|
for _, dep := range directProcMacroDeps {
|
|
|
|
procMacroDepFiles = append(procMacroDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()})
|
|
|
|
}
|
|
|
|
|
2023-10-02 20:39:17 +02:00
|
|
|
var staticLibDepFiles android.Paths
|
2019-08-27 21:03:00 +02:00
|
|
|
for _, dep := range directStaticLibDeps {
|
2023-10-02 20:39:17 +02:00
|
|
|
staticLibDepFiles = append(staticLibDepFiles, dep.OutputFile().Path())
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2023-10-02 20:39:17 +02:00
|
|
|
var sharedLibFiles android.Paths
|
|
|
|
var sharedLibDepFiles android.Paths
|
2019-08-27 21:03:00 +02:00
|
|
|
for _, dep := range directSharedLibDeps {
|
2023-10-02 20:39:17 +02:00
|
|
|
sharedLibFiles = append(sharedLibFiles, dep.SharedLibrary)
|
2021-06-11 10:22:09 +02:00
|
|
|
if dep.TableOfContents.Valid() {
|
2023-10-02 20:39:17 +02:00
|
|
|
sharedLibDepFiles = append(sharedLibDepFiles, dep.TableOfContents.Path())
|
2021-01-21 21:23:29 +01:00
|
|
|
} else {
|
2023-10-02 20:39:17 +02:00
|
|
|
sharedLibDepFiles = append(sharedLibDepFiles, dep.SharedLibrary)
|
2021-01-21 21:23:29 +01:00
|
|
|
}
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2020-07-22 22:09:13 +02:00
|
|
|
var srcProviderDepFiles android.Paths
|
|
|
|
for _, dep := range directSrcProvidersDeps {
|
|
|
|
srcs, _ := dep.OutputFiles("")
|
|
|
|
srcProviderDepFiles = append(srcProviderDepFiles, srcs...)
|
|
|
|
}
|
|
|
|
for _, dep := range directSrcDeps {
|
|
|
|
srcs := dep.Srcs()
|
|
|
|
srcProviderDepFiles = append(srcProviderDepFiles, srcs...)
|
|
|
|
}
|
|
|
|
|
2023-09-22 05:58:59 +02:00
|
|
|
depPaths.RLibs = append(depPaths.RLibs, rlibDepFiles...)
|
|
|
|
depPaths.DyLibs = append(depPaths.DyLibs, dylibDepFiles...)
|
2023-10-02 20:39:17 +02:00
|
|
|
depPaths.SharedLibs = append(depPaths.SharedLibs, sharedLibFiles...)
|
|
|
|
depPaths.SharedLibDeps = append(depPaths.SharedLibDeps, sharedLibDepFiles...)
|
|
|
|
depPaths.StaticLibs = append(depPaths.StaticLibs, staticLibDepFiles...)
|
2023-09-22 05:58:59 +02:00
|
|
|
depPaths.ProcMacros = append(depPaths.ProcMacros, procMacroDepFiles...)
|
2020-07-22 22:09:13 +02:00
|
|
|
depPaths.SrcDeps = append(depPaths.SrcDeps, srcProviderDepFiles...)
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
// Dedup exported flags from dependencies
|
2023-09-22 05:58:59 +02:00
|
|
|
depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs)
|
2023-10-02 20:39:17 +02:00
|
|
|
depPaths.linkObjects = android.FirstUniqueStrings(depPaths.linkObjects)
|
2019-08-27 21:03:00 +02:00
|
|
|
depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags)
|
2020-07-24 22:05:01 +02:00
|
|
|
depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags)
|
|
|
|
depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths)
|
|
|
|
depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths)
|
2019-08-27 21:03:00 +02:00
|
|
|
|
|
|
|
return depPaths
|
|
|
|
}
|
|
|
|
|
2019-12-13 04:36:05 +01:00
|
|
|
func (mod *Module) InstallInData() bool {
|
|
|
|
if mod.compiler == nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return mod.compiler.inData()
|
|
|
|
}
|
|
|
|
|
2021-08-19 22:10:05 +02:00
|
|
|
func (mod *Module) InstallInRamdisk() bool {
|
|
|
|
return mod.InRamdisk()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) InstallInVendorRamdisk() bool {
|
|
|
|
return mod.InVendorRamdisk()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) InstallInRecovery() bool {
|
|
|
|
return mod.InRecovery()
|
|
|
|
}
|
|
|
|
|
2023-09-22 05:58:59 +02:00
|
|
|
func linkPathFromFilePath(filepath android.Path) string {
|
|
|
|
return strings.Split(filepath.String(), filepath.Base())[0]
|
|
|
|
}
|
|
|
|
|
2023-03-16 23:51:40 +01:00
|
|
|
// usePublicApi returns true if the rust variant should link against NDK (publicapi)
|
|
|
|
func (r *Module) usePublicApi() bool {
|
|
|
|
return r.Device() && r.UseSdk()
|
|
|
|
}
|
|
|
|
|
|
|
|
// useVendorApi returns true if the rust variant should link against LLNDK (vendorapi)
|
|
|
|
func (r *Module) useVendorApi() bool {
|
|
|
|
return r.Device() && (r.InVendor() || r.InProduct())
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
|
|
|
ctx := &depsContext{
|
|
|
|
BottomUpMutatorContext: actx,
|
|
|
|
}
|
|
|
|
|
|
|
|
deps := mod.deps(ctx)
|
2020-10-01 00:34:40 +02:00
|
|
|
var commonDepVariations []blueprint.Variation
|
2021-05-20 19:39:16 +02:00
|
|
|
var snapshotInfo *cc.SnapshotInfo
|
|
|
|
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
apiImportInfo := cc.GetApiImports(mod, actx)
|
2023-03-16 23:51:40 +01:00
|
|
|
if mod.usePublicApi() || mod.useVendorApi() {
|
|
|
|
for idx, lib := range deps.SharedLibs {
|
|
|
|
deps.SharedLibs[idx] = cc.GetReplaceModuleName(lib, apiImportInfo.SharedLibs)
|
|
|
|
}
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
}
|
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
if ctx.Os() == android.Android {
|
|
|
|
deps.SharedLibs, _ = cc.RewriteLibs(mod, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
|
|
|
|
}
|
2020-09-28 19:22:45 +02:00
|
|
|
|
2020-09-08 18:46:52 +02:00
|
|
|
stdLinkage := "dylib-std"
|
2020-09-28 19:22:45 +02:00
|
|
|
if mod.compiler.stdLinkage(ctx) == RlibLinkage {
|
2020-09-08 18:46:52 +02:00
|
|
|
stdLinkage = "rlib-std"
|
|
|
|
}
|
|
|
|
|
|
|
|
rlibDepVariations := commonDepVariations
|
2021-05-20 19:39:16 +02:00
|
|
|
|
2020-09-08 18:46:52 +02:00
|
|
|
if lib, ok := mod.compiler.(libraryInterface); !ok || !lib.sysroot() {
|
|
|
|
rlibDepVariations = append(rlibDepVariations,
|
|
|
|
blueprint.Variation{Mutator: "rust_stdlinkage", Variation: stdLinkage})
|
|
|
|
}
|
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// rlibs
|
2022-04-07 18:59:11 +02:00
|
|
|
rlibDepVariations = append(rlibDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: rlibVariation})
|
2021-06-01 21:09:53 +02:00
|
|
|
for _, lib := range deps.Rlibs {
|
|
|
|
depTag := rlibDepTag
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs)
|
2021-06-01 21:09:53 +02:00
|
|
|
|
2022-04-07 18:59:11 +02:00
|
|
|
actx.AddVariationDependencies(rlibDepVariations, depTag, lib)
|
2021-06-01 21:09:53 +02:00
|
|
|
}
|
2021-05-20 19:39:16 +02:00
|
|
|
|
|
|
|
// dylibs
|
2023-07-13 17:01:41 +02:00
|
|
|
dylibDepVariations := append(commonDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: dylibVariation})
|
|
|
|
for _, lib := range deps.Dylibs {
|
|
|
|
addDylibDependency(actx, lib, mod, &snapshotInfo, dylibDepVariations, dylibDepTag)
|
|
|
|
}
|
2019-10-18 23:49:46 +02:00
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// rustlibs
|
2023-09-22 05:30:26 +02:00
|
|
|
if deps.Rustlibs != nil {
|
|
|
|
if !mod.compiler.Disabled() {
|
|
|
|
for _, lib := range deps.Rustlibs {
|
|
|
|
autoDep := mod.compiler.(autoDeppable).autoDep(ctx)
|
|
|
|
if autoDep.depTag == rlibDepTag {
|
|
|
|
// Handle the rlib deptag case
|
|
|
|
addRlibDependency(actx, lib, mod, &snapshotInfo, rlibDepVariations)
|
|
|
|
} else {
|
|
|
|
// autoDep.depTag is a dylib depTag. Not all rustlibs may be available as a dylib however.
|
|
|
|
// Check for the existence of the dylib deptag variant. Select it if available,
|
|
|
|
// otherwise select the rlib variant.
|
|
|
|
autoDepVariations := append(commonDepVariations,
|
|
|
|
blueprint.Variation{Mutator: "rust_libraries", Variation: autoDep.variation})
|
|
|
|
|
|
|
|
replacementLib := cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Dylibs)
|
2023-07-13 17:01:41 +02:00
|
|
|
|
2023-09-22 05:30:26 +02:00
|
|
|
if actx.OtherModuleDependencyVariantExists(autoDepVariations, replacementLib) {
|
|
|
|
addDylibDependency(actx, lib, mod, &snapshotInfo, autoDepVariations, autoDep.depTag)
|
|
|
|
} else {
|
|
|
|
// If there's no dylib dependency available, try to add the rlib dependency instead.
|
|
|
|
addRlibDependency(actx, lib, mod, &snapshotInfo, rlibDepVariations)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if _, ok := mod.sourceProvider.(*protobufDecorator); ok {
|
|
|
|
for _, lib := range deps.Rustlibs {
|
2023-07-13 17:01:41 +02:00
|
|
|
replacementLib := cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Dylibs)
|
2023-09-22 05:30:26 +02:00
|
|
|
srcProviderVariations := append(commonDepVariations,
|
|
|
|
blueprint.Variation{Mutator: "rust_libraries", Variation: "source"})
|
2023-07-13 17:01:41 +02:00
|
|
|
|
2023-09-22 05:30:26 +02:00
|
|
|
if actx.OtherModuleDependencyVariantExists(srcProviderVariations, replacementLib) {
|
|
|
|
actx.AddVariationDependencies(srcProviderVariations, sourceDepTag, lib)
|
2022-04-07 18:59:11 +02:00
|
|
|
}
|
2021-06-01 21:09:53 +02:00
|
|
|
}
|
2020-09-08 18:46:52 +02:00
|
|
|
}
|
|
|
|
}
|
2023-09-22 05:30:26 +02:00
|
|
|
|
2021-05-20 19:39:16 +02:00
|
|
|
// stdlibs
|
2020-09-08 18:46:52 +02:00
|
|
|
if deps.Stdlibs != nil {
|
2020-09-28 19:22:45 +02:00
|
|
|
if mod.compiler.stdLinkage(ctx) == RlibLinkage {
|
2021-06-01 21:09:53 +02:00
|
|
|
for _, lib := range deps.Stdlibs {
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs)
|
2021-06-01 21:09:53 +02:00
|
|
|
actx.AddVariationDependencies(append(commonDepVariations, []blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}...),
|
2023-07-13 17:01:41 +02:00
|
|
|
rlibDepTag, lib)
|
2021-06-01 21:09:53 +02:00
|
|
|
}
|
2020-09-08 18:46:52 +02:00
|
|
|
} else {
|
2023-07-13 17:01:41 +02:00
|
|
|
for _, lib := range deps.Stdlibs {
|
|
|
|
addDylibDependency(actx, lib, mod, &snapshotInfo, dylibDepVariations, dylibDepTag)
|
|
|
|
}
|
2020-09-08 18:46:52 +02:00
|
|
|
}
|
2020-06-29 23:34:06 +02:00
|
|
|
}
|
2021-05-20 19:39:16 +02:00
|
|
|
|
|
|
|
for _, lib := range deps.SharedLibs {
|
|
|
|
depTag := cc.SharedDepTag()
|
|
|
|
name, version := cc.StubsLibNameAndVersion(lib)
|
|
|
|
|
|
|
|
variations := []blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}
|
2023-03-16 23:51:40 +01:00
|
|
|
// For core variant, add a dep on the implementation (if it exists) and its .apiimport (if it exists)
|
|
|
|
// GenerateAndroidBuildActions will pick the correct impl/stub based on the api_domain boundary
|
|
|
|
if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
|
|
|
|
cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, name, version, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
|
|
|
|
cc.AddSharedLibDependenciesWithVersions(ctx, mod, variations, depTag, apiLibraryName, version, false)
|
|
|
|
}
|
2021-05-20 19:39:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, lib := range deps.WholeStaticLibs {
|
|
|
|
depTag := cc.StaticDepTag(true)
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).StaticLibs)
|
2021-05-20 19:39:16 +02:00
|
|
|
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, lib := range deps.StaticLibs {
|
|
|
|
depTag := cc.StaticDepTag(false)
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).StaticLibs)
|
2021-05-20 19:39:16 +02:00
|
|
|
|
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "static"},
|
|
|
|
}, depTag, lib)
|
|
|
|
}
|
2019-09-23 19:10:40 +02:00
|
|
|
|
2020-11-06 20:56:27 +01:00
|
|
|
actx.AddVariationDependencies(nil, cc.HeaderDepTag(), deps.HeaderLibs...)
|
|
|
|
|
2020-09-26 03:47:38 +02:00
|
|
|
crtVariations := cc.GetCrtVariations(ctx, mod)
|
2022-01-24 05:46:16 +01:00
|
|
|
for _, crt := range deps.CrtBegin {
|
2021-05-20 19:39:16 +02:00
|
|
|
actx.AddVariationDependencies(crtVariations, cc.CrtBeginDepTag,
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
cc.GetReplaceModuleName(crt, cc.GetSnapshot(mod, &snapshotInfo, actx).Objects))
|
2019-09-20 20:00:37 +02:00
|
|
|
}
|
2022-01-24 05:46:16 +01:00
|
|
|
for _, crt := range deps.CrtEnd {
|
2021-05-20 19:39:16 +02:00
|
|
|
actx.AddVariationDependencies(crtVariations, cc.CrtEndDepTag,
|
Introduce cc_api_library
Introduce cc_api_library, which reflects imported API from other
inner-tree. This cc_api_library module type will later refer from
the other ninja module which generates stub library from the interface
description.
Tested environment :
* original libc definition has been removed temporarily, to ensure that
imported api stub library is being used from build
* Added new definition of libc as below
cc_api_library {
name: "libc",
arch: {
x86: {
src: "libs/x86/libc.so",
},
x86_64: {
src: "libs/x86_64/libc.so",
},
},
header_libs: [
"libc_headers",
],
export_header_lib_headers: ["libc_headers"],
min_sdk_version: "9",
vendor_available: true,
}
Bug: 236087698
Test: `ALLOW_MISSING_DEPENDENCIES=true m vendorimage` succeeded
Change-Id: I67070b0f3561aa2afd73b6c1c0fdf4255218baac
2022-07-26 02:48:22 +02:00
|
|
|
cc.GetReplaceModuleName(crt, cc.GetSnapshot(mod, &snapshotInfo, actx).Objects))
|
2019-09-20 20:00:37 +02:00
|
|
|
}
|
|
|
|
|
2020-08-04 21:43:37 +02:00
|
|
|
if mod.sourceProvider != nil {
|
|
|
|
if bindgen, ok := mod.sourceProvider.(*bindgenDecorator); ok &&
|
|
|
|
bindgen.Properties.Custom_bindgen != "" {
|
|
|
|
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), customBindgenDepTag,
|
|
|
|
bindgen.Properties.Custom_bindgen)
|
|
|
|
}
|
|
|
|
}
|
2021-05-20 19:39:16 +02:00
|
|
|
|
2021-11-04 19:09:38 +01:00
|
|
|
actx.AddVariationDependencies([]blueprint.Variation{
|
|
|
|
{Mutator: "link", Variation: "shared"},
|
|
|
|
}, dataLibDepTag, deps.DataLibs...)
|
|
|
|
|
|
|
|
actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
|
|
|
|
|
2019-09-23 19:10:40 +02:00
|
|
|
// proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy.
|
2019-10-16 20:03:10 +02:00
|
|
|
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...)
|
2023-03-10 04:07:19 +01:00
|
|
|
|
|
|
|
mod.afdo.addDep(ctx, actx)
|
2019-08-27 21:03:00 +02:00
|
|
|
}
|
|
|
|
|
2022-04-07 18:59:11 +02:00
|
|
|
// addRlibDependency will add an rlib dependency, rewriting to the snapshot library if available.
|
2023-03-31 11:04:12 +02:00
|
|
|
func addRlibDependency(actx android.BottomUpMutatorContext, lib string, mod *Module, snapshotInfo **cc.SnapshotInfo, variations []blueprint.Variation) {
|
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, snapshotInfo, actx).Rlibs)
|
2022-04-07 18:59:11 +02:00
|
|
|
actx.AddVariationDependencies(variations, rlibDepTag, lib)
|
|
|
|
}
|
|
|
|
|
2023-07-13 17:01:41 +02:00
|
|
|
func addDylibDependency(actx android.BottomUpMutatorContext, lib string, mod *Module, snapshotInfo **cc.SnapshotInfo, variations []blueprint.Variation, depTag dependencyTag) {
|
|
|
|
lib = cc.GetReplaceModuleName(lib, cc.GetSnapshot(mod, snapshotInfo, actx).Dylibs)
|
|
|
|
actx.AddVariationDependencies(variations, depTag, lib)
|
|
|
|
}
|
|
|
|
|
2020-04-09 15:56:02 +02:00
|
|
|
func BeginMutator(ctx android.BottomUpMutatorContext) {
|
|
|
|
if mod, ok := ctx.Module().(*Module); ok && mod.Enabled() {
|
|
|
|
mod.beginMutator(ctx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (mod *Module) beginMutator(actx android.BottomUpMutatorContext) {
|
|
|
|
ctx := &baseModuleContext{
|
|
|
|
BaseModuleContext: actx,
|
|
|
|
}
|
|
|
|
|
|
|
|
mod.begin(ctx)
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
func (mod *Module) Name() string {
|
|
|
|
name := mod.ModuleBase.Name()
|
|
|
|
if p, ok := mod.compiler.(interface {
|
|
|
|
Name(string) string
|
|
|
|
}); ok {
|
|
|
|
name = p.Name(name)
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2020-08-13 12:55:59 +02:00
|
|
|
func (mod *Module) disableClippy() {
|
2020-08-04 22:27:16 +02:00
|
|
|
if mod.clippy != nil {
|
2020-08-13 12:55:59 +02:00
|
|
|
mod.clippy.Properties.Clippy_lints = proptools.StringPtr("none")
|
2020-08-04 22:27:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-16 02:36:30 +02:00
|
|
|
var _ android.HostToolProvider = (*Module)(nil)
|
2022-03-23 22:31:39 +01:00
|
|
|
var _ snapshot.RelativeInstallPath = (*Module)(nil)
|
2020-05-16 02:36:30 +02:00
|
|
|
|
|
|
|
func (mod *Module) HostToolPath() android.OptionalPath {
|
|
|
|
if !mod.Host() {
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
2020-08-11 06:50:43 +02:00
|
|
|
if binary, ok := mod.compiler.(*binaryDecorator); ok {
|
|
|
|
return android.OptionalPathForPath(binary.baseCompiler.path)
|
2022-03-23 22:31:39 +01:00
|
|
|
} else if pm, ok := mod.compiler.(*procMacroDecorator); ok {
|
|
|
|
// Even though proc-macros aren't strictly "tools", since they target the compiler
|
|
|
|
// and act as compiler plugins, we treat them similarly.
|
|
|
|
return android.OptionalPathForPath(pm.baseCompiler.path)
|
2020-05-16 02:36:30 +02:00
|
|
|
}
|
|
|
|
return android.OptionalPath{}
|
|
|
|
}
|
|
|
|
|
2020-11-17 14:21:02 +01:00
|
|
|
var _ android.ApexModule = (*Module)(nil)
|
|
|
|
|
2022-01-11 18:02:06 +01:00
|
|
|
func (mod *Module) MinSdkVersion() string {
|
2020-12-04 21:05:43 +01:00
|
|
|
return String(mod.Properties.Min_sdk_version)
|
|
|
|
}
|
|
|
|
|
2020-12-15 14:29:02 +01:00
|
|
|
// Implements android.ApexModule
|
2020-11-17 14:21:02 +01:00
|
|
|
func (mod *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
|
2022-01-11 18:02:06 +01:00
|
|
|
minSdkVersion := mod.MinSdkVersion()
|
2020-12-04 21:05:43 +01:00
|
|
|
if minSdkVersion == "apex_inherit" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if minSdkVersion == "" {
|
|
|
|
return fmt.Errorf("min_sdk_version is not specificed")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Not using nativeApiLevelFromUser because the context here is not
|
|
|
|
// necessarily a native context.
|
|
|
|
ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if ver.GreaterThan(sdkVersion) {
|
|
|
|
return fmt.Errorf("newer SDK(%v)", ver)
|
|
|
|
}
|
2020-11-17 14:21:02 +01:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-12-15 14:29:02 +01:00
|
|
|
// Implements android.ApexModule
|
2020-11-17 14:21:02 +01:00
|
|
|
func (mod *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
|
|
|
|
depTag := ctx.OtherModuleDependencyTag(dep)
|
|
|
|
|
|
|
|
if ccm, ok := dep.(*cc.Module); ok {
|
|
|
|
if ccm.HasStubsVariants() {
|
|
|
|
if cc.IsSharedDepTag(depTag) {
|
|
|
|
// dynamic dep to a stubs lib crosses APEX boundary
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if cc.IsRuntimeDepTag(depTag) {
|
|
|
|
// runtime dep to a stubs lib also crosses APEX boundary
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if cc.IsHeaderDepTag(depTag) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if mod.Static() && cc.IsSharedDepTag(depTag) {
|
|
|
|
// shared_lib dependency from a static lib is considered as crossing
|
|
|
|
// the APEX boundary because the dependency doesn't actually is
|
|
|
|
// linked; the dependency is used only during the compilation phase.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-30 01:46:25 +02:00
|
|
|
if depTag == procMacroDepTag || depTag == customBindgenDepTag {
|
2020-11-17 14:21:02 +01:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// Overrides ApexModule.IsInstallabeToApex()
|
|
|
|
func (mod *Module) IsInstallableToApex() bool {
|
|
|
|
if mod.compiler != nil {
|
2021-11-13 13:42:36 +01:00
|
|
|
if lib, ok := mod.compiler.(libraryInterface); ok && (lib.shared() || lib.dylib()) {
|
2020-11-17 14:21:02 +01:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
if _, ok := mod.compiler.(*binaryDecorator); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-02-04 17:29:41 +01:00
|
|
|
// If a library file has a "lib" prefix, extract the library name without the prefix.
|
|
|
|
func libNameFromFilePath(filepath android.Path) (string, bool) {
|
|
|
|
libName := strings.TrimSuffix(filepath.Base(), filepath.Ext())
|
|
|
|
if strings.HasPrefix(libName, "lib") {
|
|
|
|
libName = libName[3:]
|
|
|
|
return libName, true
|
|
|
|
}
|
|
|
|
return "", false
|
|
|
|
}
|
|
|
|
|
2022-04-19 05:12:56 +02:00
|
|
|
func kytheExtractRustFactory() android.Singleton {
|
|
|
|
return &kytheExtractRustSingleton{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type kytheExtractRustSingleton struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (k kytheExtractRustSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|
|
|
var xrefTargets android.Paths
|
|
|
|
ctx.VisitAllModules(func(module android.Module) {
|
|
|
|
if rustModule, ok := module.(xref); ok {
|
|
|
|
xrefTargets = append(xrefTargets, rustModule.XrefRustFiles()...)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
if len(xrefTargets) > 0 {
|
|
|
|
ctx.Phony("xref_rust", xrefTargets...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-02 00:47:07 +02:00
|
|
|
func (c *Module) Partition() string {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2023-09-19 22:09:00 +02:00
|
|
|
func (m *Module) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
|
2023-08-24 17:10:01 +02:00
|
|
|
if ctx.ModuleType() == "rust_library_host" || ctx.ModuleType() == "rust_library" {
|
|
|
|
libraryBp2build(ctx, m)
|
2023-08-24 17:10:01 +02:00
|
|
|
} else if ctx.ModuleType() == "rust_proc_macro" {
|
|
|
|
procMacroBp2build(ctx, m)
|
2023-08-24 18:10:49 +02:00
|
|
|
} else if ctx.ModuleType() == "rust_binary_host" {
|
|
|
|
binaryBp2build(ctx, m)
|
2023-09-25 20:47:19 +02:00
|
|
|
} else if ctx.ModuleType() == "rust_protobuf_host" || ctx.ModuleType() == "rust_protobuf" {
|
2023-08-24 17:10:01 +02:00
|
|
|
protoLibraryBp2build(ctx, m)
|
2023-10-17 22:28:04 +02:00
|
|
|
} else if ctx.ModuleType() == "rust_ffi_static" {
|
|
|
|
ffiStaticBp2build(ctx, m)
|
2023-08-24 17:10:01 +02:00
|
|
|
} else {
|
|
|
|
ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-24 17:10:01 +02:00
|
|
|
// This is a workaround by assuming the conventions that rust crate repos are structured
|
2023-08-24 18:10:49 +02:00
|
|
|
// while waiting for the sandboxing work to complete.
|
2023-08-24 17:10:01 +02:00
|
|
|
// TODO(b/297344471): When crate_root prop is set which enforces inputs sandboxing,
|
|
|
|
// always use `srcs` and `compile_data` props to generate `srcs` and `compile_data` attributes
|
|
|
|
// instead of using globs.
|
2023-09-19 22:09:00 +02:00
|
|
|
func srcsAndCompileDataAttrs(ctx android.Bp2buildMutatorContext, c baseCompiler) (bazel.LabelList, bazel.LabelList) {
|
2023-08-24 17:10:01 +02:00
|
|
|
var srcs bazel.LabelList
|
|
|
|
var compileData bazel.LabelList
|
|
|
|
|
|
|
|
if c.Properties.Srcs[0] == "src/lib.rs" {
|
|
|
|
srcs = android.BazelLabelForModuleSrc(ctx, []string{"src/**/*.rs"})
|
|
|
|
compileData = android.BazelLabelForModuleSrc(
|
|
|
|
ctx,
|
|
|
|
[]string{
|
|
|
|
"src/**/*.proto",
|
|
|
|
"examples/**/*.rs",
|
|
|
|
"**/*.md",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
srcs = android.BazelLabelForModuleSrc(ctx, c.Properties.Srcs)
|
|
|
|
}
|
|
|
|
|
|
|
|
return srcs, compileData
|
|
|
|
}
|
|
|
|
|
2019-08-27 21:03:00 +02:00
|
|
|
var Bool = proptools.Bool
|
|
|
|
var BoolDefault = proptools.BoolDefault
|
|
|
|
var String = proptools.String
|
|
|
|
var StringPtr = proptools.StringPtr
|
2020-07-10 03:03:28 +02:00
|
|
|
|
|
|
|
var _ android.OutputFileProducer = (*Module)(nil)
|