# All host rust packages should depend on this option
# When adding new entries below, update RUST_HOSTS in utils/update-rust
config BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
	bool
	default y if BR2_HOSTARCH = "aarch64"
	default y if BR2_HOSTARCH = "powerpc"
	default y if BR2_HOSTARCH = "powerpc64"
	default y if BR2_HOSTARCH = "powerpc64le"
	default y if BR2_HOSTARCH = "riscv64"
	default y if BR2_HOSTARCH = "s390x"
	default y if BR2_HOSTARCH = "x86"
	default y if BR2_HOSTARCH = "x86_64"

# The pre-built Rust standard library is only available for a number
# of architectures/C libraries combinations, with different levels of
# support: Tier 1 platforms, Tier 2 platforms with host tools, Tier 2
# platforms, Tier 3 platforms. Below, we support Tier 1, Tier 2 with
# host tools and Tier 2 platforms.

# The below entries match Tier 1 platforms as described at
# https://doc.rust-lang.org/nightly/rustc/platform-support.html.
# When adding new entries below, update RUST_TARGETS in utils/update-rust
config BR2_PACKAGE_HOST_RUSTC_TARGET_TIER1_PLATFORMS
	bool
	# aarch64-unknown-linux-gnu
	default y if BR2_aarch64 && BR2_TOOLCHAIN_USES_GLIBC
	# i686-unknown-linux-gnu
	default y if (BR2_x86_i686 || BR2_x86_pentiumpro || BR2_X86_CPU_HAS_MMX) && BR2_TOOLCHAIN_USES_GLIBC
	# x86_64-unknown-linux-gnu
	default y if BR2_x86_64 && BR2_TOOLCHAIN_USES_GLIBC

# The below entries match Tier 2 platforms with host tools as
# described at
# https://doc.rust-lang.org/nightly/rustc/platform-support.html.
# When adding new entries below, update RUST_TARGETS in utils/update-rust
config BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_HOST_TOOLS_PLATFORMS
	bool
	# aarch64-unknown-linux-musl
	default y if BR2_aarch64 && BR2_TOOLCHAIN_USES_MUSL
	# arm-unknown-linux-gnueabi
	default y if BR2_ARM_CPU_ARMV6 && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_GLIBC
	# arm-unknown-linux-gnueabihf
	default y if BR2_ARM_CPU_ARMV6 && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_GLIBC
	# armv7-unknown-linux-gnueabihf
	default y if BR2_ARM_CPU_ARMV7A && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_GLIBC
	# armv7-unknown-linux-gnueabihf for armv8 hardware with 32-bit
	# userspace
	default y if BR2_arm && BR2_ARM_CPU_ARMV8A && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_GLIBC
	# powerpc-unknown-linux-gnu
	default y if BR2_powerpc && BR2_TOOLCHAIN_USES_GLIBC
	# powerpc64-unknown-linux-gnu
	default y if BR2_powerpc64 && BR2_TOOLCHAIN_USES_GLIBC
	# powerpc64le-unknown-linux-gnu
	default y if BR2_powerpc64le && BR2_TOOLCHAIN_USES_GLIBC
	# riscv64gc-unknown-linux-gnu
	# "g" stands for imafd, and we also need "c".
	default y if BR2_RISCV_64 && BR2_RISCV_ISA_RVI && BR2_RISCV_ISA_RVM && \
			BR2_RISCV_ISA_RVA && BR2_RISCV_ISA_RVF && \
			BR2_RISCV_ISA_RVD && BR2_RISCV_ISA_RVC && \
			BR2_TOOLCHAIN_USES_GLIBC
	# s390x-unknown-linux-gnu
	default y if BR2_s390x && BR2_TOOLCHAIN_USES_GLIBC
	# x86_64-unknown-linux-musl
	default y if BR2_x86_64 && BR2_TOOLCHAIN_USES_MUSL

