|
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