blob: d34e642fda4145f7b3ddd0cca365c387f87f872d [file] [log] [blame]
#
# 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.35)
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
"$<BUILD_INTERFACE:${WABT_SOURCE_DIR}/include>"
"$<BUILD_INTERFACE:${WABT_BINARY_DIR}/include>"
)
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")
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 $<$<COMPILE_LANGUAGE:CXX>:-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 $<TARGET_FILE:${EXE_NAME}> ${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)
add_subdirectory("third_party/uvwasi" EXCLUDE_FROM_ALL)
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 $<TARGET_FILE_DIR:wat2wasm>
DEPENDS ${WABT_EXECUTABLES}
WORKING_DIRECTORY ${WABT_SOURCE_DIR}
USES_TERMINAL
)
add_custom_target(run-unittests
COMMAND $<TARGET_FILE:wabt-unittests>
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 $<TARGET_FILE_DIR:wat2wasm>
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 $<TARGET_FILE:${EXENAME}> ${WABT_SOURCE_DIR}/bin/
COMMAND ${CMAKE_COMMAND} -E copy ${WABT_SOURCE_DIR}/third_party/wasm-c-api/example/${NAME}.wasm $<TARGET_FILE_DIR:${EXENAME}>/
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 ()