mirror of
https://github.com/apache/nuttx-apps.git
synced 2026-08-01 20:29:00 +00:00
X86 support for Rust needs more test and verification, and not upstreamed to Rust side yet. It's better to use custom target triples for x86 by json files for now, and it can be upstreamed to Rust side if stable enough. Changed the Rust target triples in the CMake configuration to reference JSON files for x86_64 and i486 architectures. This improves the build process by providing more detailed target specifications. * Added JSON files for i486 and x86_64 targets * Updated CMake functions to use the new target triples * Enhanced build directory structure for Rust crates Signed-off-by: Huang Qi <huangqi3@xiaomi.com>
138 lines
4.7 KiB
Makefile
138 lines
4.7 KiB
Makefile
############################################################################
|
|
# 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)), \
|
|
$(APPDIR)/tools/x86_64-unknown-nuttx.json \
|
|
), \
|
|
$(and $(filter x86,$(LLVM_ARCHTYPE)), \
|
|
$(APPDIR)/tools/i486-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 \
|
|
--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 $(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
|