# The below entries match Tier 2 platforms without host tools as
# described at
# https://doc.rust-lang.org/nightly/rustc/platform-support.html.
# When adding new entries below, update RUST_TARGETS in utils/update-rust
config BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_PLATFORMS
	bool
	# arm-unknown-linux-musleabi
	default y if BR2_ARM_CPU_ARMV6 && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_MUSL
	# arm-unknown-linux-musleabihf
	default y if BR2_ARM_CPU_ARMV6 && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_MUSL
	# armv5te-unknown-linux-gnueabi
	default y if BR2_ARM_CPU_ARMV5 && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_GLIBC
	# armv5te-unknown-linux-musleabi
	default y if BR2_ARM_CPU_ARMV5 && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_MUSL
	# armv7-unknown-linux-gnueabi
	default y if BR2_ARM_CPU_ARMV7A && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_GLIBC
	# armv7-unknown-linux-musleabi
	default y if BR2_ARM_CPU_ARMV7A && BR2_ARM_EABI && BR2_TOOLCHAIN_USES_MUSL
	# armv7-unknown-linux-musleabihf
	default y if BR2_ARM_CPU_ARMV7A && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_MUSL
	# armv7-unknown-linux-musleabihf for armv8 hardware with 32-bit
	# userspace
	default y if BR2_arm && BR2_ARM_CPU_ARMV8A && BR2_ARM_EABIHF && BR2_TOOLCHAIN_USES_MUSL
	# i586-unknown-linux-gnu
	default y if BR2_x86_i586 && BR2_TOOLCHAIN_USES_GLIBC
	# i586-unknown-linux-musl
	default y if BR2_x86_i586 && BR2_TOOLCHAIN_USES_MUSL
	# i686-unknown-linux-musl
	default y if (BR2_x86_i686 || BR2_x86_pentiumpro || BR2_X86_CPU_HAS_MMX) && BR2_TOOLCHAIN_USES_MUSL
	# sparc64-unknown-linux-gnu
	default y if BR2_sparc64 && BR2_TOOLCHAIN_USES_GLIBC

# All target rust packages should depend on this option
# Note: With musl based toolchain, we need a C++ cross compiler to
# build host-rust some target libraries (libunwind) from llvm source
# code bundled in rust sources.
config BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS
	bool
	default y if BR2_PACKAGE_HOST_RUSTC_TARGET_TIER1_PLATFORMS
	default y if BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_HOST_TOOLS_PLATFORMS
	default y if BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_PLATFORMS
	depends on BR2_INSTALL_LIBSTDCPP || !BR2_TOOLCHAIN_USES_MUSL
	depends on BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS

config BR2_PACKAGE_HOST_RUSTC_ARCH
	string
	default "armv5te" if BR2_ARM_CPU_ARMV5
	default "arm" if BR2_ARM_CPU_ARMV6
	default "armv7"  if BR2_ARM_CPU_ARMV7A
	default "armv7"  if BR2_ARM_CPU_ARMV7A || (BR2_arm && BR2_ARM_CPU_ARMV8A)
	default "riscv64gc" if BR2_RISCV_64
	default BR2_ARCH

config BR2_PACKAGE_HOST_RUSTC_ABI
	string
	default "eabi"   if BR2_ARM_EABI
	default "eabihf" if BR2_ARM_EABIHF
	default "abi64"  if BR2_MIPS_NABI64

config BR2_PACKAGE_HOST_RUSTC
	bool "host rustc"
	depends on BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
	help
	  Compiler for the Rust language

	  http://www.rust-lang.org

if BR2_PACKAGE_HOST_RUSTC

choice
	prompt "Rust compiler variant"
	default BR2_PACKAGE_HOST_RUST_BIN
	help
	  Select a Rust compiler

config BR2_PACKAGE_HOST_RUST
	bool "host rust"
	# RUSTC_TARGET_NAME must be set for building host-rust
	# otherwise config.toml is broken.
	depends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS
	# triggers ICE on trunc_int_for_mode, at explow.c:56
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5 || !BR2_aarch64
	# rust uses llvm >= 17 since 1.73.0
	select BR2_HOST_CMAKE_AT_LEAST_3_20
	help
	  This package will build the compiler for the host as well as
	  two flavors of the standard library: one for the host, another
	  for the target. Both are installed in the host directory.

comment "host-rust needs a toolchain w/ gcc >= 5"
	depends on BR2_aarch64
	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_5

config BR2_PACKAGE_HOST_RUST_BIN
	bool "host rust (pre-built)"
	help
	  This package will install pre-built versions of the compiler
	  for the host and the Rust standard library for the target.

endchoice

endif

config BR2_PACKAGE_PROVIDES_HOST_RUSTC
	string
	default "host-rust" if BR2_PACKAGE_HOST_RUST
	# Default to host-rust-bin as long as host arch supports it
	default "host-rust-bin" if !BR2_PACKAGE_HOST_RUST
	depends on BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
