fix stuff
This commit is contained in:
parent
d1a0fdc9dd
commit
40dcb115da
|
@ -73,26 +73,50 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
|||
cmake_path(GET HEADER_PATH STEM HEADER_NAME)
|
||||
|
||||
if(NOT(HEADER_PATH STREQUAL ""))
|
||||
set(_BINDGEN_CFLAGS
|
||||
$<TARGET_PROPERTY:${TOP_PROJECT},COMPILE_OPTIONS>
|
||||
$<LIST:TRANSFORM,$<LIST:SORT,$<TARGET_PROPERTY:${TOP_PROJECT},COMPILE_DEFINITIONS>>,PREPEND,-D>
|
||||
$<LIST:TRANSFORM,$<TARGET_PROPERTY:${TOP_PROJECT},INCLUDE_DIRECTORIES>,PREPEND,-isystem>
|
||||
# $<LIST:TRANSFORM,$<LIST:SORT,$<TARGET_PROPERTY:${TOP_PROJECT},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>>,PREPEND,-isystem>
|
||||
)
|
||||
|
||||
# preprocess C headers with top_project C compiler -- might use different system dirs & compatibility stuff & whatnot
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h
|
||||
# yeah, need two commands........
|
||||
COMMAND ${CMAKE_C_COMPILER} ${_BINDGEN_CFLAGS} -E -MM -MF ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h.d ${HEADER_PATH}
|
||||
COMMAND ${CMAKE_C_COMPILER} ${_BINDGEN_CFLAGS} -E -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h ${HEADER_PATH}
|
||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h.d
|
||||
MAIN_DEPENDENCY ${HEADER_PATH}
|
||||
VERBATIM
|
||||
COMMAND_EXPAND_LISTS
|
||||
)
|
||||
add_custom_target(c2rs_${TARGET_NAME}_src_tgt_hdr_pre DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h)
|
||||
|
||||
# generate rs from c headers
|
||||
if(DEFINED RUST_TARGET)
|
||||
# necessary for bindgen itself, but not for preprocessor stuff above
|
||||
set(_BINDGEN_CFLAGS -target ${RUST_TARGET}) #${_BINDGEN_CFLAGS}
|
||||
endif()
|
||||
set(_BINDGEN_COMMAND_START ${BINDGEN_BIN} ${BINDGEN_CFLAGS}
|
||||
--depfile ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.d
|
||||
${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h
|
||||
)
|
||||
# need to prepend the generated rust source with some directives to not make the compiler blow up
|
||||
set(_PYTHON_SCRIPT "import sys\;f=open\(sys.argv[-1]+'.tmp','r'\).read\(\)\;open\(sys.argv[-1],'w'\).write\('#\![allow(non_camel_case_types,non_snake_case,nonstandard_style)]'+chr(10)+f\)")
|
||||
if("--use-core" IN_LIST BINDGEN_CFLAGS)
|
||||
set(_PYTHON_SCRIPT "import sys\;f=open\(sys.argv[-1]+'.tmp','r'\).read\(\)\;open\(sys.argv[-1],'w'\).write\('#\![no_std]'+chr(10)+'#\![allow(non_camel_case_types,non_snake_case,nonstandard_style)]'+chr(10)+f\)")
|
||||
endif()
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs
|
||||
COMMAND ${BINDGEN_BIN} ${BINDGEN_CFLAGS} --depfile ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.d -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.tmp ${HEADER_PATH}
|
||||
COMMAND python -c "import sys;f=open\(sys.argv[1]+'.tmp','r'\).read\(\);open\(sys.argv[1],'w'\).write\('#![no_std]'+chr(10)+f\)" ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs
|
||||
COMMAND ${_BINDGEN_COMMAND_START} -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.tmp -- ${_BINDGEN_CFLAGS}
|
||||
COMMAND python -c ${_PYTHON_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs
|
||||
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.tmp
|
||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.d
|
||||
MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
||||
MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h
|
||||
VERBATIM
|
||||
# COMMAND_EXPAND_LISTS
|
||||
)
|
||||
else()
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs
|
||||
COMMAND ${BINDGEN_BIN} ${BINDGEN_CFLAGS} --depfile ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.d -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs ${HEADER_PATH}
|
||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.d
|
||||
MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
||||
VERBATIM
|
||||
)
|
||||
endif()
|
||||
add_custom_target(c2rs_${TARGET_NAME}_src_tgt DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs)
|
||||
|
||||
# build crate from it so we can actually import it
|
||||
|
@ -111,23 +135,6 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
### rust-to-C bindings (generate C headers from .rs, cbindgen)
|
||||
# cbindgen call
|
||||
add_custom_command(
|
||||
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}
|
||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d
|
||||
MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
||||
VERBATIM
|
||||
)
|
||||
# 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)
|
||||
|
||||
# add dependency to ensure build order and stuff
|
||||
target_link_libraries(${TOP_PROJECT} rs2c_${TARGET_NAME})
|
||||
# and add include directories
|
||||
target_include_directories(${TOP_PROJECT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/)
|
||||
|
||||
### rust compilation
|
||||
# the compile command
|
||||
add_custom_command(
|
||||
|
@ -144,5 +151,22 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
|
|||
add_library(${TARGET_NAME} OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
|
||||
# add generated object file from the library to the code to compile
|
||||
target_sources(${TOP_PROJECT} PUBLIC $<TARGET_PROPERTY:${TARGET_NAME},SOURCES>)
|
||||
|
||||
### rust-to-C bindings (generate C headers from .rs, cbindgen)
|
||||
# cbindgen call
|
||||
add_custom_command(
|
||||
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}
|
||||
DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${TARGET_NAME}.h.d
|
||||
MAIN_DEPENDENCY ${RUST_TOP_SOURCE_FILE}
|
||||
VERBATIM
|
||||
)
|
||||
# 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 dependency to ensure build order and stuff
|
||||
target_link_libraries(${TOP_PROJECT} rs2c_${TARGET_NAME})
|
||||
# and add include directories
|
||||
target_include_directories(${TOP_PROJECT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/)
|
||||
endfunction()
|
||||
|
||||
|
|
Loading…
Reference in New Issue