blob: 326d52924d11d4326693db75a54f4b1b64c7c7db [file] [log] [blame]
Ivan Lozano45e0e5b2021-11-13 07:42:36 -05001//
2// Copyright (C) 2021 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17package rust
18
19import (
20 "path"
21
22 "android/soong/android"
23 "android/soong/rust/config"
24)
25
26// This module is used to compile the rust toolchain libraries
27// When RUST_PREBUILTS_VERSION is set, the library will generated
28// from the given Rust version.
29func init() {
30 android.RegisterModuleType("rust_toolchain_library",
31 rustToolchainLibraryFactory)
32 android.RegisterModuleType("rust_toolchain_library_rlib",
33 rustToolchainLibraryRlibFactory)
34 android.RegisterModuleType("rust_toolchain_library_dylib",
35 rustToolchainLibraryDylibFactory)
36}
37
38type toolchainLibraryProperties struct {
39 // path to the toolchain source, relative to the top of the toolchain source
40 Toolchain_src *string `android:"arch_variant"`
41}
42
43type toolchainLibraryDecorator struct {
44 *libraryDecorator
45 Properties toolchainLibraryProperties
46}
47
48// rust_toolchain_library produces all rust variants.
49func rustToolchainLibraryFactory() android.Module {
50 module, library := NewRustLibrary(android.HostAndDeviceSupported)
51 library.BuildOnlyRust()
52
53 return initToolchainLibrary(module, library)
54}
55
56// rust_toolchain_library_dylib produces a dylib.
57func rustToolchainLibraryDylibFactory() android.Module {
58 module, library := NewRustLibrary(android.HostAndDeviceSupported)
59 library.BuildOnlyDylib()
60
61 return initToolchainLibrary(module, library)
62}
63
64// rust_toolchain_library_rlib produces an rlib.
65func rustToolchainLibraryRlibFactory() android.Module {
66 module, library := NewRustLibrary(android.HostAndDeviceSupported)
67 library.BuildOnlyRlib()
68
69 return initToolchainLibrary(module, library)
70}
71
72func initToolchainLibrary(module *Module, library *libraryDecorator) android.Module {
73 toolchainLibrary := &toolchainLibraryDecorator{
74 libraryDecorator: library,
75 }
76 module.compiler = toolchainLibrary
77 module.AddProperties(&toolchainLibrary.Properties)
78 android.AddLoadHook(module, rustSetToolchainSource)
79
80 return module.Init()
81}
82
83func rustSetToolchainSource(ctx android.LoadHookContext) {
84 if toolchainLib, ok := ctx.Module().(*Module).compiler.(*toolchainLibraryDecorator); ok {
85 prefix := "linux-x86/" + GetRustPrebuiltVersion(ctx)
86 newSrcs := []string{path.Join(prefix, android.String(toolchainLib.Properties.Toolchain_src))}
87
88 type props struct {
89 Srcs []string
90 }
91 p := &props{}
92 p.Srcs = newSrcs
93 ctx.AppendProperties(p)
94
95 } else {
96 ctx.ModuleErrorf("Called rustSetToolchainSource on a non-Rust Module.")
97 }
98}
99
100// GetRustPrebuiltVersion returns the RUST_PREBUILTS_VERSION env var, or the default version if it is not defined.
101func GetRustPrebuiltVersion(ctx android.LoadHookContext) string {
102 return ctx.AConfig().GetenvWithDefault("RUST_PREBUILTS_VERSION", config.RustDefaultVersion)
103}