@@ -225,115 +225,82 @@ HHVM_RENDER_CONFIG_SPECIFICATION(
225225 OUTPUT_PATH "${CMAKE_BINARY_DIR } /hphp/hack/src/hackc/compile"
226226)
227227
228- # Compiling cxx entrypoints for hhvm
229- #
230- # Usage:
231- # build_cxx_bridge(
232- # name
233- # DIR directory
234- # [EXTRA_SRCS src [src ...]]
235- # [LINK_LIBS lib [lib ...]]
236- # )
237- #
238- # Where:
239- # `name` is the target name of the cxx_bridge.
240- # `directory` is the required directory of the cxx_bridge sources.
241- # `src` are extra source files to include in the bridge.
242- # `lib` are extra link libraries to include in the bridge.
243- #
244- function (build_cxx_bridge NAME )
245- cmake_parse_arguments (CXX_BRIDGE "" "DIR" "EXTRA_SRCS;LINK_LIBS" ${ARGN} )
228+ set (
229+ FFI_CRATES
230+ "package_ffi"
231+ "parser_ffi"
232+ "compiler_ffi"
233+ "hdf"
234+ "hhvm_types_ffi"
235+ "hhvm_hhbc_defs_ffi"
236+ )
246237
247- if ("${CXX_BRIDGE_DIR} " STREQUAL "" )
248- message (FATAL_ERROR "Missing DIR parameter" )
249- endif ()
250- if (NOT "${CXX_BRIDGE_UNPARSED_ARGUMENTS} " STREQUAL "" )
251- message (FATAL_ERROR "Unexpected parameters: ${CXX_BRIDGE_UNPARSED_ARGUMENTS} " )
252- endif ()
238+ set (FFI_BRIDGE_SRC "${CMAKE_CURRENT_SOURCE_DIR } /src/hhvm_ffi" )
239+ set (FFI_BRIDGE_BIN "${RUST_FFI_BUILD_ROOT} /hphp/hack/src/hhvm_ffi" )
240+ set (RUST_PART_LIB "${RUST_FFI_BUILD_ROOT} /hphp/hack/src/hhvm_ffi/${PROFILE} /${CMAKE_STATIC_LIBRARY_PREFIX } hhvm_ffi${CMAKE_STATIC_LIBRARY_SUFFIX } " )
253241
254- set (FFI_BRIDGE_SRC "${CMAKE_CURRENT_SOURCE_DIR } /${CXX_BRIDGE_DIR} " )
255- set (FFI_BRIDGE_BIN "${RUST_FFI_BUILD_ROOT} /hphp/hack/${CXX_BRIDGE_DIR} " )
256-
257- set (RUST_PART_LIB "${FFI_BRIDGE_BIN} /${PROFILE} /${CMAKE_STATIC_LIBRARY_PREFIX }${NAME}${CMAKE_STATIC_LIBRARY_SUFFIX } " )
258- set (RUST_PART_CXX "${FFI_BRIDGE_BIN} /${NAME} .cpp" )
259- set (RUST_PART_HEADER "${FFI_BRIDGE_BIN} /${NAME} .rs.h" )
260- set (GENERATED "${FFI_BRIDGE_BIN} /cxxbridge/${NAME} /${NAME} " )
261- set (GENERATED_CXXBRIDGE "${FFI_BRIDGE_BIN} /cxxbridge" )
262-
263- add_custom_command (
264- OUTPUT
265- ${RUST_PART_CXX}
266- ${RUST_PART_HEADER}
267- ${RUST_PART_LIB}
268- ${GENERATED_CXXBRIDGE}
269- COMMAND
270- ${CMAKE_COMMAND } -E make_directory "${FFI_BRIDGE_BIN} " &&
271- . "${CMAKE_CURRENT_BINARY_DIR } /dev_env_rust_only.sh" &&
272- ${INVOKE_CARGO} "${NAME} " "${NAME} " --target-dir "${FFI_BRIDGE_BIN} " &&
273- ${CMAKE_COMMAND } -E copy "${GENERATED} .rs.cc" "${RUST_PART_CXX} " &&
274- ${CMAKE_COMMAND } -E copy "${GENERATED} .rs.h" "${RUST_PART_HEADER} "
275- WORKING_DIRECTORY ${FFI_BRIDGE_SRC}
276- DEPENDS rustc cargo "${OPCODE_DATA} "
277- )
278- add_custom_target (
279- "${NAME} _cxx"
280- DEPENDS ${RUST_PART_LIB}
281- )
282- add_library ("${NAME} " STATIC ${RUST_PART_CXX} ${CXX_BRIDGE_EXTRA_SRCS} )
283- add_dependencies (hack_rust_ffi_bridge_targets "${NAME} " )
284- add_library ("${NAME} _rust_part" STATIC IMPORTED )
285- add_dependencies ("${NAME} _rust_part" "${NAME} _cxx" )
286-
287- # Intentionally create link-time cyclic dependency between ${NAME}_rust_part
288- # and ${NAME} so that CMake will automatically construct the link line so
289- # that the linker will scan through involved static libraries multiple times.
290- set_target_properties (
291- "${NAME} _rust_part"
292- PROPERTIES
293- IMPORTED_LOCATION ${RUST_PART_LIB}
294- IMPORTED_LINK_DEPENDENT_LIBRARIES "${NAME} "
295- )
296- target_link_libraries (
297- "${NAME} "
298- PUBLIC
299- "${NAME} _rust_part"
300- ${CXX_BRIDGE_LINK_LIBS}
301- )
302- target_include_directories ("${NAME} " INTERFACE "${RUST_FFI_BUILD_ROOT} " )
303- target_include_directories ("${NAME} " PRIVATE "${GENERATED_CXXBRIDGE} " )
304- endfunction ()
242+ foreach (NAME ${FFI_CRATES} )
243+ list (APPEND FFI_CXXBRIDGE_ORIG_SRCS "${FFI_BRIDGE_BIN} /cxxbridge/${NAME} /${NAME} .rs.cc" )
244+ list (APPEND FFI_CXXBRIDGE_SRCS "${FFI_BRIDGE_BIN} /${NAME} .rs.cc" )
245+
246+ list (APPEND FFI_CXXBRIDGE_ORIG_HEADERS "${FFI_BRIDGE_BIN} /cxxbridge/${NAME} /${NAME} .rs.h" )
247+ list (APPEND FFI_CXXBRIDGE_HEADERS "${FFI_BRIDGE_BIN} /${NAME} .rs.h" )
248+ endforeach ()
305249
306- build_cxx_bridge (
307- package_ffi
308- DIR "src/package/ffi_bridge"
250+ add_custom_command (
251+ OUTPUT
252+ ${RUST_PART_LIB} ${FFI_CXXBRIDGE_ORIG_SRCS} ${FFI_CXXBRIDGE_ORIG_HEADERS}
253+ COMMAND
254+ ${CMAKE_COMMAND } -E make_directory "${FFI_BRIDGE_BIN} " &&
255+ . "${CMAKE_CURRENT_BINARY_DIR } /dev_env_rust_only.sh" &&
256+ ${CMAKE_COMMAND } -E env CXX=${CMAKE_CXX_COMPILER} CXXFLAGS=${CMAKE_CXX_FLAGS} ${INVOKE_CARGO} hhvm_ffi hhvm_ffi --target-dir "${FFI_BRIDGE_BIN} "
257+ WORKING_DIRECTORY ${FFI_BRIDGE_SRC}
258+ DEPENDS rustc cargo hackc_options "${OPCODE_DATA} "
309259)
310- build_cxx_bridge (
311- parser_ffi
312- DIR "src/parser/ffi_bridge"
260+
261+ add_custom_target (
262+ hack_rust_ffi_bridge_rust_build
263+ DEPENDS ${RUST_PART_LIB}
313264)
314- build_cxx_bridge (
315- compiler_ffi
316- DIR "src/hackc/ffi_bridge"
317- EXTRA_SRCS "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/ffi_bridge/external_decl_provider.cpp"
318- LINK_LIBS hdf
265+
266+ add_custom_command (
267+ OUTPUT ${FFI_CXXBRIDGE_HEADERS} ${FFI_CXXBRIDGE_SRCS}
268+ COMMAND
269+ ${CMAKE_COMMAND } -E make_directory "${FFI_BRIDGE_BIN} " &&
270+ ${CMAKE_COMMAND } -E copy_if_different ${FFI_CXXBRIDGE_ORIG_HEADERS} ${FFI_BRIDGE_BIN} &&
271+ ${CMAKE_COMMAND } -E copy_if_different ${FFI_CXXBRIDGE_ORIG_SRCS} ${FFI_BRIDGE_BIN}
272+ DEPENDS ${FFI_CXXBRIDGE_ORIG_HEADERS} ${FFI_CXXBRIDGE_ORIG_SRCS}
319273)
320- build_cxx_bridge (
321- hdf
322- DIR "src/utils/hdf"
323- EXTRA_SRCS "${CMAKE_CURRENT_SOURCE_DIR } /src/utils/hdf/hdf-wrap.cpp"
324- LINK_LIBS folly
274+
275+ add_custom_target (
276+ hack_rust_ffi_bridge_copy_cxxbridge
277+ DEPENDS ${FFI_CXXBRIDGE_HEADERS} ${FFI_CXXBRIDGE_SRCS}
325278)
326- build_cxx_bridge (
327- hhvm_types_ffi
328- DIR "src/hackc/hhvm_cxx/hhvm_types"
329- EXTRA_SRCS "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/hhvm_cxx/hhvm_types/as-base-ffi.cpp"
279+
280+ add_library (hack_rust_ffi_bridge_rust_part STATIC IMPORTED )
281+ add_dependencies (hack_rust_ffi_bridge_rust_part hack_rust_ffi_bridge_rust_build hack_rust_ffi_bridge_copy_cxxbridge )
282+ set_target_properties (
283+ hack_rust_ffi_bridge_rust_part
284+ PROPERTIES
285+ IMPORTED_LOCATION ${RUST_PART_LIB}
286+ # Intentionally create a link-time cyclic dependency between the Rust library
287+ # and the dependent C++ library so that CMake will automatically construct the link line,
288+ # causing the linker to scan through involved static libraries multiple times.
289+ IMPORTED_LINK_DEPENDENT_LIBRARIES hack_rust_ffi_bridge
330290)
331- build_cxx_bridge (
332- hhvm_hhbc_defs_ffi
333- DIR "src/hackc/hhvm_cxx/hhvm_hhbc_defs"
334- EXTRA_SRCS "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/hhvm_cxx/hhvm_hhbc_defs/as-hhbc-ffi.cpp"
291+
292+ add_library (
293+ hack_rust_ffi_bridge
294+ ${FFI_CXXBRIDGE_SRCS}
295+ "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/ffi_bridge/external_decl_provider.cpp"
296+ "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/hhvm_cxx/hhvm_types/as-base-ffi.cpp"
297+ "${CMAKE_CURRENT_SOURCE_DIR } /src/hackc/hhvm_cxx/hhvm_hhbc_defs/as-hhbc-ffi.cpp"
335298)
336299
300+ target_link_libraries (hack_rust_ffi_bridge PRIVATE folly hack_rust_ffi_bridge_rust_part )
301+ target_include_directories (hack_rust_ffi_bridge INTERFACE "${RUST_FFI_BUILD_ROOT} " )
302+ target_include_directories (hack_rust_ffi_bridge PRIVATE "${FFI_BRIDGE_BIN} /cxxbridge" )
303+
337304if (NOT LZ4_FOUND)
338305 add_dependencies (hack_dune lz4 )
339306 add_dependencies (hack_dune_debug lz4 )
0 commit comments