# build the Rust side as a static library set(impl_basename "${CARGO_TARGET_DIR}/release/libPROJECT_NAME_impl") add_custom_command( OUTPUT ${impl_basename}.a COMMAND env CARGO_TARGET_DIR=${CARGO_TARGET_DIR} ${CARGO} build --release --package PROJECT-NAME-impl WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPFILE ${impl_basename}.d USES_TERMINAL JOB_SERVER_AWARE TRUE VERBATIM DEPENDS_EXPLICIT_ONLY ) # 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 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") set(bindings_basename "${CMAKE_CURRENT_BINARY_DIR}/include/bindings") add_custom_command( OUTPUT ${bindings_basename}.hxx COMMAND ${CBINDGEN} --only-target-dependencies --output "${bindings_basename}.hxx" --depfile "${bindings_basename}.d" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPFILE ${bindings_basename}.d VERBATIM CODEGEN DEPENDS_EXPLICIT_ONLY ) target_sources(PROJECT_NAME_impl INTERFACE ${bindings_basename}.hxx ) target_include_directories(PROJECT_NAME_impl INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/include" )