From 40dcb115da6909eea9ca34180ed2e499ddfc3686 Mon Sep 17 00:00:00 2001 From: sys64738 Date: Thu, 16 Jan 2025 02:20:12 +0100 Subject: [PATCH] fix stuff --- cmake/rust-obj.cmake | 94 +++++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/cmake/rust-obj.cmake b/cmake/rust-obj.cmake index de158e1..6328d37 100644 --- a/cmake/rust-obj.cmake +++ b/cmake/rust-obj.cmake @@ -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 + $ + $>,PREPEND,-D> + $,PREPEND,-isystem> +# $>,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("--use-core" IN_LIST BINDGEN_CFLAGS) - 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 - 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} - VERBATIM - ) - 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 - ) + 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_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 ${CMAKE_CURRENT_BINARY_DIR}/generated/rust_${TARGET_NAME}/${HEADER_NAME}_bindgen_pre.h + VERBATIM +# COMMAND_EXPAND_LISTS + ) 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 $) + + ### 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()