fix stuff

This commit is contained in:
Triss 2025-01-16 02:20:12 +01:00
parent d1a0fdc9dd
commit 40dcb115da
1 changed files with 59 additions and 35 deletions

View File

@ -73,26 +73,50 @@ function(add_rust_object TOP_PROJECT RUST_TOP_SOURCE_FILE)
cmake_path(GET HEADER_PATH STEM HEADER_NAME) cmake_path(GET HEADER_PATH STEM HEADER_NAME)
if(NOT(HEADER_PATH STREQUAL "")) 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 # 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) 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( add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs 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 ${_BINDGEN_COMMAND_START} -o ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen.rs.tmp -- ${_BINDGEN_CFLAGS}
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 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 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 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 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) 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 # 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()
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 ### rust compilation
# the compile command # the compile command
add_custom_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_library(${TARGET_NAME} OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.obj)
# 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>)
### 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() endfunction()