mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-25 11:00:35 +00:00
before this change, these [convenience libraries](https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html) were implicitly built as static libraries by default, but weren't explicitly marked as STATIC in CMake. While this worked with default settings, it could cause issues if `BUILD_SHARED_LIBS` is enabled. So before we are ready for building these components as shared libraries, let's mark all convenience libraries as STATIC for consistency and to prevent potential issues before we properly support shared library builds. Signed-off-by: Kefu Chai <kefu.chai@scylladb.com> Closes scylladb/scylladb#21274
100 lines
3.0 KiB
CMake
100 lines
3.0 KiB
CMake
find_program(CARGO cargo
|
|
REQUIRED)
|
|
|
|
function(add_rust_library name)
|
|
# used for profiles defined in Cargo.toml
|
|
if(CMAKE_CONFIGURATION_TYPES)
|
|
foreach(config ${CMAKE_CONFIGURATION_TYPES})
|
|
string(APPEND build_mode
|
|
"$<$<CONFIG:${config}>:${scylla_build_mode_${config}}>")
|
|
endforeach()
|
|
else()
|
|
set(build_mode ${scylla_build_mode_${CMAKE_BUILD_TYPE}})
|
|
endif()
|
|
set(profile "rust-${build_mode}")
|
|
set(target_dir ${CMAKE_CURRENT_BINARY_DIR})
|
|
set(library ${target_dir}/lib${name}.a)
|
|
add_custom_command(
|
|
OUTPUT ${library}
|
|
COMMAND ${CMAKE_COMMAND} -E env CARGO_BUILD_DEP_INFO_BASEDIR=. ${CARGO} build --locked --target-dir=${target_dir} --profile=${profile}
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${target_dir}/${profile}/lib${name}.a ${library}
|
|
DEPENDS Cargo.lock
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
COMMENT "Building Rust library: ${library}")
|
|
add_custom_target(rust-${name}
|
|
DEPENDS ${target_dir}/lib${name}.a)
|
|
add_library(Rust::${name} STATIC IMPORTED)
|
|
add_dependencies(Rust::${name} rust-${name})
|
|
set_target_properties(Rust::${name} PROPERTIES
|
|
IMPORTED_LOCATION "${library}")
|
|
endfunction(add_rust_library)
|
|
|
|
find_program(CXXBRIDGE cxxbridge
|
|
REQUIRED)
|
|
# Generate cxxbridge header and source
|
|
function(generate_cxxbridge name)
|
|
cmake_parse_arguments(parsed_args
|
|
""
|
|
"INPUT;OUTPUT_DIR;INCLUDE;SOURCES" "" ${ARGN})
|
|
set(input ${CMAKE_CURRENT_SOURCE_DIR}/${parsed_args_INPUT})
|
|
set(output_dir ${parsed_args_OUTPUT_DIR})
|
|
set(header ${output_dir}/${name}.hh)
|
|
set(source ${output_dir}/${name}.cc)
|
|
set(outputs ${header} ${source})
|
|
set(command ${CXXBRIDGE} ${input} --include ${parsed_args_INCLUDE})
|
|
add_custom_command(
|
|
DEPENDS ${input}
|
|
OUTPUT ${outputs}
|
|
COMMAND ${command} --header --output ${header}
|
|
COMMAND ${command} --output ${source})
|
|
|
|
set(${parsed_args_SOURCES} ${outputs} PARENT_SCOPE)
|
|
endfunction(generate_cxxbridge)
|
|
|
|
|
|
add_rust_library(rust_combined)
|
|
|
|
set(binding_gen_build_dir "${scylla_gen_build_dir}/rust")
|
|
|
|
set(cxx_header "${binding_gen_build_dir}/cxx.h")
|
|
add_custom_command(
|
|
OUTPUT ${cxx_header}
|
|
COMMAND ${CXXBRIDGE} --header --output ${cxx_header})
|
|
generate_cxxbridge(wasmtime_bindings
|
|
INPUT wasmtime_bindings/src/lib.rs
|
|
INCLUDE rust/cxx.h
|
|
OUTPUT_DIR "${binding_gen_build_dir}"
|
|
SOURCES wasmtime_bindings_sources)
|
|
|
|
set_target_properties(Rust::rust_combined PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
add_library(wasmtime_bindings STATIC)
|
|
target_sources(wasmtime_bindings
|
|
PRIVATE
|
|
${cxx_header}
|
|
${wasmtime_bindings_sources})
|
|
target_include_directories(wasmtime_bindings
|
|
PUBLIC
|
|
${scylla_gen_build_dir})
|
|
target_link_libraries(wasmtime_bindings
|
|
INTERFACE Rust::rust_combined)
|
|
|
|
# only for testing
|
|
generate_cxxbridge(inc
|
|
INPUT inc/src/lib.rs
|
|
INCLUDE rust/cxx.h
|
|
OUTPUT_DIR "${binding_gen_build_dir}"
|
|
SOURCES inc_sources)
|
|
|
|
add_library(inc STATIC)
|
|
target_sources(inc
|
|
PRIVATE
|
|
${cxx_header}
|
|
${inc_sources})
|
|
target_include_directories(inc
|
|
PUBLIC
|
|
${scylla_gen_build_dir})
|
|
target_link_libraries(inc
|
|
INTERFACE Rust::rust_combined)
|