-
Notifications
You must be signed in to change notification settings - Fork 233
Expand file tree
/
Copy pathbindings.cmake
More file actions
197 lines (181 loc) · 8.13 KB
/
bindings.cmake
File metadata and controls
197 lines (181 loc) · 8.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# Enable turning this rule off entirely if so desired.
option(BINDINGS_TARGET "Generate bindings target" ON)
include(ExternalProject)
# If `wit-bindgen` is on the system and has the right version, favor that,
# otherwise download a known good version.
find_program(WIT_BINDGEN_EXECUTABLE NAMES wit-bindgen)
if(WIT_BINDGEN_EXECUTABLE)
message(STATUS "Found wit-bindgen: ${WIT_BINDGEN_EXECUTABLE}")
execute_process(
COMMAND ${WIT_BINDGEN_EXECUTABLE} --version
OUTPUT_VARIABLE WIT_BINDGEN_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (NOT (WIT_BINDGEN_VERSION MATCHES "0\\.51\\.0"))
message(WARNING "wit-bindgen version 0.51.0 is required, found: ${WIT_BINDGEN_VERSION}")
set(WIT_BINDGEN_EXECUTABLE "")
endif()
endif()
if (NOT WIT_BINDGEN_EXECUTABLE)
include(ba-download)
ba_download(
wit-bindgen
"https://github.com/bytecodealliance/wit-bindgen"
"0.51.0"
)
ExternalProject_Get_Property(wit-bindgen SOURCE_DIR)
set(wit_bindgen "${SOURCE_DIR}/wit-bindgen")
else()
add_custom_target(wit-bindgen)
set(wit_bindgen ${WIT_BINDGEN_EXECUTABLE})
endif()
# If `wkg` is on the system and has the right version, favor that,
# otherwise download a known good version.
find_program(WKG_EXECUTABLE NAMES wkg)
if(WKG_EXECUTABLE)
message(STATUS "Found wkg: ${WKG_EXECUTABLE}")
execute_process(
COMMAND ${WKG_EXECUTABLE} --version
OUTPUT_VARIABLE WKG_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (NOT (WKG_VERSION MATCHES "0\\.13\\.0"))
message(WARNING "wkg version 0.13.0 is required, found: ${WKG_VERSION}")
set(WKG_EXECUTABLE "")
endif()
endif()
if (NOT WKG_EXECUTABLE)
include(ba-download)
ba_download(
wkg
"https://github.com/bytecodealliance/wasm-pkg-tools"
"0.13.0"
)
ExternalProject_Get_Property(wkg DOWNLOADED_FILE)
set(wkg_bin ${DOWNLOADED_FILE})
else()
add_custom_target(wkg)
set(wkg_bin ${WKG_EXECUTABLE})
endif()
set(bottom_half "${CMAKE_SOURCE_DIR}/libc-bottom-half")
set(wasip2_wit_dir ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2/wit)
set(wasip2-version 0.2.0)
file(MAKE_DIRECTORY ${wasip2_wit_dir})
configure_file(${CMAKE_SOURCE_DIR}/wasi/wasi-libc-wasip2.wit.in ${wasip2_wit_dir}/wasi-libc-wasip2.wit)
set(wasip2_stamp ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2/.wit-fetch-stamp)
add_custom_command(
OUTPUT ${wasip2_stamp}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wasi/p2
COMMAND ${wkg_bin} wit fetch
COMMAND ${CMAKE_COMMAND} -E touch ${wasip2_stamp}
WORKING_DIRECTORY ${wasip2_wit_dir}/..
DEPENDS wkg ${wasip2_wit_dir}/wasi-libc-wasip2.wit
COMMENT "Fetching WASI P2 dependencies"
)
add_custom_target(wasip2-wits DEPENDS ${wasip2_stamp})
add_custom_target(
bindings-p2
COMMAND
${wit_bindgen} c
--autodrop-borrows yes
--rename-world wasip2
--type-section-suffix __wasi_libc
--world wasi:cli/imports@${wasip2-version}
--rename wasi:clocks/monotonic-clock@${wasip2-version}=monotonic_clock
--rename wasi:clocks/wall-clock@${wasip2-version}=wall_clock
--rename wasi:filesystem/preopens@${wasip2-version}=filesystem_preopens
--rename wasi:filesystem/types@${wasip2-version}=filesystem
--rename wasi:io/error@${wasip2-version}=io_error
--rename wasi:io/poll@${wasip2-version}=poll
--rename wasi:io/streams@${wasip2-version}=streams
--rename wasi:random/insecure-seed@${wasip2-version}=random_insecure_seed
--rename wasi:random/insecure@${wasip2-version}=random_insecure
--rename wasi:random/random@${wasip2-version}=random
--rename wasi:sockets/instance-network@${wasip2-version}=instance_network
--rename wasi:sockets/ip-name-lookup@${wasip2-version}=ip_name_lookup
--rename wasi:sockets/network@${wasip2-version}=network
--rename wasi:sockets/tcp-create-socket@${wasip2-version}=tcp_create_socket
--rename wasi:sockets/tcp@${wasip2-version}=tcp
--rename wasi:sockets/udp-create-socket@${wasip2-version}=udp_create_socket
--rename wasi:sockets/udp@${wasip2-version}=udp
--rename wasi:cli/environment@${wasip2-version}=environment
--rename wasi:cli/exit@${wasip2-version}=exit
--rename wasi:cli/stdin@${wasip2-version}=stdin
--rename wasi:cli/stdout@${wasip2-version}=stdout
--rename wasi:cli/stderr@${wasip2-version}=stderr
--rename wasi:cli/terminal-input@${wasip2-version}=terminal_input
--rename wasi:cli/terminal-output@${wasip2-version}=terminal_output
--rename wasi:cli/terminal-stdin@${wasip2-version}=terminal_stdin
--rename wasi:cli/terminal-stdout@${wasip2-version}=terminal_stdout
--rename wasi:cli/terminal-stderr@${wasip2-version}=terminal_stderr
${wasip2_wit_dir}
COMMAND cmake -E copy wasip2.h ${bottom_half}/headers/public/wasi/__generated_wasip2.h
COMMAND cmake -E copy wasip2_component_type.o ${bottom_half}/sources
COMMAND cmake -E copy wasip2.c ${bottom_half}/sources
DEPENDS wit-bindgen wkg wasip2-wits
)
set(wasip3_wit_dir ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3/wit)
set(wasip3-version 0.3.0-rc-2026-01-06)
file(MAKE_DIRECTORY ${wasip3_wit_dir})
configure_file(${CMAKE_SOURCE_DIR}/wasi/wasi-libc-wasip3.wit.in ${wasip3_wit_dir}/wasi-libc-wasip3.wit)
set(wasip3_stamp ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3/.wit-fetch-stamp)
add_custom_command(
OUTPUT ${wasip3_stamp}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wasi/p3
COMMAND ${wkg_bin} wit fetch
COMMAND ${CMAKE_COMMAND} -E touch ${wasip3_stamp}
WORKING_DIRECTORY ${wasip3_wit_dir}/..
DEPENDS wkg ${wasip3_wit_dir}/wasi-libc-wasip3.wit
COMMENT "Fetching WASI P3 dependencies"
)
add_custom_target(wasip3-wits DEPENDS ${wasip3_stamp})
add_custom_target(
bindings-p3
COMMAND
${wit_bindgen} c
--generate-threading-helpers
--autodrop-borrows yes
--rename-world wasip3
--type-section-suffix __wasi_libc
--world wasi:cli/imports@${wasip3-version}
--rename wasi:clocks/monotonic-clock@${wasip3-version}=monotonic_clock
--rename wasi:clocks/system-clock@${wasip3-version}=system_clock
--rename wasi:filesystem/preopens@${wasip3-version}=filesystem_preopens
--rename wasi:filesystem/types@${wasip3-version}=filesystem
--rename wasi:random/insecure-seed@${wasip3-version}=random_insecure_seed
--rename wasi:random/insecure@${wasip3-version}=random_insecure
--rename wasi:random/random@${wasip3-version}=random
--rename wasi:sockets/types@${wasip3-version}=sockets
--rename wasi:sockets/ip-name-lookup@${wasip3-version}=ip_name_lookup
--rename wasi:cli/environment@${wasip3-version}=environment
--rename wasi:cli/exit@${wasip3-version}=exit
--rename wasi:cli/stdin@${wasip3-version}=stdin
--rename wasi:cli/stdout@${wasip3-version}=stdout
--rename wasi:cli/stderr@${wasip3-version}=stderr
--rename wasi:cli/terminal-input@${wasip3-version}=terminal_input
--rename wasi:cli/terminal-output@${wasip3-version}=terminal_output
--rename wasi:cli/terminal-stdin@${wasip3-version}=terminal_stdin
--rename wasi:cli/terminal-stdout@${wasip3-version}=terminal_stdout
--rename wasi:cli/terminal-stderr@${wasip3-version}=terminal_stderr
${wasip3_wit_dir}
COMMAND cmake -E copy wasip3.h ${bottom_half}/headers/public/wasi/__generated_wasip3.h
COMMAND cmake -E copy wasip3_component_type.o ${bottom_half}/sources
COMMAND cmake -E copy wasip3.c ${bottom_half}/sources
DEPENDS wit-bindgen wasip3-wits
)
add_custom_target(bindings DEPENDS bindings-p2 bindings-p3)
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(SED_INPLACE_ARGS -i '')
else()
set(SED_INPLACE_ARGS -i)
endif()
function(wit_bindgen_edit p)
add_custom_target(
bindings-${p}-edit
COMMAND sed ${SED_INPLACE_ARGS} "'s_#include .wasi${p}\.h._#include \"wasi/wasi${p}.h\"_'" ${bottom_half}/sources/wasi${p}.c
COMMAND sed ${SED_INPLACE_ARGS} "s/extern void exit_exit/_Noreturn extern void exit_exit/" ${bottom_half}/headers/public/wasi/__generated_wasi${p}.h
COMMAND sed ${SED_INPLACE_ARGS} "s/extern void __wasm_import_exit_exit/_Noreturn extern void __wasm_import_exit_exit/" ${bottom_half}/sources/wasi${p}.c
DEPENDS bindings-${p}
)
add_dependencies(bindings bindings-${p}-edit)
endfunction()
wit_bindgen_edit(p2)
wit_bindgen_edit(p3)