nuttx-apps/tools/Rust.mk
Shoji Tokunaga 840c2f30db apps/rust: Add dependencies for Rust cargo in make builds
Add a Rust make helper that collects crate input files, and use it for
the Rust hello and slint examples.

This makes the generated Rust static libraries depend on the crate
sources, manifests, build scripts. Hook the libraries into both context
and all, so re-running make after editing Rust inputs rebuilds the crate.

Signed-off-by: Shoji Tokunaga <toku@mac.com>
2026-06-04 08:58:07 -03:00

161 lines
5.5 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
# - 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)), \
$(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 sim,$(CONFIG_ARCH)),$(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