release 0.1.13
[liba.git] / quickjs / src / CMakeLists.txt
blob5a007e271c8b17aa297ca4a6c8b459164b596e41
1 set(CMAKE_POLICY_DEFAULT_CMP0048 NEW)
2 set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
3 cmake_minimum_required(VERSION 2.8.12...4.0)
5 project(quickjs C)
7 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
8 get_filename_component(CONFIG_CC "${CMAKE_C_COMPILER}" NAME_WE)
9 file(STRINGS ${CMAKE_CURRENT_LIST_DIR}/VERSION PROJECT_VERSION)
10 set(PROJECT_DESCRIPTION "QuickJS is a small and embeddable Javascript engine.")
11 set(PROJECT_HOMEPAGE_URL "https://bellard.org/quickjs")
12 set(CMAKE_C_EXTENSIONS 1)
13 set(CMAKE_C_STANDARD 99)
14 set(QJS_DEPENDS qjsc)
16 if(CMAKE_HOST_WIN32)
17   set(SUFFIX ".exe")
18 else()
19   set(SUFFIX "")
20 endif()
22 if(NOT QUICKJS_CROSSCOMPILING AND CMAKE_CROSSCOMPILING)
23   if(CMAKE_VERSION VERSION_LESS 3.1)
24     set(cmake_env)
25   else()
26     set(cmake_env ${CMAKE_COMMAND} -E env
27       --unset=CC
28       --unset=CFLAGS
29       --unset=LDFLAGS
30       --unset=DESTDIR
31     )
32   endif()
34   include(ExternalProject)
35   set(QJS_DEPENDS host-qjsc)
36   ExternalProject_Add(${QJS_DEPENDS}
37     PREFIX ${CMAKE_CURRENT_BINARY_DIR}
38     SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
39     CMAKE_COMMAND ${cmake_env} ${CMAKE_COMMAND}
40     CMAKE_CACHE_ARGS
41       -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}
42       -DCMAKE_BUILD_TYPE:STRING=Release
43       -DCMAKE_TOOLCHAIN_FILE:FILEPATH=
44       -DQUICKJS_CROSSCOMPILING:BOOL=1
45     BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/host
46     INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
47   )
48   set(QJSC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/bin/qjsc${SUFFIX})
49 else()
50   set(QJSC_EXECUTABLE $<TARGET_FILE:qjsc>)
51 endif()
53 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
54   set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." FORCE)
55   set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
56 endif()
58 # https://cmake.org/cmake/help/latest/module/CheckIPOSupported.html
59 if(NOT CMAKE_VERSION VERSION_LESS 3.9)
60   cmake_policy(SET CMP0069 NEW)
61   include(CheckIPOSupported)
62   check_ipo_supported(RESULT CONFIG_LTO)
63 endif()
65 if(NOT QUICKJS_MATH_LIBRARY AND WIN32)
66   unset(QUICKJS_MATH_LIBRARY CACHE)
67 elseif(NOT QUICKJS_MATH_LIBRARY)
68   set(QUICKJS_MATH_LIBRARY m)
69 endif()
71 find_package(Threads)
73 function(quickjs_compile target)
74   add_library(${target} STATIC
75     cutils.c
76     libbf.c
77     libregexp.c
78     libunicode.c
79     quickjs.c
80     quickjs-libc.c
81   )
82   set_target_properties(${target} PROPERTIES
83     DEFINE_SYMBOL CONFIG_VERSION="${PROJECT_VERSION}"
84     INTERPROCEDURAL_OPTIMIZATION "${ARGN}"
85     POSITION_INDEPENDENT_CODE 1
86   )
87   target_include_directories(${target}
88     INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
89     PUBLIC $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
90   )
91   target_compile_definitions(${target} PRIVATE
92     CONFIG_VERSION="${PROJECT_VERSION}"
93     CONFIG_BIGNUM _GNU_SOURCE
94   )
96   if(UNIX)
97     target_link_libraries(${target} PUBLIC
98       ${QUICKJS_MATH_LIBRARY} ${CMAKE_DL_LIBS}
99     )
100   endif()
102   if(CMAKE_USE_PTHREADS_INIT)
103     target_link_libraries(${target} PUBLIC pthread)
104   endif()
106   if(CMAKE_C_COMPILER_ID MATCHES "GNU|[Cc]lang")
107     target_compile_options(${target} PRIVATE -fwrapv)
108   endif()
109 endfunction()
111 quickjs_compile(quickjs.lto ${CONFIG_LTO})
112 set(INSTALL_TARGETS quickjs.lto qjsc)
113 add_executable(qjsc qjsc.c)
114 set_target_properties(qjsc PROPERTIES
115   INTERPROCEDURAL_OPTIMIZATION "${CONFIG_LTO}"
117 target_compile_definitions(qjsc PRIVATE
118   CONFIG_PREFIX="${CMAKE_INSTALL_PREFIX}"
119   CONFIG_VERSION="${PROJECT_VERSION}"
120   CONFIG_BIGNUM _GNU_SOURCE
121   CONFIG_CC="${CONFIG_CC}"
123 target_link_libraries(qjsc PRIVATE quickjs.lto)
125 if(CMAKE_C_COMPILER_ID MATCHES "GNU|[Cc]lang")
126   target_compile_options(qjsc PRIVATE -fwrapv)
127 endif()
129 if(NOT QUICKJS_CROSSCOMPILING)
130   quickjs_compile(quickjs)
131   list(APPEND INSTALL_TARGETS quickjs qjs)
132   add_custom_command(DEPENDS ${QJS_DEPENDS}
133     OUTPUT ${CMAKE_CURRENT_LIST_DIR}/repl.c
134     WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
135     COMMAND ${QJSC_EXECUTABLE} -m -o repl.c -c repl.js
136   )
137   add_custom_command(DEPENDS ${QJS_DEPENDS}
138     OUTPUT ${CMAKE_CURRENT_LIST_DIR}/qjscalc.c
139     WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
140     COMMAND ${QJSC_EXECUTABLE} -fbignum -o qjscalc.c -c qjscalc.js
141   )
142   add_executable(qjs qjs.c repl.c qjscalc.c)
143   set_target_properties(qjs PROPERTIES
144     INTERPROCEDURAL_OPTIMIZATION "${CONFIG_LTO}"
145   )
146   target_compile_definitions(qjs PRIVATE
147     CONFIG_VERSION="${PROJECT_VERSION}"
148     CONFIG_BIGNUM _GNU_SOURCE
149   )
150   target_link_libraries(qjs PRIVATE quickjs.lto)
152   if(CMAKE_C_COMPILER_ID MATCHES "GNU|[Cc]lang")
153     target_compile_options(qjs PRIVATE -fwrapv)
154   endif()
155 endif()
157 include(GNUInstallDirs)
158 install(FILES quickjs.h quickjs-libc.h
159   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
161 install(TARGETS ${INSTALL_TARGETS} EXPORT ${PROJECT_NAME}-targets
162   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
163   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
164   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
166 install(EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}-targets.cmake
167   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
169 include(CMakePackageConfigHelpers)
170 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake "@PACKAGE_INIT@\n"
171   "include(\"\${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake\")\n"
173 configure_package_config_file(
174   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
175   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
176   INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
178 write_basic_package_version_file(
179   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
180   VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion
182 install(FILES
183   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
184   ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
185   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
188 get_property(prop TARGET quickjs.lto PROPERTY INTERFACE_LINK_LIBRARIES)
189 string(REGEX REPLACE "\\$<BUILD_INTERFACE:[^>]*>" "" prop "${prop}")
190 string(REPLACE "INSTALL_INTERFACE" "BUILD_INTERFACE" prop "${prop}")
191 string(REPLACE "-l$<JOIN:, -l>" "" PC_LDFLAGS "-l$<JOIN:${prop}, -l>")
192 file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc CONTENT
193   "prefix=${CMAKE_INSTALL_PREFIX}
194 exec_prefix=\${prefix}
195 libdir=\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
196 includedir=\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}\n
197 Name: ${PROJECT_NAME}
198 Description: ${PROJECT_DESCRIPTION}
199 Version: ${PROJECT_VERSION}
200 URL: ${PROJECT_HOMEPAGE_URL}
201 Cflags: -I\${includedir}
202 Libs: -L\${libdir} -l${PROJECT_NAME}
203 Libs.private: ${PC_LDFLAGS}
205 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
206   DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
209 set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
210 include(CPack)