|
1 | | -cmake_minimum_required(VERSION 3.14) |
| 1 | +cmake_minimum_required(VERSION 3.24) |
| 2 | + |
2 | 3 | set(PROJECT_NAME "sqlite3_web") |
3 | 4 | project(${PROJECT_NAME} LANGUAGES C) |
4 | 5 |
|
| 6 | +set(triple wasm32-unknown-wasi) |
| 7 | +set(wasi_sysroot "/usr/share/wasi-sysroot" CACHE PATH "Path to wasi sysroot") |
| 8 | +set(clang "clang" CACHE FILEPATH "Path to wasm-capable clang executable") |
| 9 | + |
5 | 10 | include(FetchContent) |
6 | | -if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") |
7 | | - # cmake 3.24.0 added the `DOWNLOAD_EXTRACT_TIMESTAMP` and prints an ugly warning when |
8 | | - # the default is used, so override it to the recommended behavior. |
9 | | - # We can't really ask users to use a cmake that recent, so there's this if here. |
10 | | - FetchContent_Declare( |
| 11 | + |
| 12 | +FetchContent_Declare( |
11 | 13 | sqlite3 |
12 | 14 | # NOTE: When changing this, also update `test/wasm/sqlite3_test.dart` |
13 | 15 | URL https://sqlite.org/2024/sqlite-autoconf-3460000.tar.gz |
14 | 16 | DOWNLOAD_EXTRACT_TIMESTAMP NEW |
| 17 | +) |
| 18 | + |
| 19 | +FetchContent_MakeAvailable(sqlite3) |
| 20 | + |
| 21 | +file(DOWNLOAD https://raw.githubusercontent.com/sqlite/sqlite/master/src/test_vfstrace.c "${CMAKE_BINARY_DIR}/vfstrace.c") |
| 22 | + |
| 23 | +# Generate symbols we need to export from the sqlite3.wasm build |
| 24 | +add_custom_command( |
| 25 | + OUTPUT required_symbols.txt |
| 26 | + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../ |
| 27 | + COMMAND dart run tool/wasm_symbols.dart ${CMAKE_CURRENT_BINARY_DIR}/required_symbols.txt |
| 28 | + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../../tool/wasm_symbols.dart |
| 29 | + VERBATIM |
| 30 | +) |
| 31 | +add_custom_target(required_symbols DEPENDS required_symbols.txt) |
| 32 | + |
| 33 | +macro(base_sqlite3_target name debug) |
| 34 | + set(clang_output ${name}.clang.wasm) |
| 35 | + set(init_output ${name}.init.wasm) |
| 36 | + set(output ${init_output}) |
| 37 | + |
| 38 | + set(sources |
| 39 | + ${CMAKE_CURRENT_SOURCE_DIR}/os_web.c |
| 40 | + ${CMAKE_CURRENT_SOURCE_DIR}/helpers.c |
| 41 | + ${sqlite3_SOURCE_DIR}/sqlite3.c |
15 | 42 | ) |
16 | | -else() |
17 | | - FetchContent_Declare( |
18 | | - sqlite3 |
19 | | - # NOTE: When changing this, also update `test/wasm/sqlite3_test.dart` |
20 | | - URL https://sqlite.org/2024/sqlite-autoconf-3460000.tar.gz |
| 43 | + set(flags -Wall -Wextra -Wno-unused-parameter -Wno-unused-function) |
| 44 | + |
| 45 | + if(${debug}) |
| 46 | + list(APPEND sources "${CMAKE_BINARY_DIR}/vfstrace.c") |
| 47 | + list(APPEND flags "-g" "-DDEBUG") |
| 48 | + else() |
| 49 | + list(APPEND flags "-Oz" "-DNDEBUG" "-flto") |
| 50 | + endif() |
| 51 | + |
| 52 | + add_custom_command( |
| 53 | + OUTPUT ${clang_output} |
| 54 | + COMMAND ${clang} --target=${triple} -std=c23 |
| 55 | + ${flags} |
| 56 | + -o ${clang_output} |
| 57 | + -I ${PROJECT_SOURCE_DIR} -I ${sqlite3_SOURCE_DIR} |
| 58 | + -D_HAVE_SQLITE_CONFIG_H |
| 59 | + -mcpu=generic |
| 60 | + -mexec-model=reactor |
| 61 | + -fno-stack-protector -fno-stack-clash-protection |
| 62 | + -Wl,--import-memory |
| 63 | + --sysroot /usr/share/wasi-sysroot |
| 64 | + ${sources} |
| 65 | + @${CMAKE_CURRENT_BINARY_DIR}/required_symbols.txt |
| 66 | + DEPENDS ${sources} required_symbols |
| 67 | + VERBATIM |
21 | 68 | ) |
22 | | -endif() |
23 | 69 |
|
24 | | -FetchContent_MakeAvailable(sqlite3) |
| 70 | + add_custom_command( |
| 71 | + OUTPUT ${init_output} |
| 72 | + COMMAND wasm-ctor-eval -c _initialize ${clang_output} -o ${init_output} |
| 73 | + VERBATIM |
| 74 | + DEPENDS ${clang_output} |
| 75 | + ) |
25 | 76 |
|
26 | | -set(wasm_visibility "__attribute__((visibility(\"default\")))") |
| 77 | + if(NOT ${debug}) |
| 78 | + set(output ${name}.wasm) |
27 | 79 |
|
28 | | -macro(base_sqlite3_target name) |
29 | | - add_executable(${name} |
30 | | - "${sqlite3_SOURCE_DIR}/sqlite3.c" |
31 | | - os_web.c |
32 | | - helpers.c |
| 80 | + add_custom_command( |
| 81 | + OUTPUT ${output} |
| 82 | + COMMAND wasm-opt --strip --strip-producers -c -O4 ${init_output} -o ${output} |
| 83 | + VERBATIM |
| 84 | + DEPENDS ${init_output} |
33 | 85 | ) |
| 86 | + endif() |
34 | 87 |
|
35 | | - target_link_options(${name} PRIVATE -mexec-model=reactor -mcpu=generic -Wl,--import-memory -Wl,--no-entry -Wl,--export-dynamic) |
36 | | - target_compile_options(${name} PRIVATE -std=c23 -mcpu=generic) |
37 | | - target_include_directories(${name} PRIVATE "${PROJECT_SOURCE_DIR}/") |
38 | | - target_include_directories(${name} PRIVATE ${sqlite3_SOURCE_DIR}) |
39 | | - target_compile_definitions(${name} PRIVATE |
40 | | - _HAVE_SQLITE_CONFIG_H |
41 | | - SQLITE_API=${wasm_visibility} |
42 | | - ) |
43 | | - set_property(TARGET ${name} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) |
| 88 | + add_custom_target(${name} DEPENDS ${output}) |
44 | 89 | endmacro() |
45 | 90 |
|
46 | | -base_sqlite3_target(sqlite3_debug) |
47 | | -file(DOWNLOAD https://raw.githubusercontent.com/sqlite/sqlite/master/src/test_vfstrace.c "${CMAKE_BINARY_DIR}/vfstrace.c") |
48 | | -target_sources(sqlite3_debug PRIVATE "${CMAKE_BINARY_DIR}/vfstrace.c") |
49 | | -target_compile_options(sqlite3_debug PRIVATE -g) |
50 | | -target_compile_definitions(sqlite3_debug PRIVATE SQLITE_ENABLE_VFSTRACE SQLITE_ENABLE_API_ARMOR) |
51 | | -set_target_properties(sqlite3_debug PROPERTIES OUTPUT_NAME "sqlite3" SUFFIX ".debug.wasm") |
52 | | - |
53 | | -base_sqlite3_target(sqlite3_opt) |
54 | | -target_compile_options(sqlite3_opt PRIVATE -Oz) |
55 | | -set_target_properties(sqlite3_opt PROPERTIES OUTPUT_NAME "sqlite3" SUFFIX ".tmp.wasm") |
56 | | -add_custom_command(TARGET sqlite3_opt POST_BUILD |
57 | | - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../ |
58 | | - COMMAND dart run tool/wasm_dce.dart ${CMAKE_CURRENT_BINARY_DIR}/sqlite3.tmp.wasm ${CMAKE_CURRENT_BINARY_DIR}/sqlite3.dce.wasm |
59 | | - COMMAND wasm-opt ${CMAKE_CURRENT_BINARY_DIR}/sqlite3.dce.wasm -O4 -o ${CMAKE_CURRENT_BINARY_DIR}/sqlite3.wasm |
60 | | -) |
| 91 | +base_sqlite3_target(sqlite3_debug true) |
| 92 | +base_sqlite3_target(sqlite3_opt false) |
61 | 93 |
|
62 | 94 | add_custom_target(output) |
63 | | -add_custom_command(TARGET output COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/sqlite3.wasm ${PROJECT_SOURCE_DIR}/../../example/web/sqlite3.wasm) |
64 | | -add_custom_command(TARGET output COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/sqlite3.debug.wasm ${PROJECT_SOURCE_DIR}/../../example/web/sqlite3.debug.wasm) |
| 95 | +add_custom_command(TARGET output COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/sqlite3_opt.wasm ${PROJECT_SOURCE_DIR}/../../example/web/sqlite3.wasm) |
| 96 | +add_custom_command(TARGET output COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/sqlite3_debug.init.wasm ${PROJECT_SOURCE_DIR}/../../example/web/sqlite3.debug.wasm) |
65 | 97 | add_dependencies(output sqlite3_debug sqlite3_opt) |
0 commit comments