|  | // Copyright 2022 Google Inc. All rights reserved. | 
|  | // | 
|  | // 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 config | 
|  |  | 
|  | import ( | 
|  | "strings" | 
|  |  | 
|  | "android/soong/android" | 
|  | ) | 
|  |  | 
|  | var ( | 
|  | linuxArmRustflags   = []string{} | 
|  | linuxArmLinkflags   = []string{} | 
|  | linuxArm64Rustflags = []string{} | 
|  | linuxArm64Linkflags = []string{} | 
|  | ) | 
|  |  | 
|  | func init() { | 
|  | registerToolchainFactory(android.LinuxMusl, android.Arm64, linuxMuslArm64ToolchainFactory) | 
|  | registerToolchainFactory(android.LinuxMusl, android.Arm, linuxMuslArmToolchainFactory) | 
|  |  | 
|  | pctx.StaticVariable("LinuxToolchainArmRustFlags", strings.Join(linuxArmRustflags, " ")) | 
|  | pctx.StaticVariable("LinuxToolchainArmLinkFlags", strings.Join(linuxArmLinkflags, " ")) | 
|  | pctx.StaticVariable("LinuxToolchainArm64RustFlags", strings.Join(linuxArm64Rustflags, " ")) | 
|  | pctx.StaticVariable("LinuxToolchainArm64LinkFlags", strings.Join(linuxArm64Linkflags, " ")) | 
|  | } | 
|  |  | 
|  | // Base 64-bit linux rust toolchain | 
|  | type toolchainLinuxArm64 struct { | 
|  | toolchain64Bit | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm64) Supported() bool { | 
|  | return true | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm64) Bionic() bool { | 
|  | return false | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm64) Name() string { | 
|  | return "arm64" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm64) ToolchainLinkFlags() string { | 
|  | // Prepend the lld flags from cc_config so we stay in sync with cc | 
|  | return "${cc_config.LinuxLldflags} ${cc_config.LinuxArm64Lldflags} " + | 
|  | "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainArm64LinkFlags}" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm64) ToolchainRustFlags() string { | 
|  | return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainArm64RustFlags}" | 
|  | } | 
|  |  | 
|  | // Specialization of the 64-bit linux rust toolchain for musl.  Adds the musl rust triple and | 
|  | // linker flags to avoid using the host sysroot. | 
|  | type toolchainLinuxMuslArm64 struct { | 
|  | toolchainLinuxArm64 | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm64) RustTriple() string { | 
|  | return "aarch64-unknown-linux-musl" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm64) ToolchainLinkFlags() string { | 
|  | return t.toolchainLinuxArm64.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm64) ToolchainRustFlags() string { | 
|  | return t.toolchainLinuxArm64.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" | 
|  | } | 
|  |  | 
|  | func linuxMuslArm64ToolchainFactory(arch android.Arch) Toolchain { | 
|  | return toolchainLinuxMuslArm64Singleton | 
|  | } | 
|  |  | 
|  | // Base 32-bit linux rust toolchain | 
|  | type toolchainLinuxArm struct { | 
|  | toolchain32Bit | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm) Supported() bool { | 
|  | return true | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm) Bionic() bool { | 
|  | return false | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm) Name() string { | 
|  | return "arm" | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm) LibclangRuntimeLibraryArch() string { | 
|  | return "arm" | 
|  | } | 
|  |  | 
|  | func (toolchainLinuxArm64) LibclangRuntimeLibraryArch() string { | 
|  | return "arm64" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm) ToolchainLinkFlags() string { | 
|  | // Prepend the lld flags from cc_config so we stay in sync with cc | 
|  | return "${cc_config.LinuxLldflags} ${cc_config.LinuxArmLldflags} " + | 
|  | "${config.LinuxToolchainLinkFlags} ${config.LinuxToolchainArmLinkFlags}" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxArm) ToolchainRustFlags() string { | 
|  | return "${config.LinuxToolchainRustFlags} ${config.LinuxToolchainArmRustFlags}" | 
|  | } | 
|  |  | 
|  | // Specialization of the 32-bit linux rust toolchain for musl.  Adds the musl rust triple and | 
|  | // linker flags to avoid using the host sysroot. | 
|  | type toolchainLinuxMuslArm struct { | 
|  | toolchainLinuxArm | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm) RustTriple() string { | 
|  | return "arm-unknown-linux-musleabihf" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm) ToolchainLinkFlags() string { | 
|  | return t.toolchainLinuxArm.ToolchainLinkFlags() + " " + "${config.LinuxMuslToolchainLinkFlags}" | 
|  | } | 
|  |  | 
|  | func (t *toolchainLinuxMuslArm) ToolchainRustFlags() string { | 
|  | return t.toolchainLinuxArm.ToolchainRustFlags() + " " + "${config.LinuxMuslToolchainRustFlags}" | 
|  | } | 
|  |  | 
|  | func linuxMuslArmToolchainFactory(arch android.Arch) Toolchain { | 
|  | return toolchainLinuxMuslArmSingleton | 
|  | } | 
|  |  | 
|  | var toolchainLinuxMuslArm64Singleton Toolchain = &toolchainLinuxMuslArm64{} | 
|  | var toolchainLinuxMuslArmSingleton Toolchain = &toolchainLinuxMuslArm{} |