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:
63
rustutils/rustutils.cmake
Normal file
63
rustutils/rustutils.cmake
Normal 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)
|
||||
Reference in New Issue
Block a user