############################################################################ # apps/tools/Rust.mk # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. The # ASF licenses this file to you 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. # ############################################################################ # Generate Rust target triple based on LLVM architecture configuration # # Uses the following LLVM variables directly: # - LLVM_ARCHTYPE: Architecture type (e.g. thumbv7m, riscv32) # - LLVM_ABITYPE: ABI type (e.g. eabi, eabihf) # - LLVM_CPUTYPE: CPU type (e.g. cortex-m23, sifive-e20) # # Supported architectures and their target triples: # - x86: i686-unknown-nuttx # - x86_64: x86_64-unknown-nuttx # - armv7a: armv7a-nuttx-eabi, armv7a-nuttx-eabihf # - thumbv6m: thumbv6m-nuttx-eabi # - thumbv7a: thumbv7a-nuttx-eabi, thumbv7a-nuttx-eabihf # - thumbv7m: thumbv7m-nuttx-eabi # - thumbv7em: thumbv7em-nuttx-eabihf # - thumbv8m.main: thumbv8m.main-nuttx-eabi, thumbv8m.main-nuttx-eabihf # - thumbv8m.base: thumbv8m.base-nuttx-eabi, thumbv8m.base-nuttx-eabihf # - riscv32: riscv32imc/imac/imafc-unknown-nuttx-elf # - riscv64: riscv64imac/imafdc-unknown-nuttx-elf # # Usage: $(call RUST_TARGET_TRIPLE) # # Output: # Rust target triple (e.g. riscv32imac-unknown-nuttx-elf, # thumbv7m-nuttx-eabi, thumbv7em-nuttx-eabihf) define RUST_TARGET_TRIPLE $(or \ $(and $(filter x86_64,$(LLVM_ARCHTYPE)), \ x86_64-unknown-nuttx \ ), \ $(and $(filter x86,$(LLVM_ARCHTYPE)), \ i686-unknown-nuttx \ ), \ $(and $(filter thumb%,$(LLVM_ARCHTYPE)), \ $(if $(filter thumbv8m%,$(LLVM_ARCHTYPE)), \ $(if $(filter cortex-m23,$(LLVM_CPUTYPE)),thumbv8m.base,thumbv8m.main)-nuttx-$(LLVM_ABITYPE), \ $(LLVM_ARCHTYPE)-nuttx-$(LLVM_ABITYPE) \ ) \ ), \ $(and $(filter riscv32,$(LLVM_ARCHTYPE)), \ riscv32$(or \ $(and $(filter sifive-e20,$(LLVM_CPUTYPE)),imc), \ $(and $(filter sifive-e31,$(LLVM_CPUTYPE)),imac), \ $(and $(filter sifive-e76,$(LLVM_CPUTYPE)),imafc), \ imc \ )-unknown-nuttx-elf \ ), \ $(and $(filter riscv64,$(LLVM_ARCHTYPE)), \ riscv64$(or \ $(and $(filter sifive-s51,$(LLVM_CPUTYPE)),imac), \ $(and $(filter sifive-u54,$(LLVM_CPUTYPE)),imafdc), \ imac \ )-unknown-nuttx-elf \ ) \ ) endef # Build Rust project using cargo # # Usage: $(call RUST_CARGO_BUILD,cratename,prefix) # # Inputs: # cratename - Name of the Rust crate (e.g. hello) # prefix - Path prefix to the crate (e.g. path/to/project) # # Output: # None, builds the Rust project ifeq ($(CONFIG_DEBUG_FULLOPT),y) define RUST_CARGO_BUILD NUTTX_INCLUDE_DIR=$(TOPDIR)/include:$(TOPDIR)/include/arch \ cargo build --release -Zbuild-std=std,panic_abort \ -Zbuild-std-features=panic_immediate_abort \ --manifest-path $(2)/$(1)/Cargo.toml \ --target $(call RUST_TARGET_TRIPLE) endef else define RUST_CARGO_BUILD @echo "Building Rust code with cargo..." NUTTX_INCLUDE_DIR=$(TOPDIR)/include:$(TOPDIR)/include/arch \ cargo build -Zbuild-std=std,panic_abort \ --manifest-path $(2)/$(1)/Cargo.toml \ --target $(call RUST_TARGET_TRIPLE) endef endif # Clean Rust project using cargo # # Usage: $(call RUST_CARGO_CLEAN,cratename,prefix) # # Inputs: # cratename - Name of the Rust crate (e.g. hello) # prefix - Path prefix to the crate (e.g. path/to/project) # # Output: # None, cleans the Rust project define RUST_CARGO_CLEAN cargo clean --manifest-path $(2)/$(1)/Cargo.toml endef # Get Rust binary path for given crate and path prefix # # Usage: $(call RUST_GET_BINDIR,cratename,prefix) # # Inputs: # cratename - Name of the Rust crate (e.g. hello) # prefix - Path prefix to the crate (e.g. path/to/project) # # Output: # Path to the Rust binary (e.g. path/to/project/target/riscv32imac-unknown-nuttx-elf/release/libhello.a) define RUST_GET_BINDIR $(2)/$(1)/target/$(strip $(call RUST_TARGET_TRIPLE))/$(if $(CONFIG_DEBUG_FULLOPT),release,debug)/lib$(1).a endef