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
|
# Make console binaries runnable through Node.js.
set(SWIPL_C_STACK_SIZE 1048576)
set(WASM_SHARED_LINK_FLAGS
-s WASM_BIGINT=1
-s ALLOW_MEMORY_GROWTH=1
-s STACK_SIZE=${SWIPL_C_STACK_SIZE}
-s STACK_OVERFLOW_CHECK=1)
if(MULTI_THREADED)
list(APPEND WASM_SHARED_LINK_FLAGS
-pthread
-s PTHREAD_POOL_SIZE=4)
endif()
# First, configure src/swipl.js as a node executable with raw file
# system access. This can be executed as `node src/swipl.js [options]`
# as a normal local SWI-Prolog executable. We use this to perform the
# Prolog build steps such as generating the boot.prc file and the .qlf
# files.
set(WASM_NODE_LINK_FLAGS
-s NODERAWFS=1
-s EXIT_RUNTIME=1)
list(APPEND WASM_NODE_LINK_FLAGS ${WASM_SHARED_LINK_FLAGS})
join_list(WASM_NODE_LINK_FLAGS_STRING " " ${WASM_NODE_LINK_FLAGS})
set_target_properties(swipl PROPERTIES
LINK_FLAGS "${WASM_NODE_LINK_FLAGS_STRING}")
# Create the preload data containing the libraries. Note that
# alternatively we can put the library in the resource file and
# link the resource file into the main executable.
set(WASM_BOOT_FILE "${WASM_PRELOAD_DIR}/boot.prc")
add_custom_command(
OUTPUT ${WASM_BOOT_FILE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${WASM_PRELOAD_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${SWIPL_BOOT_FILE} ${WASM_BOOT_FILE}
COMMAND ${CMAKE_COMMAND} -E copy_directory
${SWIPL_BUILD_LIBRARY} ${WASM_PRELOAD_DIR}/library
DEPENDS ${SWIPL_BOOT_FILE} prolog_home library_index
VERBATIM)
add_custom_target(wasm_preload_dir DEPENDS ${WASM_BOOT_FILE})
add_dependencies(wasm_preload wasm_preload_dir)
# Next, build the binaries for deployment.
# Build the browser-deployed binary with a bit different linker flags.
set(POSTJS ${CMAKE_CURRENT_SOURCE_DIR}/wasm/prolog.js)
set(PREJS ${CMAKE_CURRENT_SOURCE_DIR}/wasm/pre.js)
set(WASM_DIST_LINK_FLAGS
-s WASM=1
-s MODULARIZE=1
-s EXPORT_NAME=SWIPL
-s NO_EXIT_RUNTIME=0
-s EXPORTED_FUNCTIONS=@${CMAKE_SOURCE_DIR}/src/wasm/exports.json
-s EXPORTED_RUNTIME_METHODS=@${CMAKE_SOURCE_DIR}/src/wasm/runtime_exports.json
--pre-js ${PREJS}
--post-js ${POSTJS})
list(APPEND WASM_DIST_LINK_FLAGS ${WASM_SHARED_LINK_FLAGS})
if(MULTI_THREADED)
list(APPEND WASM_DIST_LINK_FLAGS
-pthread
-s PTHREAD_POOL_SIZE=4)
endif()
# Create swipl-web.js, swipl-web.wasm, swipl-web.data
set(WASM_WEB_LINK_FLAGS
--preload-file ${WASM_PRELOAD_DIR}@swipl)
join_list(WASM_WEB_LINK_FLAGS_STRING " "
${WASM_WEB_LINK_FLAGS} ${WASM_DIST_LINK_FLAGS})
add_executable(swipl-web ${SWIPL_SRC})
set_target_properties(swipl-web PROPERTIES
LINK_FLAGS "${WASM_WEB_LINK_FLAGS_STRING}")
target_link_libraries(swipl-web libswipl)
add_dependencies(swipl-web wasm_preload)
set_property(TARGET swipl-web PROPERTY LINK_DEPENDS
${POSTJS} ${PREJS})
# Create swipl-bundle.js
set(WASM_BUNDLE_LINK_FLAGS
-s SINGLE_FILE
--embed-file ${WASM_PRELOAD_DIR}@swipl)
join_list(WASM_BUNDLE_LINK_FLAGS_STRING " "
${WASM_BUNDLE_LINK_FLAGS} ${WASM_DIST_LINK_FLAGS})
add_executable(swipl-bundle ${SWIPL_SRC})
set_target_properties(swipl-bundle PROPERTIES
LINK_FLAGS "${WASM_BUNDLE_LINK_FLAGS_STRING}")
target_link_libraries(swipl-bundle libswipl)
add_dependencies(swipl-bundle wasm_preload)
set_property(TARGET swipl-bundle PROPERTY LINK_DEPENDS
${POSTJS} ${PREJS})
# Create swipl-bundle-no-data.js
set(WASM_NO_DATA_BUNDLE_LINK_FLAGS
-s SINGLE_FILE)
join_list(WASM_NO_DATA_BUNDLE_LINK_FLAGS_STRING " "
${WASM_NO_DATA_BUNDLE_LINK_FLAGS} ${WASM_DIST_LINK_FLAGS})
add_executable(swipl-bundle-no-data ${SWIPL_SRC})
set_target_properties(swipl-bundle-no-data PROPERTIES
LINK_FLAGS "${WASM_NO_DATA_BUNDLE_LINK_FLAGS_STRING}")
target_link_libraries(swipl-bundle-no-data libswipl)
set_property(TARGET swipl-bundle-no-data PROPERTY LINK_DEPENDS
${POSTJS} ${PREJS})
|