make rust code able to depend on core rlibs
This commit is contained in:
parent
40dcb115da
commit
72e1ded062
|
@ -136,10 +136,16 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
### rust compilation
|
### rust compilation
|
||||||
|
set(_SHELL_SCRIPT "${CMAKE_AR} vd \"${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a.tmp\" \"$(${CMAKE_AR} t ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a.tmp | grep \"lib${TARGET_NAME}\.${TARGET_NAME}\..*\.o\")\"")
|
||||||
# the compile command
|
# the compile command
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a
|
||||||
COMMAND ${RUSTC_BIN} ${RUST_CFLAGS} --emit=obj,dep-info=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj.d --crate-type=staticlib -o ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj ${RUST_TOP_SOURCE_FILE}
|
COMMAND ${RUSTC_BIN} ${RUST_CFLAGS} --emit=link,dep-info=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj.d,obj=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj --crate-type=staticlib -o ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a.tmp ${RUST_TOP_SOURCE_FILE}
|
||||||
|
# remove object file itself from the static library, so two-way references are possible.
|
||||||
|
# now the static library only contains dependency code from core etc
|
||||||
|
COMMAND bash -c ${_SHELL_SCRIPT}
|
||||||
|
COMMAND mv ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a.tmp ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a
|
||||||
|
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a.tmp
|
||||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj.d
|
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj.d
|
||||||
# ensures the bindgen happens before the rustc compilation
|
# ensures the bindgen happens before the rustc compilation
|
||||||
#DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/lib${TARGET_NAME}_bindgen.rlib
|
#DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/lib${TARGET_NAME}_bindgen.rlib
|
||||||
|
@ -149,8 +155,11 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
||||||
)
|
)
|
||||||
# add a virtual library that can be reused and referred to (not possible with a bare add_custom_command())
|
# add a virtual library that can be reused and referred to (not possible with a bare add_custom_command())
|
||||||
add_library(${TARGET_NAME} OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
|
add_library(${TARGET_NAME} OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
|
||||||
|
add_library(rdep_${TARGET_NAME} OBJECT ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a)
|
||||||
# add generated object file from the library to the code to compile
|
# add generated object file from the library to the code to compile
|
||||||
target_sources(${TOP_PROJECT} PUBLIC $<TARGET_PROPERTY:${TARGET_NAME},SOURCES>)
|
target_sources(${TOP_PROJECT} PUBLIC $<TARGET_PROPERTY:${TARGET_NAME},SOURCES>)
|
||||||
|
# also make top project depend on rdep, so stuff from eg the core crate will also get linked in
|
||||||
|
target_link_libraries(${TOP_PROJECT} ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a)
|
||||||
|
|
||||||
### rust-to-C bindings (generate C headers from .rs, cbindgen)
|
### rust-to-C bindings (generate C headers from .rs, cbindgen)
|
||||||
# cbindgen call
|
# cbindgen call
|
||||||
|
@ -158,11 +167,12 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h
|
||||||
COMMAND ${CBINDGEN_BIN} ${CBINDGEN_CFLAGS} -d --depfile ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h ${RUST_TOP_SOURCE_FILE}
|
COMMAND ${CBINDGEN_BIN} ${CBINDGEN_CFLAGS} -d --depfile ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h ${RUST_TOP_SOURCE_FILE}
|
||||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d
|
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d
|
||||||
MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/lib${TARGET_NAME}.a
|
||||||
|
#MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
||||||
VERBATIM
|
VERBATIM
|
||||||
)
|
)
|
||||||
# make a virtual library for the header files
|
# make a virtual library for the header files
|
||||||
add_library(rs2c_${TARGET_NAME} INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
|
add_library(rs2c_${TARGET_NAME} INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h) # ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
|
||||||
|
|
||||||
# add dependency to ensure build order and stuff
|
# add dependency to ensure build order and stuff
|
||||||
target_link_libraries(${TOP_PROJECT} rs2c_${TARGET_NAME})
|
target_link_libraries(${TOP_PROJECT} rs2c_${TARGET_NAME})
|
||||||
|
|
Loading…
Reference in New Issue