59 lines
1.5 KiB
CMake
59 lines
1.5 KiB
CMake
# build the Rust side as a static library
|
|
set(impl_basename "${CARGO_TARGET_DIR}/release/libPROJECT_NAME")
|
|
|
|
set(cargo_cmake_args)
|
|
set(diplomat_cmake_args)
|
|
|
|
if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.27")
|
|
list(APPEND cargo_cmake_args DEPENDS_EXPLICIT_ONLY)
|
|
list(APPEND diplomat_cmake_args DEPENDS_EXPLICIT_ONLY)
|
|
endif()
|
|
|
|
if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.28")
|
|
list(APPEND cargo_cmake_args JOB_SERVER_AWARE TRUE)
|
|
endif()
|
|
|
|
if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.31")
|
|
list(APPEND diplomat_cmake_args CODEGEN)
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${impl_basename}.a
|
|
COMMAND env CARGO_TARGET_DIR=${CARGO_TARGET_DIR} ${CARGO} build --release --package PROJECT-NAME
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
DEPFILE ${impl_basename}.d
|
|
USES_TERMINAL
|
|
VERBATIM
|
|
${cargo_cmake_args}
|
|
)
|
|
|
|
# HACK ensure CMake *actually adds* the command above
|
|
add_custom_target(build_impl
|
|
DEPENDS ${impl_basename}.a
|
|
)
|
|
|
|
add_library(PROJECT_NAME_impl STATIC IMPORTED)
|
|
|
|
set_target_properties(PROJECT_NAME_impl PROPERTIES
|
|
IMPORTED_LOCATION ${impl_basename}.a
|
|
)
|
|
|
|
# generate the bindings
|
|
set(bindings_dir "${CMAKE_CURRENT_BINARY_DIR}/include")
|
|
file(MAKE_DIRECTORY "${bindings_dir}")
|
|
set(bindings
|
|
"${bindings_dir}/Core.hpp"
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${bindings}
|
|
COMMAND ${diplomat} cpp "${bindings_dir}"
|
|
MAIN_DEPENDENCY "${CMAKE_SOURCE_DIR}/src/lib.rs"
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
VERBATIM
|
|
${diplomat_cmake_args}
|
|
)
|
|
|
|
target_sources(PROJECT_NAME_impl INTERFACE ${bindings})
|
|
target_include_directories(PROJECT_NAME_impl INTERFACE "${bindings_dir}")
|