1 set(CMAKE_POLICY_DEFAULT_CMP0048 NEW)
2 set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
3 cmake_minimum_required(VERSION 2.8.12...4.0)
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)
22 if(NOT QUICKJS_CROSSCOMPILING AND CMAKE_CROSSCOMPILING)
23 if(CMAKE_VERSION VERSION_LESS 3.1)
26 set(cmake_env ${CMAKE_COMMAND} -E env
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}
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}
48 set(QJSC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/bin/qjsc${SUFFIX})
50 set(QJSC_EXECUTABLE $<TARGET_FILE:qjsc>)
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)
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)
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)
73 function(quickjs_compile target)
74 add_library(${target} STATIC
82 set_target_properties(${target} PROPERTIES
83 DEFINE_SYMBOL CONFIG_VERSION="${PROJECT_VERSION}"
84 INTERPROCEDURAL_OPTIMIZATION "${ARGN}"
85 POSITION_INDEPENDENT_CODE 1
87 target_include_directories(${target}
88 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
89 PUBLIC $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
91 target_compile_definitions(${target} PRIVATE
92 CONFIG_VERSION="${PROJECT_VERSION}"
93 CONFIG_BIGNUM _GNU_SOURCE
97 target_link_libraries(${target} PUBLIC
98 ${QUICKJS_MATH_LIBRARY} ${CMAKE_DL_LIBS}
102 if(CMAKE_USE_PTHREADS_INIT)
103 target_link_libraries(${target} PUBLIC pthread)
106 if(CMAKE_C_COMPILER_ID MATCHES "GNU|[Cc]lang")
107 target_compile_options(${target} PRIVATE -fwrapv)
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)
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
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
142 add_executable(qjs qjs.c repl.c qjscalc.c)
143 set_target_properties(qjs PROPERTIES
144 INTERPROCEDURAL_OPTIMIZATION "${CONFIG_LTO}"
146 target_compile_definitions(qjs PRIVATE
147 CONFIG_VERSION="${PROJECT_VERSION}"
148 CONFIG_BIGNUM _GNU_SOURCE
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)
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
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})