Files
puzzles/cmake/platforms/emscripten.cmake
Ben Harris f9449af87a kaios: Major parts of a build for KaiOS
KaiOS (which is based on Firefox OS, formerly Boot to Gecko) runs its
"native" apps in a Web browser, so this is essentially a rather
specialised version of the JavaScript front-end.  Indeed, the JavaScript
and C parts are the same as the Web version.

There are three major parts that are specific to the KaiOS build.
First, there's manifest.pl, which generates a KaiOS-specific JSON
manifest describing each puzzle.

Second, there's a new HTML page generator, apppage.pl, that generates an
HTML page that is much less like a Web page, and much more like an
application, than the one generated by jspage.pl. It expects to build a
single HTML page at a time and gets all its limited knowledge of the
environment from its command line.  This makes it gratuitously different
from jspage.pl and javapage.pl, but makes it easier to run from the
build system.

And finally, there's the CMake glue that assembles the necessary parts
for each application in a directory.  This includes the manifest, the
HTML, the JavaScript, the KaiOS-specific icons (generated as part of the
GTK build) and a copy of the HTML documentation.  The directory is
assembled using CMake's install() function, and can be installed on a
KaiOS device using the developer tools.
2023-01-19 20:34:48 +00:00

133 lines
4.3 KiB
CMake

set(platform_common_sources emcc.c)
set(platform_gui_libs)
set(platform_libs)
set(CMAKE_EXECUTABLE_SUFFIX ".js")
set(WASM ON
CACHE BOOL "Compile to WebAssembly rather than plain JavaScript")
find_program(HALIBUT halibut)
if(NOT HALIBUT)
message(WARNING "HTML documentation cannot be built (did not find halibut)")
endif()
set(emcc_export_list
# Event handlers for mouse and keyboard input
_mouseup
_mousedown
_mousemove
_key
# Callback when the program activates timing
_timer_callback
# Callback from button presses in the UI outside the canvas
_command
# Game-saving and game-loading functions
_get_save_file
_free_save_file
_load_game
# Callbacks to return values from dialog boxes
_dlg_return_sval
_dlg_return_ival
# Callbacks when the resizing controls are used
_resize_puzzle
_restore_puzzle_size
# Callback when device pixel ratio changes
_rescale_puzzle
# Main program, run at initialisation time
_main)
list(TRANSFORM emcc_export_list PREPEND \")
list(TRANSFORM emcc_export_list APPEND \")
string(JOIN "," emcc_export_string ${emcc_export_list})
set(CMAKE_C_LINK_FLAGS "\
-s ALLOW_MEMORY_GROWTH=1 \
-s EXPORTED_FUNCTIONS='[${emcc_export_string}]' \
-s EXTRA_EXPORTED_RUNTIME_METHODS='[cwrap,callMain]' \
-s STRICT_JS=1")
if(WASM)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s WASM=1")
else()
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s WASM=0")
endif()
set(build_cli_programs FALSE)
set(build_gui_programs FALSE)
function(get_platform_puzzle_extra_source_files OUTVAR NAME)
set(${OUTVAR} PARENT_SCOPE)
endfunction()
function(set_platform_gui_target_properties TARGET)
endfunction()
function(set_platform_puzzle_target_properties NAME TARGET)
em_link_pre_js(${TARGET} ${CMAKE_SOURCE_DIR}/emccpre.js)
em_link_js_library(${TARGET} ${CMAKE_SOURCE_DIR}/emcclib.js)
em_link_post_js(${TARGET} ${CMAKE_SOURCE_DIR}/emccpost.js)
endfunction()
function(build_platform_extras)
if(HALIBUT)
set(help_dir ${CMAKE_CURRENT_BINARY_DIR}/help)
add_custom_command(OUTPUT ${help_dir}/en
COMMAND ${CMAKE_COMMAND} -E make_directory ${help_dir}/en)
add_custom_command(OUTPUT ${help_dir}/en/index.html
COMMAND ${HALIBUT} --html -Chtml-template-fragment:%k
${CMAKE_CURRENT_SOURCE_DIR}/puzzles.but
DEPENDS
${help_dir}/en
${CMAKE_CURRENT_SOURCE_DIR}/puzzles.but
WORKING_DIRECTORY ${help_dir}/en)
add_custom_target(kaios_help ALL
DEPENDS ${help_dir}/en/index.html)
endif()
# This is probably not the right way to set the destination.
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH
"Installation path" FORCE)
add_custom_target(kaios-extras ALL)
foreach(name ${puzzle_names})
add_custom_command(
OUTPUT ${name}-manifest.webapp
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/kaios/manifest.pl
"${name}" "${displayname_${name}}" "${description_${name}}"
"${objective_${name}}" > "${name}-manifest.webapp"
VERBATIM
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kaios/manifest.pl)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/kaios)
add_custom_command(
OUTPUT ${name}-kaios.html
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/kaios/apppage.pl
"${name}" "${displayname_${name}}" > "${name}-kaios.html"
VERBATIM
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kaios/apppage.pl)
add_custom_target(${name}-kaios-extras
DEPENDS ${name}-manifest.webapp ${name}-kaios.html)
add_dependencies(kaios-extras ${name}-kaios-extras)
install(TARGETS ${name} DESTINATION kaios/${name})
# Release builds generate an initial memory image alongside the
# JavaScript, but CMake doesn't seem to know about it to install
# it.
install(FILES $<TARGET_FILE:${name}>.mem OPTIONAL
DESTINATION kaios/${name})
install(FILES ${ICON_DIR}/${name}-56kai.png ${ICON_DIR}/${name}-112kai.png
DESTINATION kaios/${name} OPTIONAL)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-kaios.html
RENAME ${name}.html
DESTINATION kaios/${name})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-manifest.webapp
RENAME manifest.webapp
DESTINATION kaios/${name})
if (HALIBUT)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/help
DESTINATION kaios/${name})
endif()
endforeach()
endfunction()