# 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 GLOBAL) 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 "lib.rs" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" VERBATIM ${diplomat_cmake_args} ) # HACK ensure CMake *actually adds* the command above add_custom_target(codegen_impl DEPENDS ${bindings} ) target_sources(PROJECT_NAME_impl INTERFACE ${bindings}) target_include_directories(PROJECT_NAME_impl INTERFACE "${bindings_dir}")