From 3cd9aa1448a7a37bd1326c2813d6ba41d45904a7 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 4 Jun 2023 16:11:45 +0800 Subject: [PATCH] build: cmake: build .wat from source files we compile .wat files from .rs and .c source files since 6d89d718d9dafabf98871c6006aec03f46a4f4df. these .wat are used by test/cql-pytest/test_wasm.py . let's update the CMake building system accordingly so these .wat files can also be generated using the "wasm" target. since the ctest system is not used. this change should allow us to perform this test manually. Signed-off-by: Kefu Chai Closes #14126 --- test/CMakeLists.txt | 1 + test/resource/wasm/CMakeLists.txt | 21 ++++++++++ test/resource/wasm/c/CMakeLists.txt | 46 +++++++++++++++++++++ test/resource/wasm/rust/CMakeLists.txt | 56 ++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 test/resource/wasm/CMakeLists.txt create mode 100644 test/resource/wasm/c/CMakeLists.txt create mode 100644 test/resource/wasm/rust/CMakeLists.txt diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 76371de08f..6fbd90ae0b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -76,4 +76,5 @@ if(BUILD_TESTING) add_subdirectory(boost) add_subdirectory(manual) add_subdirectory(unit) + add_subdirectory(resource/wasm) endif() diff --git a/test/resource/wasm/CMakeLists.txt b/test/resource/wasm/CMakeLists.txt new file mode 100644 index 0000000000..8e9211d3e3 --- /dev/null +++ b/test/resource/wasm/CMakeLists.txt @@ -0,0 +1,21 @@ +find_program(WASM2WAT wasm2wat) +if(NOT WASM2WAT) + message(FATAL_ERROR "wasm2wat is required") +endif() + +function(wasm2wat input) + cmake_parse_arguments(parsed_args "" "WAT;OUT_DIR" "" ${ARGN}) + get_filename_component(basename ${input} NAME_WE) + set(output_dir "${parsed_args_OUT_DIR}") + set(output "${output_dir}/${basename}.wat") + add_custom_command( + OUTPUT ${output} + COMMAND ${WASM2WAT} ${input} --output=${output} + DEPENDS ${input} + COMMENT "Generating WebAssembly Text ${output}") + set(${parsed_args_WAT} ${output} PARENT_SCOPE) +endfunction() + +add_custom_target(wasm) +add_subdirectory(c) +add_subdirectory(rust) diff --git a/test/resource/wasm/c/CMakeLists.txt b/test/resource/wasm/c/CMakeLists.txt new file mode 100644 index 0000000000..3046ab1a09 --- /dev/null +++ b/test/resource/wasm/c/CMakeLists.txt @@ -0,0 +1,46 @@ +find_program(CLANG clang) +if(NOT CLANG) + message(FATAL_ERROR "clang is required") +endif() + +function(compile_c_to_wasm input) + cmake_parse_arguments(parsed_args "" "WASM;OUT_DIR" "" ${ARGN}) + get_filename_component(basename ${input} NAME_WE) + set(input "${CMAKE_CURRENT_SOURCE_DIR}/${input}") + set(output_dir "${parsed_args_OUT_DIR}") + set(output "${output_dir}/${basename}.wasm") + set(target "wasm32") + add_custom_command( + OUTPUT ${output} + COMMAND ${CLANG} ${input} + --target=wasm32 + --no-standard-libraries + -Wl,--export-all -Wl,--no-entry + -o ${output} + DEPENDS ${input} + COMMENT "Building WASM ${output}") + set(${parsed_args_WASM} ${output} PARENT_SCOPE) +endfunction(compile_c_to_wasm) + +set(c_srcs + test_UDA_final.c + test_UDA_scalar.c + test_fib_called_on_null.c + test_mem_grow.c + test_pow.c + test_word_double.c) + +foreach(c_src ${c_srcs}) + compile_c_to_wasm(${c_src} + OUT_DIR "${CMAKE_BINARY_DIR}/wasm" + WASM wasm) + wasm2wat(${wasm} + OUT_DIR "${CMAKE_BINARY_DIR}/wasm" + WAT wat) + list(APPEND wasms ${wat}) +endforeach() + +add_custom_target(wasm_c + DEPENDS ${wasms}) +add_dependencies(wasm + wasm_c) diff --git a/test/resource/wasm/rust/CMakeLists.txt b/test/resource/wasm/rust/CMakeLists.txt new file mode 100644 index 0000000000..d09918de75 --- /dev/null +++ b/test/resource/wasm/rust/CMakeLists.txt @@ -0,0 +1,56 @@ +find_program(CARGO cargo) +if(NOT CARGO) + message(FATAL_ERROR "cargo is required") +endif() + +function(compile_rust_to_wasm input) + cmake_parse_arguments(parsed_args "" "WASM;OUT_DIR" "" ${ARGN}) + get_filename_component(basename ${input} NAME_WE) + set(input "${CMAKE_CURRENT_SOURCE_DIR}/${input}") + set(output_dir "${parsed_args_OUT_DIR}") + set(output "${output_dir}/${basename}.wasm") + set(target "wasm32-wasi") + set(mode "debug") + set(package "examples") + add_custom_command( + OUTPUT ${output} + COMMAND + ${CARGO} build + --target=${target} + --example=${basename} + --locked + --manifest-path=Cargo.toml + --target-dir=${CMAKE_CURRENT_BINARY_DIR} + COMMAND "wasm-opt" + "${CMAKE_CURRENT_BINARY_DIR}/${target}/${profile}/${mode}/${package}/${basename}.wasm" + "-Oz" + "-o" "${output}" + COMMAND "wasm-strip" "${output}" + DEPENDS ${input} Cargo.lock + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building WASM ${output}" + VERBATIM) + set(${parsed_args_WASM} ${output} PARENT_SCOPE) +endfunction(compile_rust_to_wasm) + +set(rust_srcs + return_input.rs + test_complex_null_values.rs + test_functions_with_frozen_types.rs + test_short_ints.rs + test_types_with_and_without_nulls.rs) + +foreach(rust_src ${rust_srcs}) + compile_rust_to_wasm(${rust_src} + OUT_DIR "${CMAKE_BINARY_DIR}/wasm" + WASM wasm) + wasm2wat(${wasm} + OUT_DIR "${CMAKE_BINARY_DIR}/wasm" + WAT wat) + list(APPEND wasms ${wat}) +endforeach() + +add_custom_target(wasm_rust + DEPENDS ${wasms}) +add_dependencies(wasm + wasm_rust)