1 set(LIBA_JAVASCRIPT_SUFFIX ".js" CACHE STRING "The suffix for JavaScript output files.")
2 set_property(CACHE LIBA_JAVASCRIPT_SUFFIX PROPERTY STRINGS ".js" ".mjs" ".html" ".wasm")
3 set(CMAKE_EXECUTABLE_SUFFIX ${LIBA_JAVASCRIPT_SUFFIX})
10 include(../cmake/Emscripten.cmake)
11 get_property(OBJECTS TARGET a PROPERTY SOURCES)
13 set(OBJECTS $<TARGET_OBJECTS:asan>)
15 set(OBJECTS $<TARGET_OBJECTS:a>)
18 set(CMAKE_POSITION_INDEPENDENT_CODE ${LIBA_PIE})
19 set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${LIBA_IPO})
20 file_scaner(SOURCES RECURSE src EXT c h cc hh cpp hpp)
23 file_scaner(source RECURSE ../src EXT cc hh cpp hpp)
24 list(APPEND SOURCES ${source})
27 if(NOT DEFINED EMSDK_COMPILER_VERSION)
28 set(EMSDK_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
31 # https://emscripten.org/docs/tools_reference/emcc.html
32 set(LIBA_EMCC_FLAGS "" CACHE STRING "Flags used by the emcc")
33 string_append(CMAKE_C_FLAGS ${LIBA_EMCC_FLAGS})
34 set(LIBA_EMXX_FLAGS "" CACHE STRING "Flags used by the em++")
35 string_append(CMAKE_CXX_FLAGS ${LIBA_EMXX_FLAGS})
36 set(LIBA_WASM_FLAGS "" CACHE STRING "Flags used by the linker")
38 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
39 set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
40 option(LIBA_JAVASCRIPT_TSGEN "Enable/Disable generation of TypeScript definition files" 0)
41 option(LIBA_JAVASCRIPT_ASYNC "Enable/Disable compilation of wasm async" 0)
42 option(LIBA_JAVASCRIPT_WASM "Enable/Disable JavaScript WebAssembly" 1)
43 option(LIBA_JAVASCRIPT_BIGINT "Enable/Disable JavaScript BigInt" 0)
45 if(NOT EMSCRIPTEN_VERSION VERSION_LESS 3.1.3)
46 string(REPLACE "T> <" "T> -lembind <" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
47 string(REPLACE "T> <" "T> -lembind <" CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE}")
49 string(REPLACE "T> <" "T> --bind <" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
50 string(REPLACE "T> <" "T> --bind <" CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE}")
54 string_append(CMAKE_C_LINK_EXECUTABLE -fsanitize=address,leak,undefined
55 -fno-omit-frame-pointer -fsanitize-recover=all -sALLOW_MEMORY_GROWTH
57 string_append(CMAKE_CXX_LINK_EXECUTABLE -fsanitize=address,leak,undefined
58 -fno-omit-frame-pointer -fsanitize-recover=all -sALLOW_MEMORY_GROWTH
62 if(LIBA_JAVASCRIPT_TSGEN)
63 if(EMSCRIPTEN_VERSION VERSION_LESS 3.1.57)
64 string_append(CMAKE_C_LINK_EXECUTABLE --embind-emit-tsd liba.gen.d.ts)
65 string_append(CMAKE_CXX_LINK_EXECUTABLE --embind-emit-tsd liba.gen.d.ts)
67 string_append(CMAKE_C_LINK_EXECUTABLE --emit-tsd liba.gen.d.ts)
68 string_append(CMAKE_CXX_LINK_EXECUTABLE --emit-tsd liba.gen.d.ts)
72 if(NOT LIBA_JAVASCRIPT_ASYNC)
73 string_append(CMAKE_C_LINK_EXECUTABLE -sWASM_ASYNC_COMPILATION=0)
74 string_append(CMAKE_CXX_LINK_EXECUTABLE -sWASM_ASYNC_COMPILATION=0)
77 if(LIBA_JAVASCRIPT_BIGINT)
78 string_append(CMAKE_C_LINK_EXECUTABLE -sWASM_BIGINT)
79 string_append(CMAKE_CXX_LINK_EXECUTABLE -sWASM_BIGINT)
80 set_property(SOURCE ${SOURCES} APPEND PROPERTY
81 COMPILE_DEFINITIONS WASM_BIGINT
85 if(NOT LIBA_JAVASCRIPT_WASM)
86 string_append(CMAKE_C_LINK_EXECUTABLE -sWASM=0)
87 string_append(CMAKE_CXX_LINK_EXECUTABLE -sWASM=0)
90 string_append(CMAKE_C_LINK_EXECUTABLE ${LIBA_WASM_FLAGS})
91 string_append(CMAKE_CXX_LINK_EXECUTABLE ${LIBA_WASM_FLAGS})
93 add_executable(ajs ${OBJECTS} ${SOURCES})
94 target_compile_definitions(ajs PRIVATE $<TARGET_PROPERTY:a,COMPILE_DEFINITIONS>)
95 target_include_directories(ajs PRIVATE $<TARGET_PROPERTY:a,INCLUDE_DIRECTORIES>)
96 set_target_properties(ajs PROPERTIES OUTPUT_NAME ${PROJECT_NAME}
97 RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_CURRENT_LIST_DIR}
98 RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_CURRENT_LIST_DIR}
99 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}
100 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}
103 if(NOT CMAKE_VERSION VERSION_LESS 3.3 AND LIBA_WARNINGS AND UNIX)
104 target_compile_options(ajs PRIVATE -Weverything -Wno-documentation
105 -Wno-documentation-unknown-command -Wno-used-but-marked-unused
106 $<$<COMPILE_LANGUAGE:C>:-Wno-declaration-after-statement>
107 $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++98-compat-pedantic>
110 if(NOT EMSDK_COMPILER_VERSION VERSION_LESS 16)
111 target_compile_options(ajs PRIVATE -Wno-unsafe-buffer-usage)
116 target_compile_options(ajs PRIVATE -fsanitize=address,leak,undefined
117 -fno-omit-frame-pointer -fsanitize-recover=all
121 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/test/CMakeLists.txt AND
122 CMAKE_CROSSCOMPILING_EMULATOR)
123 add_subdirectory(test)