Allow compiling with Rust code (#3137)

Co-authored-by: Yuri Astrakhan <YuriAstrakhan@gmail.com>
Co-authored-by: Ian Wagner <ianwagner+github@switzerlandmail.ch>
This commit is contained in:
Bart Louwers
2025-01-16 16:01:11 +01:00
committed by GitHub
parent 79d625b03c
commit 527e70b6fa
23 changed files with 649 additions and 25 deletions

63
rustutils/rustutils.cmake Normal file
View File

@@ -0,0 +1,63 @@
# Include guard
if(TARGET rustutils)
return()
endif()
include(FetchContent)
FetchContent_Declare(
Corrosion
GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git
GIT_TAG v0.5 # Optionally specify a commit hash, version tag or branch here
)
FetchContent_MakeAvailable(Corrosion)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_CURRENT_LIST_DIR}/Cargo.toml)
# Define output directories for generated bindings
set(RUSTUTILS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rustutils_bindings")
set(RUSTUTILS_INCLUDE_DIR "${RUSTUTILS_OUTPUT_DIR}/cpp/include")
set(RUSTUTILS_SRC_DIR "${RUSTUTILS_OUTPUT_DIR}/cpp/src")
# Ensure the output directories exist
file(MAKE_DIRECTORY ${RUSTUTILS_INCLUDE_DIR})
file(MAKE_DIRECTORY ${RUSTUTILS_SRC_DIR})
set(RUSTUTILS_RS_FILES
${CMAKE_CURRENT_LIST_DIR}/src/color.rs
)
# Initialize variables for generated files
set(RUSTUTILS_GENERATED_SOURCES)
set(RUSTUTILS_GENERATED_HEADERS)
# Transform .rs to .rs.cpp and .hpp
foreach(rs_file ${RUSTUTILS_RS_FILES})
get_filename_component(base_name ${rs_file} NAME_WE)
list(APPEND RUSTUTILS_GENERATED_SOURCES "${RUSTUTILS_SRC_DIR}/${base_name}.rs.cpp")
list(APPEND RUSTUTILS_GENERATED_HEADERS "${RUSTUTILS_INCLUDE_DIR}/rustutils/${base_name}.hpp")
endforeach()
add_custom_command(
OUTPUT ${RUSTUTILS_GENERATED_SOURCES} ${RUSTUTILS_GENERATED_HEADERS}
COMMAND ${CMAKE_COMMAND} -E env
${CMAKE_CURRENT_LIST_DIR}/generate.sh ${RUSTUTILS_OUTPUT_DIR} ${RUSTUTILS_RS_FILES}
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/generate.sh ${RUSTUTILS_RS_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
COMMENT "Generating C++ bindings for Rust sources"
VERBATIM
)
add_custom_target(rustutils_bindings DEPENDS ${RUSTUTILS_GENERATED_SOURCES} ${RUSTUTILS_GENERATED_HEADERS})
add_library(mbgl-rustutils STATIC
${RUSTUTILS_GENERATED_SOURCES}
)
add_dependencies(mbgl-rustutils rustutils_bindings)
target_include_directories(mbgl-rustutils PUBLIC
${RUSTUTILS_INCLUDE_DIR}
)
target_link_libraries(mbgl-rustutils PUBLIC rustutils)