mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-28 00:15:23 +00:00
da9ca41c31
SOLID[1] is an embedded development platform provided by Kyoto Microcomputer Co., Ltd. This commit introduces a basic Tier 3 support for SOLID. # New Targets The following targets are added: - `aarch64-kmc-solid_asp3` - `armv7a-kmc-solid_asp3-eabi` - `armv7a-kmc-solid_asp3-eabihf` SOLID's target software system can be divided into two parts: an RTOS kernel, which is responsible for threading and synchronization, and Core Services, which provides filesystems, networking, and other things. The RTOS kernel is a μITRON4.0[2][3]-derived kernel based on the open-source TOPPERS RTOS kernels[4]. For uniprocessor systems (more precisely, systems where only one processor core is allocated for SOLID), this will be the TOPPERS/ASP3 kernel. As μITRON is traditionally only specified at the source-code level, the ABI is unique to each implementation, which is why `asp3` is included in the target names. More targets could be added later, as we support other base kernels (there are at least three at the point of writing) and are interested in supporting other processor architectures in the future. # C Compiler Although SOLID provides its own supported C/C++ build toolchain, GNU Arm Embedded Toolchain seems to work for the purpose of building Rust. # Unresolved Questions A μITRON4 kernel can support `Thread::unpark` natively, but it's not used by this commit's implementation because the underlying kernel feature is also used to implement `Condvar`, and it's unclear whether `std` should guarantee that parking tokens are not clobbered by other synchronization primitives. # Unsupported or Unimplemented Features Most features are implemented. The following features are not implemented due to the lack of native support: - `fs::File::{file_attr, truncate, duplicate, set_permissions}` - `fs::{symlink, link, canonicalize}` - Process creation - Command-line arguments Backtrace generation is not really a good fit for embedded targets, so it's intentionally left unimplemented. Unwinding is functional, however. ## Dynamic Linking Dynamic linking is not supported. The target platform supports dynamic linking, but enabling this in Rust causes several problems. - The linker invocation used to build the shared object of `std` is too long for the platform-provided linker to handle. - A linker script with specific requirements is required for the compiled shared object to be actually loadable. As such, we decided to disable dynamic linking for now. Regardless, the users can try to create shared objects by manually invoking the linker. ## Executable Building an executable is not supported as the notion of "executable files" isn't well-defined for these targets. [1] https://solid.kmckk.com/SOLID/ [2] http://ertl.jp/ITRON/SPEC/mitron4-e.html [3] https://en.wikipedia.org/wiki/ITRON_project [4] https://toppers.jp/
50 lines
1.9 KiB
Rust
50 lines
1.9 KiB
Rust
use std::env;
|
|
|
|
fn main() {
|
|
println!("cargo:rerun-if-changed=build.rs");
|
|
let target = env::var("TARGET").expect("TARGET was not set");
|
|
if target.contains("freebsd") {
|
|
if env::var("RUST_STD_FREEBSD_12_ABI").is_ok() {
|
|
println!("cargo:rustc-cfg=freebsd12");
|
|
}
|
|
} else if target.contains("linux")
|
|
|| target.contains("netbsd")
|
|
|| target.contains("dragonfly")
|
|
|| target.contains("openbsd")
|
|
|| target.contains("solaris")
|
|
|| target.contains("illumos")
|
|
|| target.contains("apple-darwin")
|
|
|| target.contains("apple-ios")
|
|
|| target.contains("uwp")
|
|
|| target.contains("windows")
|
|
|| target.contains("fuchsia")
|
|
|| (target.contains("sgx") && target.contains("fortanix"))
|
|
|| target.contains("hermit")
|
|
|| target.contains("l4re")
|
|
|| target.contains("redox")
|
|
|| target.contains("haiku")
|
|
|| target.contains("vxworks")
|
|
|| target.contains("wasm32")
|
|
|| target.contains("asmjs")
|
|
|| target.contains("espidf")
|
|
|| target.contains("solid")
|
|
{
|
|
// These platforms don't have any special requirements.
|
|
} else {
|
|
// This is for Cargo's build-std support, to mark std as unstable for
|
|
// typically no_std platforms.
|
|
// This covers:
|
|
// - os=none ("bare metal" targets)
|
|
// - mipsel-sony-psp
|
|
// - nvptx64-nvidia-cuda
|
|
// - arch=avr
|
|
// - tvos (aarch64-apple-tvos, x86_64-apple-tvos)
|
|
// - uefi (x86_64-unknown-uefi, i686-unknown-uefi)
|
|
// - JSON targets
|
|
// - Any new targets that have not been explicitly added above.
|
|
println!("cargo:rustc-cfg=feature=\"restricted-std\"");
|
|
}
|
|
println!("cargo:rustc-env=STD_ENV_ARCH={}", env::var("CARGO_CFG_TARGET_ARCH").unwrap());
|
|
println!("cargo:rustc-cfg=backtrace_in_libstd");
|
|
}
|