@@ -141,18 +141,53 @@ set(RULES_IR_DIR "${CMAKE_BINARY_DIR}/rules")
141141
142142set (RUSTLS_HEADER "${PROJECT_SOURCE_DIR } /rules/rustls/rustls.h" )
143143
144+ set (PREPROCESSOR_BIN "${CMAKE_BINARY_DIR } /target_preprocessor/release/rule-preprocessor" )
145+ set (PREPROCESSOR_STAMP "${CMAKE_BINARY_DIR } /.rule-preprocessor.stamp" )
146+
147+ file (GLOB_RECURSE rule_preprocessor_sources
148+ ${PROJECT_SOURCE_DIR } /rule-preprocessor/src/*.rs )
149+
150+ execute_process (
151+ COMMAND ${CMAKE_COMMAND } -E env RUSTUP_TOOLCHAIN=${RUST_NIGHTLY_VERSION}
152+ rustc --print sysroot
153+ OUTPUT_VARIABLE NIGHTLY_SYSROOT
154+ OUTPUT_STRIP_TRAILING_WHITESPACE
155+ )
156+
157+ add_custom_command (
158+ OUTPUT ${RUSTLS_HEADER} ${PREPROCESSOR_STAMP}
159+ COMMAND cargo +${RUST_STABLE_VERSION} build --release
160+ --manifest-path "${PROJECT_SOURCE_DIR } /rules/Cargo.toml"
161+ COMMAND ${CMAKE_COMMAND } -E touch "${PREPROCESSOR_STAMP} "
162+ DEPENDS ${rule_preprocessor_sources}
163+ "${PROJECT_SOURCE_DIR } /rules/build.rs"
164+ "${PROJECT_SOURCE_DIR } /rules/Cargo.toml"
165+ "${RUST_STAMP_FILE} "
166+ VERBATIM
167+ )
168+
169+ add_custom_command (
170+ OUTPUT ${PREPROCESSOR_BIN}
171+ COMMAND ${CMAKE_COMMAND } -E env
172+ CARGO_TARGET_DIR=${CMAKE_BINARY_DIR}/target_preprocessor
173+ cargo +${RUST_NIGHTLY_VERSION} build --release
174+ --manifest-path "${PROJECT_SOURCE_DIR } /rule-preprocessor/Cargo.toml"
175+ DEPENDS ${rule_preprocessor_sources}
176+ "${RUST_STAMP_FILE} "
177+ VERBATIM
178+ )
179+
144180file (GLOB rule_subdirs ${PROJECT_SOURCE_DIR } /rules/* )
145181set (cpp_rules_ir_outputs)
146182set (rust_rules_ir_outputs)
147- set (rust_rules_inputs)
148183foreach (_rule_dir IN LISTS rule_subdirs)
149- file (GLOB _srcs ${_rule_dir} /src.c ${_rule_dir} /src.cpp )
150- if (NOT _srcs )
184+ file (GLOB _cpp_srcs ${_rule_dir} /src.c ${_rule_dir} /src.cpp )
185+ if (NOT _cpp_srcs )
151186 continue ()
152187 endif ()
153188 get_filename_component (_rule_name ${_rule_dir} NAME )
154189 set (_out_dir ${RULES_IR_DIR} /${_rule_name} )
155- set (_out ${_out_dir} /ir_src.json)
190+ set (_cpp_out ${_out_dir} /ir_src.json)
156191 set (_cxxflags)
157192 set (_cxxflags_file)
158193 if (EXISTS ${_rule_dir} /cxxflags)
@@ -163,39 +198,44 @@ foreach(_rule_dir IN LISTS rule_subdirs)
163198 endforeach ()
164199 endif ()
165200 add_custom_command (
166- OUTPUT ${_out }
201+ OUTPUT ${_cpp_out }
167202 COMMAND ${CMAKE_COMMAND } -E make_directory ${_out_dir}
168- COMMAND $<TARGET_FILE :cpp -rule -preprocessor > --dir ${_rule_dir} --out ${_out } ${_cxxflags}
169- DEPENDS ${_srcs } ${_cxxflags_file} ${PROJECT_SOURCE_DIR } /cpp2rust/cpp_rule_preprocessor.cpp ${RUSTLS_HEADER}
203+ COMMAND $<TARGET_FILE :cpp -rule -preprocessor > --dir ${_rule_dir} --out ${_cpp_out } ${_cxxflags}
204+ DEPENDS ${_cpp_srcs } ${_cxxflags_file} ${PROJECT_SOURCE_DIR } /cpp2rust/cpp_rule_preprocessor.cpp ${RUSTLS_HEADER}
170205 VERBATIM
171206 )
172- list (APPEND cpp_rules_ir_outputs ${_out} )
207+ list (APPEND cpp_rules_ir_outputs ${_cpp_out} )
208+
209+ set (_rust_srcs)
210+ set (_rust_out)
173211 if (EXISTS ${_rule_dir} /tgt_unsafe.rs)
174- list (APPEND rust_rules_ir_outputs ${_out_dir} /ir_unsafe.json)
175- list (APPEND rust_rules_inputs ${_rule_dir} /tgt_unsafe.rs)
212+ list (APPEND _rust_out ${_out_dir} /ir_unsafe.json)
213+ list (APPEND _rust_srcs ${_rule_dir} /tgt_unsafe.rs)
176214 endif ()
177215 if (EXISTS ${_rule_dir} /tgt_refcount.rs)
178- list (APPEND rust_rules_ir_outputs ${_out_dir} /ir_refcount.json)
179- list (APPEND rust_rules_inputs ${_rule_dir} /tgt_refcount.rs)
216+ list (APPEND _rust_out ${_out_dir} /ir_refcount.json)
217+ list (APPEND _rust_srcs ${_rule_dir} /tgt_refcount.rs)
180218 endif ()
219+ if (NOT _rust_srcs)
220+ continue ()
221+ endif ()
222+ add_custom_command (
223+ OUTPUT ${_rust_out}
224+ COMMAND ${CMAKE_COMMAND } -E make_directory ${_out_dir}
225+ COMMAND ${CMAKE_COMMAND } -E env
226+ CARGO_TARGET_DIR=${CMAKE_BINARY_DIR}/target_preprocessor
227+ RUSTUP_TOOLCHAIN=${RUST_NIGHTLY_VERSION}
228+ LD_LIBRARY_PATH=${NIGHTLY_SYSROOT}/lib
229+ DYLD_LIBRARY_PATH=${NIGHTLY_SYSROOT}/lib
230+ ${PREPROCESSOR_BIN} ${_out_dir} ${_rule_dir}
231+ DEPENDS ${_rust_srcs} ${PREPROCESSOR_BIN} ${PREPROCESSOR_STAMP}
232+ VERBATIM
233+ )
234+ list (APPEND rust_rules_ir_outputs ${_rust_out} )
181235endforeach ()
182236
183237add_custom_target ("preprocess-cpp-rules" ALL DEPENDS ${cpp_rules_ir_outputs} )
184238
185- file (GLOB_RECURSE rule_preprocessor_sources
186- ${PROJECT_SOURCE_DIR } /rule-preprocessor/src/*.rs )
187-
188- add_custom_command (
189- OUTPUT ${rust_rules_ir_outputs} ${RUSTLS_HEADER}
190- COMMAND cargo +${RUST_STABLE_VERSION} build --release --manifest-path "${PROJECT_SOURCE_DIR } /rules/Cargo.toml"
191- COMMAND ${CMAKE_COMMAND } -E env
192- CARGO_TARGET_DIR=${CMAKE_BINARY_DIR}/target_preprocessor
193- cargo +${RUST_NIGHTLY_VERSION} run --release --manifest-path "${PROJECT_SOURCE_DIR } /rule-preprocessor/Cargo.toml"
194- -- "${RULES_IR_DIR} "
195- DEPENDS ${rust_rules_inputs} ${rule_preprocessor_sources} "${RUST_STAMP_FILE} "
196- VERBATIM
197- )
198-
199239add_custom_target ("preprocess-rust-rules" ALL
200240 DEPENDS ${rust_rules_ir_outputs} )
201241
0 commit comments