create script/cargo.py
[liba.git] / javascript / CMakeLists.txt
blob79d5a794c133d3d4a44f9576409a9aca43879133
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})
5 if(NOT LIBA_CXX)
6   enable_language(CXX)
7 endif()
9 if(NOT EMSCRIPTEN)
10   include(../cmake/Emscripten.cmake)
11   get_property(OBJECTS TARGET a PROPERTY SOURCES)
12 elseif(LIBA_SANITIZE)
13   set(OBJECTS $<TARGET_OBJECTS:asan>)
14 else()
15   set(OBJECTS $<TARGET_OBJECTS:a>)
16 endif()
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)
22 if(NOT LIBA_CXX)
23   file_scaner(source RECURSE ../src EXT cc hh cpp hpp)
24   list(APPEND SOURCES ${source})
25 endif()
27 if(NOT DEFINED EMSDK_COMPILER_VERSION)
28   set(EMSDK_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
29 endif()
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}")
48 else()
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}")
51 endif()
53 if(LIBA_SANITIZE)
54   string_append(CMAKE_C_LINK_EXECUTABLE -fsanitize=address,leak,undefined
55     -fno-omit-frame-pointer -fsanitize-recover=all -sALLOW_MEMORY_GROWTH
56   )
57   string_append(CMAKE_CXX_LINK_EXECUTABLE -fsanitize=address,leak,undefined
58     -fno-omit-frame-pointer -fsanitize-recover=all -sALLOW_MEMORY_GROWTH
59   )
60 endif()
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)
66   else()
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)
69   endif()
70 endif()
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)
75 endif()
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
82   )
83 endif()
85 if(NOT LIBA_JAVASCRIPT_WASM)
86   string_append(CMAKE_C_LINK_EXECUTABLE -sWASM=0)
87   string_append(CMAKE_CXX_LINK_EXECUTABLE -sWASM=0)
88 endif()
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>
108   )
110   if(NOT EMSDK_COMPILER_VERSION VERSION_LESS 16)
111     target_compile_options(ajs PRIVATE -Wno-unsafe-buffer-usage)
112   endif()
113 endif()
115 if(LIBA_SANITIZE)
116   target_compile_options(ajs PRIVATE -fsanitize=address,leak,undefined
117     -fno-omit-frame-pointer -fsanitize-recover=all
118   )
119 endif()
121 if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/test/CMakeLists.txt AND
122   CMAKE_CROSSCOMPILING_EMULATOR)
123   add_subdirectory(test)
124 endif()