############################################################################ # 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-macho for sim on macOS, # x86_64-unknown-nuttx otherwise # - 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 # - aarch64: aarch64-unknown-nuttx-macho for sim on macOS, # aarch64-unknown-nuttx otherwise # # 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)), \ $(if $(and $(filter y,$(CONFIG_ARCH_SIM)),$(filter y,$(CONFIG_HOST_MACOS))), \ $(TOPDIR)/tools/x86_64-unknown-nuttx-macho.json, \ $(TOPDIR)/tools/x86_64-unknown-nuttx.json \ ) \ ), \ $(and $(filter x86,$(LLVM_ARCHTYPE)), \ $(TOPDIR)/tools/i486-unknown-nuttx.json \ ), \ $(and $(filter aarch64,$(LLVM_ARCHTYPE)), \ $(if $(and $(filter y,$(CONFIG_ARCH_SIM)),$(filter y,$(CONFIG_HOST_MACOS))), \ $(TOPDIR)/tools/aarch64-unknown-nuttx-macho.json, \ $(TOPDIR)/tools/aarch64-unknown-nuttx.json \ ) \ ), \ $(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 \ RUSTFLAGS="-Zunstable-options -Cpanic=immediate-abort" \ cargo build --release -Zbuild-std=std,panic_abort -Zjson-target-spec \ --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 -Zjson-target-spec \ --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 $(if $(findstring .json,$(call RUST_TARGET_TRIPLE)), \ $(basename $(notdir $(call RUST_TARGET_TRIPLE))), \ $(call RUST_TARGET_TRIPLE)))/$(if $(CONFIG_DEBUG_FULLOPT),release,debug)/lib$(1).a endef # Collect crate input files for a crate # # Usage: $(call RUST_CARGO_SRCS,cratename,prefix) # # Inputs: # cratename - Name of the Rust crate (e.g. hello) # prefix - Path prefix to the crate (e.g. path/to/project) # # Output: # List of crate input files (excluding the cargo target directory) define RUST_CARGO_SRCS $(shell find $(2)/$(1) -type f -not -path '$(2)/$(1)/target/*' 2>/dev/null) endef