Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/c-api/CMakeLists.txt
1691 views
1
cmake_minimum_required(VERSION 3.12)
2
project(wasmtime C)
3
4
set(WASMTIME_USER_CARGO_BUILD_OPTIONS "" CACHE STRING "Additional cargo flags (such as --features) to apply to the build command")
5
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
6
option(BUILD_TESTS "Build tests" OFF)
7
option(WASMTIME_ALWAYS_BUILD "If cmake should always invoke cargo to build wasmtime" ON)
8
option(WASMTIME_FASTEST_RUNTIME "Set flags designed to optimize runtime performance" OFF)
9
set(WASMTIME_TARGET "" CACHE STRING "Rust target to build for")
10
11
if(WASMTIME_TARGET STREQUAL "")
12
execute_process(COMMAND rustc -vV OUTPUT_VARIABLE RUSTC_VERSION)
13
string(REGEX MATCH "host: ([^ \n]*)" RUSTC_HOST ${RUSTC_VERSION})
14
string(STRIP ${CMAKE_MATCH_1} RUSTC_HOST_TARGET)
15
set(WASMTIME_TARGET ${RUSTC_HOST_TARGET})
16
endif()
17
18
include(cmake/features.cmake)
19
20
if(WASMTIME_FASTEST_RUNTIME)
21
set(WASMTIME_BUILD_TYPE_FLAG "--profile=fastest-runtime")
22
set(WASMTIME_BUILD_TYPE "fastest-runtime")
23
set(CARGO_PROFILE_PANIC CARGO_PROFILE_RELEASE_PANIC)
24
else()
25
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
26
set(WASMTIME_BUILD_TYPE "debug")
27
set(CARGO_PROFILE_PANIC CARGO_PROFILE_DEBUG_PANIC)
28
else()
29
set(WASMTIME_BUILD_TYPE_FLAG "--release")
30
set(WASMTIME_BUILD_TYPE "release")
31
set(CARGO_PROFILE_PANIC CARGO_PROFILE_RELEASE_PANIC)
32
endif()
33
endif()
34
35
set(WASMTIME_TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../target/${WASMTIME_TARGET}/${WASMTIME_BUILD_TYPE})
36
37
if(WASMTIME_TARGET MATCHES "darwin")
38
set(WASMTIME_SHARED_FILES libwasmtime.dylib)
39
set(WASMTIME_STATIC_FILES libwasmtime.a)
40
elseif(WASMTIME_TARGET MATCHES "windows-gnu")
41
set(WASMTIME_SHARED_FILES libwasmtime.dll.a wasmtime.dll)
42
set(WASMTIME_STATIC_FILES libwasmtime.a)
43
elseif(WASMTIME_TARGET MATCHES "windows-msvc")
44
set(WASMTIME_SHARED_FILES wasmtime.dll.lib wasmtime.dll)
45
set(WASMTIME_STATIC_FILES wasmtime.lib)
46
else()
47
set(WASMTIME_SHARED_FILES libwasmtime.so)
48
set(WASMTIME_STATIC_FILES libwasmtime.a)
49
endif()
50
51
list(TRANSFORM WASMTIME_SHARED_FILES PREPEND ${WASMTIME_TARGET_DIR}/)
52
list(TRANSFORM WASMTIME_STATIC_FILES PREPEND ${WASMTIME_TARGET_DIR}/)
53
54
list(APPEND WASMTIME_BUILD_ENV "${CARGO_PROFILE_PANIC}=abort")
55
if (APPLE AND CMAKE_OSX_DEPLOYMENT_TARGET)
56
# On macOS, we need to set the deployment target for the build
57
list(APPEND WASMTIME_BUILD_ENV "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
58
endif()
59
60
include(ExternalProject)
61
find_program(WASMTIME_CARGO_BINARY cargo)
62
if(NOT WASMTIME_CARGO_BINARY)
63
message(FATAL_ERROR [["cargo" was not found. Ensure "cargo" is in PATH. Aborting...]])
64
endif()
65
ExternalProject_Add(
66
wasmtime-crate
67
DOWNLOAD_COMMAND ""
68
CONFIGURE_COMMAND ""
69
INSTALL_COMMAND "${WASMTIME_INSTALL_COMMAND}"
70
BUILD_COMMAND
71
${CMAKE_COMMAND} -E env ${WASMTIME_BUILD_ENV}
72
${WASMTIME_CARGO_BINARY} build
73
--target ${WASMTIME_TARGET}
74
--package wasmtime-c-api
75
${WASMTIME_BUILD_TYPE_FLAG}
76
${WASMTIME_FEATURES}
77
${WASMTIME_USER_CARGO_BUILD_OPTIONS}
78
USES_TERMINAL_BUILD TRUE
79
# Note that this is used as the cwd for the cargo invocation itself, build
80
# byproducts go in the `target` directory at the top-level.
81
BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}
82
BUILD_ALWAYS ${WASMTIME_ALWAYS_BUILD}
83
BUILD_BYPRODUCTS ${WASMTIME_SHARED_FILES} ${WASMTIME_STATIC_FILES})
84
add_library(wasmtime INTERFACE)
85
add_dependencies(wasmtime wasmtime-crate)
86
87
if(BUILD_SHARED_LIBS)
88
if(NOT WASMTIME_TARGET MATCHES "windows")
89
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath='$ORIGIN'")
90
endif()
91
list(GET WASMTIME_SHARED_FILES 0 WASMTIME_SHARED_LIB_TO_LINK)
92
target_link_libraries(wasmtime INTERFACE ${WASMTIME_SHARED_LIB_TO_LINK})
93
else()
94
if(WASMTIME_TARGET MATCHES "windows")
95
target_compile_options(wasmtime INTERFACE -DWASM_API_EXTERN= -DWASI_API_EXTERN=)
96
target_link_libraries(wasmtime INTERFACE ${WASMTIME_STATIC_FILES}
97
ws2_32 advapi32 userenv ntdll shell32 ole32 bcrypt)
98
elseif(WASMTIME_TARGET MATCHES "darwin")
99
target_link_libraries(wasmtime INTERFACE ${WASMTIME_STATIC_FILES}
100
"-framework CoreFoundation")
101
else()
102
target_link_libraries(wasmtime INTERFACE ${WASMTIME_STATIC_FILES}
103
pthread dl m)
104
endif()
105
endif()
106
107
target_include_directories(wasmtime INTERFACE ${CMAKE_BINARY_DIR}/include)
108
set(WASMTIME_HEADER_DST ${CMAKE_BINARY_DIR}/include)
109
include(cmake/install-headers.cmake)
110
111
include(GNUInstallDirs)
112
install(DIRECTORY "${WASMTIME_HEADER_DST}/" TYPE INCLUDE)
113
install(FILES ${WASMTIME_SHARED_FILES} ${WASMTIME_STATIC_FILES}
114
DESTINATION ${CMAKE_INSTALL_LIBDIR})
115
116
if(WASMTIME_TARGET MATCHES "darwin")
117
# Postprocess the macOS dylib a bit to have a more reasonable `LC_ID_DYLIB`
118
# directive than the default one that comes out of the linker when typically
119
# doing `cargo build`. For more info see #984
120
set(INSTALLED_LIB ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libwasmtime.dylib)
121
install(CODE "execute_process(COMMAND install_name_tool -id \"@rpath/libwasmtime.dylib\" ${INSTALLED_LIB})")
122
endif()
123
124
set(DOXYGEN_CONF_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf.in)
125
set(DOXYGEN_CONF_OUT ${CMAKE_BINARY_DIR}/doxygen.conf)
126
configure_file(${DOXYGEN_CONF_IN} ${DOXYGEN_CONF_OUT})
127
add_custom_target(doc
128
COMMAND doxygen ${DOXYGEN_CONF_OUT}
129
DEPENDS ${WASMTIME_GENERATED_CONF_H} ${DOXYGEN_CONF_OUT}
130
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
131
add_dependencies(doc headers-to-doc)
132
133
file(GLOB headers "include/*.h")
134
add_custom_target(headers-to-doc
135
COMMAND
136
${CMAKE_COMMAND}
137
-DWASMTIME_HEADER_DST=${CMAKE_BINARY_DIR}/include
138
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install-headers.cmake
139
DEPENDS ${headers})
140
141
if (NOT CMAKE_CXX_STANDARD)
142
message(STATUS "Cannot detect C++ Standard. Switching to C++17 by default !!")
143
set(CMAKE_CXX_STANDARD 17)
144
endif()
145
message(STATUS "CMAKE_CXX_STANDARD is ${CMAKE_CXX_STANDARD}")
146
if (NOT CMAKE_CXX_STANDARD GREATER_EQUAL 17)
147
message(FATAL_ERROR "WASMTIME_CPP library does not support ${CMAKE_CXX_STANDARD}")
148
endif()
149
set(CMAKE_CXX_STANDARD_REQUIRED True)
150
151
option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
152
message(STATUS "ENABLE_CODE_ANALYSIS ${ENABLE_CODE_ANALYSIS}")
153
154
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
155
add_compile_options (-fdiagnostics-color=always)
156
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
157
add_compile_options (-fcolor-diagnostics)
158
endif ()
159
160
add_library(wasmtime-cpp INTERFACE)
161
target_link_libraries(wasmtime-cpp INTERFACE wasmtime)
162
if (MSVC)
163
target_compile_options(wasmtime-cpp INTERFACE /DWASM_API_EXTERN= /DWASI_API_EXTERN=)
164
target_link_libraries(wasmtime-cpp INTERFACE ws2_32 bcrypt advapi32 userenv ntdll shell32 ole32)
165
else()
166
target_link_libraries(wasmtime-cpp INTERFACE stdc++ pthread)
167
endif()
168
169
target_include_directories(
170
wasmtime-cpp
171
INTERFACE
172
${PROJECT_SOURCE_DIR}/include)
173
174
if (BUILD_TESTS)
175
message(STATUS "Building tests")
176
set(CMAKE_CXX_STANDARD 20)
177
178
enable_language(CXX)
179
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
180
181
enable_testing()
182
add_subdirectory(tests)
183
endif()
184
185