• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//
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}
104