# # Copyright 2016 WebAssembly Community Group participants # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # cmake_minimum_required(VERSION 3.16) project(WABT LANGUAGES C CXX VERSION 1.0.36) include(GNUInstallDirs) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Check if wabt is being used directly or via add_subdirectory, FetchContent, etc string(COMPARE EQUAL "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}" PROJECT_IS_TOP_LEVEL) # By default use the project version as the version string set(WABT_VERSION_STRING "${PROJECT_VERSION}") # For git users, attempt to generate a more useful version string if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) find_package(Git) if (Git_FOUND) execute_process( COMMAND "${GIT_EXECUTABLE}" -C "${WABT_SOURCE_DIR}" describe --tags RESULT_VARIABLE GIT_VERSION_RESULT ERROR_VARIABLE GIT_VERSION_ERROR ERROR_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) if (GIT_VERSION_RESULT EQUAL 0) # If we're actually on the tag for this version, don't add the commit description if (NOT GIT_VERSION STREQUAL "${WABT_VERSION_STRING}") string(APPEND WABT_VERSION_STRING " (git~${GIT_VERSION})") endif () elseif (PROJECT_IS_TOP_LEVEL) message(NOTICE "git: ${GIT_VERSION_ERROR}\n ** Did you forget to run `git fetch --tags`?") endif () endif () endif () option(BUILD_TESTS "Build GTest-based tests" ON) option(USE_SYSTEM_GTEST "Use system GTest, instead of building" OFF) option(BUILD_TOOLS "Build wabt commandline tools" ON) option(BUILD_FUZZ_TOOLS "Build tools that can repro fuzz bugs" OFF) option(BUILD_LIBWASM "Build libwasm" ON) option(USE_ASAN "Use address sanitizer" OFF) option(USE_MSAN "Use memory sanitizer" OFF) option(USE_LSAN "Use leak sanitizer" OFF) option(USE_UBSAN "Use undefined behavior sanitizer" OFF) option(CODE_COVERAGE "Build with code coverage enabled" OFF) option(WITH_EXCEPTIONS "Build with exceptions enabled" OFF) option(WERROR "Build with warnings as errors" OFF) option(WABT_INSTALL_RULES "Include WABT's install() rules" "${PROJECT_IS_TOP_LEVEL}") # WASI support is still a work in progress. # Only a handful of syscalls are supported at this point. option(WITH_WASI "Build WASI support via uvwasi" OFF) option(USE_INTERNAL_SHA256 "Use internal PicoSHA2 for SHA-256 support instead of OpenSSL libcrypto" OFF) if (MSVC) set(COMPILER_IS_CLANG 0) set(COMPILER_IS_GNU 0) set(COMPILER_IS_MSVC 1) elseif (CMAKE_C_COMPILER_ID MATCHES "Clang") set(COMPILER_IS_CLANG 1) set(COMPILER_IS_GNU 0) set(COMPILER_IS_MSVC 0) elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") set(COMPILER_IS_CLANG 0) set(COMPILER_IS_GNU 1) set(COMPILER_IS_MSVC 0) elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") set(COMPILER_IS_CLANG 1) set(COMPILER_IS_GNU 0) set(COMPILER_IS_MSVC 0) else () set(COMPILER_IS_CLANG 0) set(COMPILER_IS_GNU 0) set(COMPILER_IS_MSVC 0) endif () include(CheckIncludeFile) include(CheckSymbolExists) check_include_file("alloca.h" HAVE_ALLOCA_H) check_include_file("unistd.h" HAVE_UNISTD_H) check_include_file("setjmp.h" HAVE_SETJMP_H) check_symbol_exists(snprintf "stdio.h" HAVE_SNPRINTF) check_symbol_exists(strcasecmp "strings.h" HAVE_STRCASECMP) if (NOT USE_INTERNAL_SHA256) find_package(OpenSSL QUIET) if (OpenSSL_FOUND) set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) check_include_file("openssl/sha.h" HAVE_OPENSSL_SHA_H) if (HAVE_OPENSSL_SHA_H) find_package_message(OpenSSL "Using OpenSSL libcrypto for SHA-256" "${HAVE_OPENSSL_SHA_H}") endif() endif() endif() if (WIN32) if(${CMAKE_GENERATOR_PLATFORM} MATCHES "ARM64") # https://discourse.cmake.org/t/visual-studio-error-unable-to-deploy-local-file-c-x64-release-zero-check/2072 # Target ZERO_CHECK blocks remote debugger of ARM64 in Visual Studio set(CMAKE_SUPPRESS_REGENERATION ON) endif() check_symbol_exists(ENABLE_VIRTUAL_TERMINAL_PROCESSING "windows.h" HAVE_WIN32_VT100) endif () include(CheckTypeSize) check_type_size(ssize_t SSIZE_T) check_type_size(size_t SIZEOF_SIZE_T) include(TestBigEndian) # Note: deprecated in CMake 3.20 test_big_endian(WABT_BIG_ENDIAN) if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(WABT_DEBUG 1) endif () configure_file(src/config.h.in include/wabt/config.h @ONLY) if (COMPILER_IS_MSVC) if (WERROR) add_definitions(-WX) endif () # disable warning C4018: signed/unsigned mismatch # disable warning C4056, C4756: overflow in floating-point constant arithmetic # seems to not like float compare w/ HUGE_VALF; bug? # disable warnings C4267 and C4244: conversion/truncation from larger to smaller type. # disable warning C4800: implicit conversion from larger int to bool add_definitions(-W3 -wd4018 -wd4056 -wd4756 -wd4267 -wd4244 -wd4800 -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS) if (NOT WITH_EXCEPTIONS) # disable exception use in C++ library add_definitions(-D_HAS_EXCEPTIONS=0) endif () # multi-core build. add_definitions("/MP") else () if (WERROR) add_definitions(-Werror) endif () # disable -Wunused-parameter: this is really common when implementing # interfaces, etc. # disable -Wpointer-arith: this is a GCC extension, and doesn't work in MSVC. add_definitions( -Wall -Wextra -Wno-unused-parameter -Wpointer-arith -Wuninitialized -Wimplicit-fallthrough ) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast") if (NOT WITH_EXCEPTIONS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") endif () # Need to define __STDC_*_MACROS because C99 specifies that C++ shouldn't # define format (e.g. PRIu64) or limit (e.g. UINT32_MAX) macros without the # definition, and some libcs (e.g. glibc2.17 and earlier) follow that. add_definitions(-D__STDC_LIMIT_MACROS=1 -D__STDC_FORMAT_MACROS=1) if (MINGW OR CYGWIN) # On MINGW, _POSIX_C_SOURCE is needed to ensure we use mingw printf # instead of the VC runtime one. add_definitions(-D_POSIX_C_SOURCE=200809L) endif() if (COMPILER_IS_GNU) # disable -Wclobbered: it seems to be guessing incorrectly about a local # variable being clobbered by longjmp. add_definitions(-Wno-clobbered) endif () # wasm doesn't allow for x87 floating point math if (NOT EMSCRIPTEN) check_symbol_exists(__i386__ "" TARGET_IS_X86_32) check_symbol_exists(__SSE2_MATH__ "" HAVE_SSE2_MATH) if (TARGET_IS_X86_32 AND NOT HAVE_SSE2_MATH) if (COMPILER_IS_GNU OR COMPILER_IS_CLANG) add_compile_options(-msse2 -mfpmath=sse) else () message( WARNING "Unknown compiler ${CMAKE_CXX_COMPILER_ID} appears to target x86-32 with x87 " "math. If you want wasm2c to work in a spec-compliant way, please add flags to " "use SSE2 math and set TARGET_IS_X86_32 and HAVE_SSE2_MATH appropriately at the " "CMake command line." ) endif () endif () endif () endif () set(USE_SANITIZER FALSE) function(sanitizer NAME FLAGS) if (${NAME}) if (USE_SANITIZER) message(FATAL_ERROR "Only one sanitizer allowed") endif () set(USE_SANITIZER TRUE PARENT_SCOPE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}" PARENT_SCOPE) set(WASM2C_CFLAGS "${WASM2C_CFLAGS} ${FLAGS}" PARENT_SCOPE) endif () endfunction() sanitizer(USE_ASAN "-fsanitize=address") sanitizer(USE_MSAN "-fsanitize=memory") sanitizer(USE_LSAN "-fsanitize=leak") if (USE_UBSAN) # -fno-sanitize-recover was deprecated, see if we are compiling with a newer # clang that requires -fno-sanitize-recover=all. set(UBSAN_BLACKLIST ${WABT_SOURCE_DIR}/ubsan.blacklist) include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-fsanitize=undefined -fno-sanitize-recover -Wall -Werror" HAS_UBSAN_RECOVER_BARE) if (HAS_UBSAN_RECOVER_BARE) sanitizer(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover -fsanitize-blacklist=${UBSAN_BLACKLIST}") endif () check_cxx_compiler_flag("-fsanitize=undefined -fno-sanitize-recover=all -Wall -Werror" HAS_UBSAN_RECOVER_ALL) # If we already setup UBSAN recover bare, setting it up again here will be an error. if (NOT USE_SANITIZER AND HAS_UBSAN_RECOVER_ALL) sanitizer(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover=all -fsanitize-blacklist=${UBSAN_BLACKLIST}") endif () if (NOT USE_SANITIZER) message(FATAL_ERROR "UBSAN is not supported") endif () endif () set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${WABT_SOURCE_DIR}/cmake) # CWriter code templates set(TEMPLATE_CMAKE ${WABT_SOURCE_DIR}/scripts/gen-wasm2c-templates.cmake) add_custom_command( OUTPUT gen-wasm2c-prebuilt COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_header_top.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c.top.h" -D symbol="s_header_top" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_header_bottom.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c.bottom.h" -D symbol="s_header_bottom" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_source_includes.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c.includes.c" -D symbol="s_source_includes" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_source_declarations.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c.declarations.c" -D symbol="s_source_declarations" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_simd_source_declarations.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c_simd.declarations.c" -D symbol="s_simd_source_declarations" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -D out="${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_atomicops_source_declarations.cc" -D in="${WABT_SOURCE_DIR}/src/template/wasm2c_atomicops.declarations.c" -D symbol="s_atomicops_source_declarations" -P ${TEMPLATE_CMAKE} COMMAND ${CMAKE_COMMAND} -E touch gen-wasm2c-prebuilt DEPENDS ${WABT_SOURCE_DIR}/src/template/wasm2c.top.h ${WABT_SOURCE_DIR}/src/template/wasm2c.bottom.h ${WABT_SOURCE_DIR}/src/template/wasm2c.includes.c ${WABT_SOURCE_DIR}/src/template/wasm2c.declarations.c ${WABT_SOURCE_DIR}/src/template/wasm2c_simd.declarations.c ${WABT_SOURCE_DIR}/src/template/wasm2c_atomicops.declarations.c ) add_custom_target(gen-wasm2c-prebuilt-target DEPENDS gen-wasm2c-prebuilt) set(CWRITER_TEMPLATE_SRC ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_header_top.cc ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_header_bottom.cc ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_source_includes.cc ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_source_declarations.cc ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_simd_source_declarations.cc ${WABT_SOURCE_DIR}/src/prebuilt/wasm2c_atomicops_source_declarations.cc) add_custom_target(everything) set(WABT_LIBRARY_CC src/apply-names.cc src/binary-reader-ir.cc src/binary-reader-logging.cc src/binary-reader.cc src/binary-writer-spec.cc src/binary-writer.cc src/binary.cc src/binding-hash.cc src/color.cc src/common.cc src/config.cc src/config.h.in src/decompiler.cc src/error-formatter.cc src/expr-visitor.cc src/feature.cc src/filenames.cc src/generate-names.cc src/ir-util.cc src/ir.cc src/leb128.cc src/lexer-source-line-finder.cc src/lexer-source.cc src/literal.cc src/opcode-code-table.c src/opcode.cc src/option-parser.cc src/resolve-names.cc src/sha256.cc src/shared-validator.cc src/stream.cc src/token.cc src/tracing.cc src/type-checker.cc src/utf8.cc src/validator.cc src/wast-lexer.cc src/wast-parser.cc src/wat-writer.cc src/c-writer.cc ${CWRITER_TEMPLATE_SRC} # TODO(binji): Move this into its own library? src/interp/binary-reader-interp.cc src/interp/interp.cc src/interp/interp-util.cc src/interp/istream.cc ) set(WABT_LIBRARY_H ${WABT_BINARY_DIR}/include/wabt/config.h include/wabt/apply-names.h include/wabt/binary-reader-ir.h include/wabt/binary-reader-logging.h include/wabt/binary-reader.h include/wabt/binary-writer-spec.h include/wabt/binary-writer.h include/wabt/binary.h include/wabt/binding-hash.h include/wabt/color.h include/wabt/common.h include/wabt/decompiler-ast.h include/wabt/decompiler-ls.h include/wabt/decompiler-naming.h include/wabt/decompiler.h include/wabt/error-formatter.h include/wabt/expr-visitor.h include/wabt/feature.h include/wabt/filenames.h include/wabt/generate-names.h include/wabt/ir-util.h include/wabt/ir.h include/wabt/leb128.h include/wabt/lexer-source-line-finder.h include/wabt/lexer-source.h include/wabt/literal.h include/wabt/opcode-code-table.h include/wabt/opcode.h include/wabt/option-parser.h include/wabt/resolve-names.h include/wabt/sha256.h include/wabt/shared-validator.h include/wabt/stream.h include/wabt/string-util.h include/wabt/token.h include/wabt/tracing.h include/wabt/type-checker.h include/wabt/type.h include/wabt/utf8.h include/wabt/validator.h include/wabt/wast-lexer.h include/wabt/wast-parser.h include/wabt/wat-writer.h # TODO(binji): Move this into its own library? include/wabt/interp/binary-reader-interp.h include/wabt/interp/interp-inl.h include/wabt/interp/interp-math.h include/wabt/interp/interp-util.h include/wabt/interp/interp.h include/wabt/interp/istream.h ) set(WABT_LIBRARY_SRC ${WABT_LIBRARY_CC} ${WABT_LIBRARY_H}) add_library(wabt STATIC ${WABT_LIBRARY_SRC}) add_dependencies(wabt gen-wasm2c-prebuilt-target) add_library(wabt::wabt ALIAS wabt) if (HAVE_OPENSSL_SHA_H) target_link_libraries(wabt OpenSSL::Crypto) else() include_directories("${WABT_SOURCE_DIR}/third_party/picosha2") endif() target_compile_features(wabt PUBLIC cxx_std_17) target_include_directories( wabt PUBLIC "$" "$" ) if (WABT_INSTALL_RULES) install( TARGETS wabt EXPORT wabt-targets COMPONENT wabt-development INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install( DIRECTORY "${WABT_SOURCE_DIR}/include/" "${WABT_BINARY_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" COMPONENT wabt-development ) endif () if (HAVE_SETJMP_H) set(WASM_RT_FILES "wasm2c/wasm-rt-impl.h" "wasm2c/wasm-rt-impl.c" "wasm2c/wasm-rt-exceptions-impl.c" "wasm2c/wasm-rt-mem-impl.c" "wasm2c/wasm-rt-impl-tableops.inc" "wasm2c/wasm-rt-mem-impl-helper.inc") add_library(wasm-rt-impl STATIC ${WASM_RT_FILES}) target_link_libraries(wasm-rt-impl ${CMAKE_THREAD_LIBS_INIT}) add_library(wabt::wasm-rt-impl ALIAS wasm-rt-impl) if (WABT_BIG_ENDIAN) target_compile_definitions(wasm-rt-impl PUBLIC WABT_BIG_ENDIAN=1) endif () if (WABT_INSTALL_RULES) install( TARGETS wasm-rt-impl EXPORT wabt-targets COMPONENT wabt-development INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install( FILES "wasm2c/wasm-rt.h" "wasm2c/wasm-rt-exceptions.h" TYPE INCLUDE COMPONENT wabt-development ) install( FILES ${WASM_RT_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/wabt/wasm2c" COMPONENT wabt-development ) endif () endif () if (BUILD_FUZZ_TOOLS) set(FUZZ_FLAGS "-fsanitize=fuzzer,address") add_library(wabt-fuzz STATIC ${WABT_LIBRARY_SRC}) target_link_libraries(wabt-fuzz PUBLIC wabt) set_target_properties(wabt-fuzz PROPERTIES COMPILE_FLAGS "${FUZZ_FLAGS}" ) endif () # libwasm, which implenents the wasm C API if (BUILD_LIBWASM) add_library(wasm SHARED ${WABT_LIBRARY_SRC} src/interp/interp-wasm-c-api.cc) target_link_libraries(wasm PUBLIC wabt) target_include_directories(wasm PUBLIC third_party/wasm-c-api/include) if (COMPILER_IS_MSVC) target_compile_definitions(wasm PRIVATE "WASM_API_EXTERN=__declspec(dllexport)") else () target_compile_options(wasm PRIVATE $<$:-Wno-old-style-cast>) target_compile_definitions(wasm PRIVATE "WASM_API_EXTERN=__attribute__((visibility(\"default\")))") endif () set_target_properties(wasm PROPERTIES CXX_VISIBILITY_PRESET hidden) endif () if (CODE_COVERAGE) add_definitions("-fprofile-arcs -ftest-coverage") if (COMPILER_IS_CLANG) set(CMAKE_EXE_LINKER_FLAGS "--coverage") else () link_libraries(gcov) endif () endif () include(CMakeParseArguments) function(wabt_executable) cmake_parse_arguments(EXE "WITH_LIBM;FUZZ;INSTALL" "NAME" "SOURCES;LIBS" ${ARGN}) # Always link libwabt. if (EXE_FUZZ) set(EXE_LIBS "${EXE_LIBS};wabt-fuzz") set(EXTRA_LINK_FLAGS "${FUZZ_FLAGS}") else () set(EXE_LIBS "${EXE_LIBS};wabt") endif () # Optionally link libm. if (EXE_WITH_LIBM AND (COMPILER_IS_CLANG OR COMPILER_IS_GNU)) set(EXE_LIBS "${EXE_LIBS};m") endif () add_executable(${EXE_NAME} ${EXE_SOURCES}) add_dependencies(everything ${EXE_NAME}) target_link_libraries(${EXE_NAME} ${EXE_LIBS}) if (EMSCRIPTEN) set(EXTRA_LINK_FLAGS "${EXTRA_LINK_FLAGS} -sNODERAWFS -Oz -sALLOW_MEMORY_GROWTH" ) endif () set_target_properties(${EXE_NAME} PROPERTIES LINK_FLAGS "${EXTRA_LINK_FLAGS}" ) if (EXE_INSTALL) list(APPEND WABT_EXECUTABLES ${EXE_NAME}) set(WABT_EXECUTABLES ${WABT_EXECUTABLES} PARENT_SCOPE) add_custom_target(${EXE_NAME}-copy-to-bin ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${WABT_SOURCE_DIR}/bin COMMAND ${CMAKE_COMMAND} -E copy $ ${WABT_SOURCE_DIR}/bin DEPENDS ${EXE_NAME} ) endif () endfunction() if (BUILD_TOOLS) # wat2wasm wabt_executable( NAME wat2wasm SOURCES src/tools/wat2wasm.cc INSTALL ) # wast2json wabt_executable( NAME wast2json SOURCES src/tools/wast2json.cc INSTALL ) # wasm2wat wabt_executable( NAME wasm2wat SOURCES src/tools/wasm2wat.cc INSTALL ) # wasm2c wabt_executable( NAME wasm2c SOURCES src/tools/wasm2c.cc INSTALL ) # wasm-stats wabt_executable( NAME wasm-stats SOURCES src/tools/wasm-stats.cc src/binary-reader-stats.cc INSTALL ) # wasm-objdump wabt_executable( NAME wasm-objdump SOURCES src/tools/wasm-objdump.cc src/binary-reader-objdump.cc INSTALL ) if(WITH_WASI) # uvwasi uses the deprecated FetchContent_Populate function, disable it to avoid build error set(CMAKE_POLICY_DEFAULT_CMP0169_BACK ${CMAKE_POLICY_DEFAULT_CMP0169}) set(CMAKE_POLICY_DEFAULT_CMP0169 OLD) add_subdirectory("third_party/uvwasi" EXCLUDE_FROM_ALL) set(CMAKE_POLICY_DEFAULT_CMP0169 ${CMAKE_POLICY_DEFAULT_CMP0169_BACK}) include_directories(third_party/uvwasi/include) add_definitions(-DWITH_WASI) set(INTERP_LIBS uvwasi_a) set(EXTRA_INTERP_SRC src/interp/interp-wasi.cc) if (COMPILER_IS_GNU) target_compile_options(uv_a PRIVATE "-Wno-sign-compare") elseif (COMPILER_IS_CLANG) target_compile_options(uv_a PRIVATE "-Wno-implicit-fallthrough") endif() endif() # wasm-interp wabt_executable( NAME wasm-interp SOURCES src/tools/wasm-interp.cc ${EXTRA_INTERP_SRC} LIBS ${INTERP_LIBS} WITH_LIBM INSTALL ) # spectest-interp wabt_executable( NAME spectest-interp SOURCES src/tools/spectest-interp.cc WITH_LIBM INSTALL ) # wat-desugar wabt_executable( NAME wat-desugar SOURCES src/tools/wat-desugar.cc INSTALL ) # wasm-validate wabt_executable( NAME wasm-validate SOURCES src/tools/wasm-validate.cc INSTALL ) # wasm-strip wabt_executable( NAME wasm-strip SOURCES src/tools/wasm-strip.cc INSTALL ) # wasm-decompile wabt_executable( NAME wasm-decompile SOURCES src/tools/wasm-decompile.cc INSTALL ) if(BUILD_FUZZ_TOOLS) # wasm2wat-fuzz wabt_executable( NAME wasm2wat-fuzz SOURCES src/tools/wasm2wat-fuzz.cc FUZZ INSTALL ) endif () endif () if (BUILD_TESTS) if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(WASM2C_CFLAGS "${WASM2C_CFLAGS} -g -O0") endif () if (WABT_BIG_ENDIAN) set(WASM2C_CFLAGS "${WASM2C_CFLAGS} -DWABT_BIG_ENDIAN=1") endif () if (DEFINED CMAKE_OSX_SYSROOT) set(WASM2C_CFLAGS "${WASM2C_CFLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") endif () if (DEFINED ENV{WASM2C_CFLAGS}) set(WASM2C_CFLAGS "${WASM2C_CFLAGS} $ENV{WASM2C_CFLAGS}") endif () set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) # Python 3.5 is the version shipped in Ubuntu Xenial find_package(Python3 3.5 REQUIRED COMPONENTS Interpreter) if (NOT USE_SYSTEM_GTEST) if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gtest/googletest) message(FATAL_ERROR "Can't find third_party/gtest. Run git submodule update --init, or disable with CMake -DBUILD_TESTS=OFF.") endif () include_directories( third_party/gtest/googletest third_party/gtest/googletest/include ) # gtest add_library(gtest STATIC third_party/gtest/googletest/src/gtest-all.cc ) add_library(gtest_main STATIC third_party/gtest/googletest/src/gtest_main.cc ) if (COMPILER_IS_GNU) target_compile_options(gtest PRIVATE "-Wno-maybe-uninitialized") endif () endif () # hexfloat-test set(HEXFLOAT_TEST_SRCS src/literal.cc src/test-hexfloat.cc ) wabt_executable( NAME hexfloat_test SOURCES ${HEXFLOAT_TEST_SRCS} LIBS gtest_main gtest ${CMAKE_THREAD_LIBS_INIT} ) # wabt-unittests set(UNITTESTS_SRCS src/test-binary-reader.cc src/test-interp.cc src/test-intrusive-list.cc src/test-literal.cc src/test-option-parser.cc src/test-filenames.cc src/test-utf8.cc src/test-wast-parser.cc ) wabt_executable( NAME wabt-unittests SOURCES ${UNITTESTS_SRCS} LIBS gtest_main gtest ${CMAKE_THREAD_LIBS_INIT} ) # test running set(RUN_TESTS_PY ${WABT_SOURCE_DIR}/test/run-tests.py) add_custom_target(run-tests COMMAND ${CMAKE_COMMAND} -E env WASM2C_CC=${CMAKE_C_COMPILER} WASM2C_CFLAGS=${WASM2C_CFLAGS} ${Python3_EXECUTABLE} ${RUN_TESTS_PY} --bindir $ DEPENDS ${WABT_EXECUTABLES} WORKING_DIRECTORY ${WABT_SOURCE_DIR} USES_TERMINAL ) add_custom_target(run-unittests COMMAND $ DEPENDS wabt-unittests WORKING_DIRECTORY ${WABT_SOURCE_DIR} USES_TERMINAL ) add_custom_target(run-c-api-tests COMMAND ${Python3_EXECUTABLE} ${WABT_SOURCE_DIR}/test/run-c-api-examples.py --bindir $ WORKING_DIRECTORY ${WABT_SOURCE_DIR} USES_TERMINAL ) add_custom_target(check DEPENDS run-unittests run-tests run-c-api-tests) function(c_api_example NAME) set(EXENAME wasm-c-api-${NAME}) add_executable(${EXENAME} third_party/wasm-c-api/example/${NAME}.c) if (COMPILER_IS_MSVC) set_target_properties(${EXENAME} PROPERTIES COMPILE_FLAGS "-wd4311") else () set_target_properties(${EXENAME} PROPERTIES COMPILE_FLAGS "-std=gnu11 -Wno-pointer-to-int-cast") endif () target_link_libraries(${EXENAME} wasm Threads::Threads) add_custom_target(${EXENAME}-copy-to-bin ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${WABT_SOURCE_DIR}/bin COMMAND ${CMAKE_COMMAND} -E copy $ ${WABT_SOURCE_DIR}/bin/ COMMAND ${CMAKE_COMMAND} -E copy ${WABT_SOURCE_DIR}/third_party/wasm-c-api/example/${NAME}.wasm $/ COMMAND ${CMAKE_COMMAND} -E copy ${WABT_SOURCE_DIR}/third_party/wasm-c-api/example/${NAME}.wasm ${WABT_SOURCE_DIR}/bin/ DEPENDS ${EXENAME} ) add_dependencies(run-c-api-tests ${EXENAME}) endfunction() c_api_example(callback) c_api_example(finalize) c_api_example(global) c_api_example(hello) c_api_example(hostref) c_api_example(multi) c_api_example(memory) c_api_example(reflect) c_api_example(serialize) c_api_example(start) c_api_example(table) c_api_example(trap) if (CMAKE_USE_PTHREADS_INIT) c_api_example(threads) endif () endif () # install if (WABT_INSTALL_RULES AND (BUILD_TOOLS OR BUILD_TESTS)) install( TARGETS ${WABT_EXECUTABLES} COMPONENT wabt-runtime ) if (UNIX) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/man/" DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT wabt-documentation FILES_MATCHING PATTERN "*.1" ) endif () endif () if (EMSCRIPTEN) # flags for all emscripten builds # exceptions are never needed set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") # wabt.js # just dump everything into one binary so we can reference it from JavaScript add_definitions(-Wno-warn-absolute-paths) add_executable(libwabtjs src/emscripten-helpers.cc) add_dependencies(everything libwabtjs) target_link_libraries(libwabtjs wabt) set_target_properties(libwabtjs PROPERTIES OUTPUT_NAME libwabt) set(WABT_POST_JS ${WABT_SOURCE_DIR}/src/wabt.post.js) set(EMSCRIPTEN_EXPORTS ${WABT_SOURCE_DIR}/src/emscripten-exports.txt) set(LIBWABT_LINK_FLAGS --post-js ${WABT_POST_JS} -sSINGLE_FILE -sEXPORTED_FUNCTIONS=@${EMSCRIPTEN_EXPORTS} -sRESERVED_FUNCTION_POINTERS=10 -sNO_EXIT_RUNTIME=1 -sALLOW_MEMORY_GROWTH=1 -sMODULARIZE=1 -sEXPORT_NAME=WabtModule -sWASM=0 -sEXPORTED_RUNTIME_METHODS=writeAsciiToMemory -Oz ) string(REPLACE ";" " " LIBWABT_LINK_FLAGS_STR "${LIBWABT_LINK_FLAGS}") set_target_properties(libwabtjs PROPERTIES LINK_FLAGS "${LIBWABT_LINK_FLAGS_STR}" LINK_DEPENDS "${WABT_POST_JS};${EMSCRIPTEN_EXPORTS}" ) endif () # Create find_package configuration files if (WABT_INSTALL_RULES) include(CMakePackageConfigHelpers) set(WABT_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/wabt" CACHE STRING "Path to wabt CMake files") install( EXPORT wabt-targets DESTINATION "${WABT_INSTALL_CMAKEDIR}" NAMESPACE wabt:: FILE wabt-targets.cmake COMPONENT wabt-development ) configure_package_config_file( scripts/wabt-config.cmake.in wabt-config.cmake INSTALL_DESTINATION "${WABT_INSTALL_CMAKEDIR}" NO_SET_AND_CHECK_MACRO ) write_basic_package_version_file( wabt-config-version.cmake COMPATIBILITY ExactVersion ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/wabt-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/wabt-config-version.cmake" DESTINATION "${WABT_INSTALL_CMAKEDIR}" COMPONENT wabt-development ) endif ()