Files
CMake/Modules/CMakeDetermineRustCompiler.cmake
Ayush Singh 5c1b0a6b7e Rust: Add experimental support with Ninja
The TU for Rust is a crate, not per-source.  `rustc` expects entry file
to TU as input, and cannot work with object files.  So we need to have
one-step build/link in most cases, similar to what old Swift was doing.

Issue: #25492
Signed-off-by: Ayush Singh <ayush@beagleboard.org>
2026-02-06 11:32:56 -05:00

50 lines
1.6 KiB
CMake

# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
if(NOT "${CMAKE_GENERATOR}" MATCHES "^Ninja")
message(FATAL_ERROR "Rust language not supported by \"${CMAKE_GENERATOR}\" generator")
endif()
set(CMAKE_Rust_COMPILER_INIT "rustc")
set(CMAKE_Rust_COMPILER_HINTS "$ENV{HOME}/.cargo/bin")
_cmake_find_compiler(Rust)
get_filename_component(RUSTC_REAL "${CMAKE_Rust_COMPILER}" REALPATH)
get_filename_component(RUSTC_FILENAME "${RUSTC_REAL}" NAME)
# When rustup is used for installing rust, rustc will just be a symlink to rustup. In such cases,
# we need to query rustup for underlying rustc path.
if(RUSTC_FILENAME STREQUAL "rustup")
get_filename_component(RUSTC_DIR "${CMAKE_Rust_COMPILER}" DIRECTORY)
set(RUSTUP_PATH "${RUSTC_DIR}/rustup")
# Fix RUSTUP_HOME in ctest.
if(RUSTC_FILENAME STREQUAL "rustup" AND NOT "$ENV{CTEST_REAL_HOME}" STREQUAL "" AND "$ENV{RUSTUP_HOME}" STREQUAL "")
set(ENV{RUSTUP_HOME} "$ENV{CTEST_REAL_HOME}/.rustup")
endif()
execute_process(
COMMAND ${RUSTUP_PATH} which rustc
OUTPUT_VARIABLE REAL_RUSTC
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if("${REAL_RUSTC}" STREQUAL "")
message(FATAL_ERROR "Failed to find path to real rustc")
endif()
set_property(CACHE CMAKE_Rust_COMPILER PROPERTY VALUE "${REAL_RUSTC}")
endif()
if(CMAKE_Rust_COMPILER)
set(CMAKE_Rust_COMPILER_WORKS TRUE)
endif()
configure_file(
"${CMAKE_ROOT}/Modules/CMakeRustCompiler.cmake.in"
"${CMAKE_PLATFORM_INFO_DIR}/CMakeRustCompiler.cmake"
@ONLY)