@@ -23,11 +23,18 @@ option(ARK_TESTS "Build ArkScript unit tests" Off)
2323option (ARK_BENCHMARKS "Build ArkScript benchmarks" Off )
2424option (ARK_COVERAGE "Enable coverage while building (clang, gcc) (requires ARK_TESTS to be On)" Off )
2525option (ARK_UNITY_BUILD "Enable unity build" Off )
26+ option (ARK_JS_ONLY "Compiles to native JS (No WASM). Can be used only when compiling with emsdk" OFF )
2627
27- include (cmake/link_time_optimization.cmake)
28- include (cmake/sanitizers.cmake)
28+ if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten" )
29+ set (ARK_EMSCRIPTEN TRUE )
30+ endif ()
31+
32+ if (NOT ARK_EMSCRIPTEN)
33+ include (cmake/link_time_optimization.cmake)
34+ include (cmake/sanitizers.cmake)
35+ include (GNUInstallDirs) # Uses GNU Install directory variables
36+ endif ()
2937include (cmake/CPM.cmake)
30- include (GNUInstallDirs) # Uses GNU Install directory variables
3138
3239# configure installer.iss
3340configure_file (
@@ -48,7 +55,9 @@ file(GLOB_RECURSE SOURCE_FILES
4855 ${ark_SOURCE_DIR} /lib/fmt/src/format.cc)
4956
5057add_library (ArkReactor SHARED ${SOURCE_FILES} )
51- enable_lto(ArkReactor)
58+ if (NOT ARK_EMSCRIPTEN)
59+ enable_lto(ArkReactor)
60+ endif ()
5261target_include_directories (ArkReactor
5362 PUBLIC
5463 ${ark_SOURCE_DIR} /include )
@@ -59,6 +68,31 @@ if (ARK_UNITY_BUILD)
5968 set_source_files_properties (src/arkreactor/VM/VM.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION true )
6069endif ()
6170
71+ if (ARK_EMSCRIPTEN)
72+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR} /public" )
73+
74+ # ArkScript lib needs to know if we are building an exe to enable/disable specific code for embedding
75+ target_compile_definitions (ArkReactor PRIVATE ARK_BUILD_EXE=1)
76+
77+ add_executable (ArkEmscripten ${ark_SOURCE_DIR} /src/arkemscripten/main.cpp)
78+ target_link_libraries (ArkEmscripten PUBLIC ArkReactor)
79+ target_compile_features (ArkEmscripten PRIVATE cxx_std_20)
80+
81+ # enable_lto(ArkEmscripten)
82+
83+ if (ARK_JS_ONLY)
84+ message (STATUS "Setting compilation target to native JavaScript" )
85+ set (CMAKE_EXECUTABLE_SUFFIX ".js" )
86+ set_target_properties (ArkReactor PROPERTIES LINK_FLAGS "-s WASM=0 -s NO_DISABLE_EXCEPTION_CATCHING" )
87+ set_target_properties (ArkEmscripten PROPERTIES LINK_FLAGS "-s WASM=0 -s NO_DISABLE_EXCEPTION_CATCHING -s EXPORTED_FUNCTIONS='[_main]' -s EXPORTED_RUNTIME_METHODS=['run'] -lembind" )
88+ else ()
89+ message (STATUS "Setting compilation target to WASM" )
90+ set (CMAKE_EXECUTABLE_SUFFIX ".wasm.js" )
91+ set_target_properties (ArkReactor PROPERTIES LINK_FLAGS "-s WASM=1 -s NO_DISABLE_EXCEPTION_CATCHING" )
92+ set_target_properties (ArkEmscripten PROPERTIES LINK_FLAGS "-s WASM=1 -s NO_DISABLE_EXCEPTION_CATCHING -s EXPORTED_FUNCTIONS='[_main]' -s EXPORTED_RUNTIME_METHODS=['run'] -lembind" )
93+ endif ()
94+ endif ()
95+
6296if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG OR APPLE )
6397 message (STATUS "Enabling computed gotos" )
6498 target_compile_definitions (ArkReactor PRIVATE ARK_USE_COMPUTED_GOTOS=1)
@@ -81,7 +115,7 @@ if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG OR APPLE)
81115 -fvisibility=hidden
82116 -fno-semantic-interposition
83117 )
84- if (NOT ARK_BENCHMARKS)
118+ if (NOT ARK_BENCHMARKS AND NOT ARK_EMSCRIPTEN )
85119 target_compile_options (ArkReactor PRIVATE -Werror)
86120 endif ()
87121
@@ -150,22 +184,23 @@ configure_file(
150184 ${ark_SOURCE_DIR} /include /Ark/Constants.hpp)
151185
152186# Installation rules
153-
154- # Installs the dynamic library file.
155- install (TARGETS ArkReactor
156- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} )
157-
158- # Install header files
159- install (DIRECTORY ${ark_SOURCE_DIR} /include /
160- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
161-
162- # Install the standard library
163- if (NOT ARK_NO_STDLIB)
164- install (DIRECTORY ${ark_SOURCE_DIR} /lib/std/
165- DESTINATION ${CMAKE_INSTALL_LIBDIR} /Ark/std
166- FILES_MATCHING PATTERN "*.ark"
167- PATTERN "std/tests" EXCLUDE
168- PATTERN "std/.github" EXCLUDE )
187+ if (NOT ARK_EMSCRIPTEN)
188+ # Installs the dynamic library file.
189+ install (TARGETS ArkReactor
190+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} )
191+
192+ # Install header files
193+ install (DIRECTORY ${ark_SOURCE_DIR} /include /
194+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
195+
196+ # Install the standard library
197+ if (NOT ARK_NO_STDLIB)
198+ install (DIRECTORY ${ark_SOURCE_DIR} /lib/std/
199+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /Ark/std
200+ FILES_MATCHING PATTERN "*.ark"
201+ PATTERN "std/tests" EXCLUDE
202+ PATTERN "std/.github" EXCLUDE )
203+ endif ()
169204endif ()
170205
171206# COMPILATION RELATED
0 commit comments