1 cmake_minimum_required(VERSION 3.13) 2 include(CheckFunctionExists) 3 include(CheckSymbolExists) 4 5 project(ucode C) 6 add_definitions(-Os -Wall -Werror --std=gnu99 -ffunction-sections -fwrapv -D_GNU_SOURCE) 7 8 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 6) 9 add_definitions(-Wextra -Werror=implicit-function-declaration) 10 add_definitions(-Wformat -Werror=format-security -Werror=format-nonliteral) 11 endif() 12 13 if(NOT CMAKE_C_FLAGS MATCHES -D_FORTIFY_SOURCE=) 14 add_definitions(-D_FORTIFY_SOURCE=2) 15 endif() 16 17 add_definitions(-Wmissing-declarations -Wno-error=unused-variable -Wno-unused-parameter) 18 19 include_directories(include) 20 21 option(COMPILE_SUPPORT "Support compilation from source" ON) 22 23 if(NOT COMPILE_SUPPORT) 24 add_definitions(-DNO_COMPILE) 25 endif() 26 27 find_library(libuci NAMES uci) 28 find_library(libubox NAMES ubox) 29 find_library(libubus NAMES ubus) 30 find_library(libblobmsg_json NAMES blobmsg_json) 31 32 if(LINUX) 33 find_library(libnl_tiny NAMES nl-tiny) 34 35 if(libnl_tiny AND libubox) 36 set(DEFAULT_NL_SUPPORT ON) 37 endif() 38 endif() 39 40 if(libuci AND libubox) 41 set(DEFAULT_UCI_SUPPORT ON) 42 endif() 43 44 if(libubus AND libblobmsg_json) 45 set(DEFAULT_UBUS_SUPPORT ON) 46 endif() 47 48 if(libubox) 49 set(DEFAULT_ULOOP_SUPPORT ON) 50 endif() 51 52 option(DEBUG_SUPPORT "Debug plugin support" ON) 53 option(FS_SUPPORT "Filesystem plugin support" ON) 54 option(MATH_SUPPORT "Math plugin support" ON) 55 option(UBUS_SUPPORT "Ubus plugin support" ${DEFAULT_UBUS_SUPPORT}) 56 option(UCI_SUPPORT "UCI plugin support" ${DEFAULT_UCI_SUPPORT}) 57 option(RTNL_SUPPORT "Route Netlink plugin support" ${DEFAULT_NL_SUPPORT}) 58 option(NL80211_SUPPORT "Wireless Netlink plugin support" ${DEFAULT_NL_SUPPORT}) 59 option(RESOLV_SUPPORT "NS resolve plugin support" ON) 60 option(STRUCT_SUPPORT "Struct plugin support" ON) 61 option(ULOOP_SUPPORT "Uloop plugin support" ${DEFAULT_ULOOP_SUPPORT}) 62 option(LOG_SUPPORT "Log plugin support" ON) 63 option(SOCKET_SUPPORT "Socket plugin support" ON) 64 65 set(LIB_SEARCH_PATH "${CMAKE_INSTALL_PREFIX}/lib/ucode/*.so:${CMAKE_INSTALL_PREFIX}/share/ucode/*.uc:./*.so:./*.uc" CACHE STRING "Default library search path") 66 string(REPLACE ":" "\", \"" LIB_SEARCH_DEFINE "${LIB_SEARCH_PATH}") 67 add_definitions(-DLIB_SEARCH_PATH="${LIB_SEARCH_DEFINE}") 68 69 if(APPLE) 70 set(UCODE_MODULE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup") 71 add_definitions(-DBIND_8_COMPAT) 72 else() 73 set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-Wl,--gc-sections") 74 endif() 75 76 if(DEBUG) 77 add_definitions(-DDEBUG -g3 -Og) 78 else() 79 add_definitions(-DNDEBUG) 80 endif() 81 82 include(FindPkgConfig) 83 pkg_check_modules(JSONC REQUIRED json-c) 84 include_directories(${JSONC_INCLUDE_DIRS}) 85 86 set(UCODE_SOURCES lexer.c lib.c vm.c chunk.c vallist.c compiler.c source.c types.c program.c platform.c) 87 add_library(libucode SHARED ${UCODE_SOURCES}) 88 set(SOVERSION 0 CACHE STRING "Override ucode library version") 89 set_target_properties(libucode PROPERTIES OUTPUT_NAME ucode SOVERSION ${SOVERSION}) 90 target_link_libraries(libucode ${JSONC_LINK_LIBRARIES}) 91 92 set(CLI_SOURCES main.c) 93 add_executable(ucode ${CLI_SOURCES}) 94 target_link_libraries(ucode libucode ${JSONC_LINK_LIBRARIES}) 95 96 check_function_exists(dlopen DLOPEN_FUNCTION_EXISTS) 97 if(NOT DLOPEN_FUNCTION_EXISTS) 98 target_link_libraries(libucode dl) 99 endif() 100 101 check_function_exists(fmod FMOD_FUNCTION_EXISTS) 102 if(NOT FMOD_FUNCTION_EXISTS) 103 target_link_libraries(libucode m) 104 endif() 105 106 list(APPEND CMAKE_REQUIRED_INCLUDES ${JSONC_INCLUDE_DIRS}) 107 list(APPEND CMAKE_REQUIRED_LIBRARIES ${JSONC_LINK_LIBRARIES}) 108 check_symbol_exists(json_tokener_get_parse_end "json-c/json.h" HAVE_PARSE_END) 109 if(HAVE_PARSE_END) 110 add_definitions(-DHAVE_PARSE_END) 111 endif() 112 check_symbol_exists(json_object_new_array_ext "json-c/json.h" HAVE_ARRAY_EXT) 113 if(HAVE_ARRAY_EXT) 114 add_definitions(-DHAVE_ARRAY_EXT) 115 endif() 116 check_symbol_exists(json_object_new_uint64 "json-c/json.h" HAVE_JSON_UINT64) 117 if(HAVE_JSON_UINT64) 118 add_definitions(-DHAVE_JSON_UINT64) 119 endif() 120 121 set(LIBRARIES "") 122 123 if(DEBUG_SUPPORT) 124 set(LIBRARIES ${LIBRARIES} debug_lib) 125 add_library(debug_lib MODULE lib/debug.c) 126 set_target_properties(debug_lib PROPERTIES OUTPUT_NAME debug PREFIX "") 127 target_link_options(debug_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 128 if(libubox) 129 find_path(uloop_include_dir NAMES libubox/uloop.h) 130 include_directories(${uloop_include_dir}) 131 target_link_libraries(debug_lib ${libubox} ${libucode}) 132 set_target_properties(debug_lib PROPERTIES COMPILE_DEFINITIONS HAVE_ULOOP) 133 endif() 134 endif() 135 136 if(FS_SUPPORT) 137 set(LIBRARIES ${LIBRARIES} fs_lib) 138 add_library(fs_lib MODULE lib/fs.c) 139 set_target_properties(fs_lib PROPERTIES OUTPUT_NAME fs PREFIX "") 140 target_link_options(fs_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 141 endif() 142 143 if(MATH_SUPPORT) 144 set(LIBRARIES ${LIBRARIES} math_lib) 145 add_library(math_lib MODULE lib/math.c) 146 set_target_properties(math_lib PROPERTIES OUTPUT_NAME math PREFIX "") 147 target_link_options(math_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 148 check_function_exists(ceil CEIL_FUNCTION_EXISTS) 149 if(NOT CEIL_FUNCTION_EXISTS) 150 target_link_libraries(math_lib m) 151 endif() 152 endif() 153 154 if(UBUS_SUPPORT) 155 find_path(ubus_include_dir NAMES libubus.h) 156 include_directories(${ubus_include_dir}) 157 set(LIBRARIES ${LIBRARIES} ubus_lib) 158 add_library(ubus_lib MODULE lib/ubus.c) 159 set_target_properties(ubus_lib PROPERTIES OUTPUT_NAME ubus PREFIX "") 160 target_link_options(ubus_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 161 target_link_libraries(ubus_lib ${libubus} ${libblobmsg_json}) 162 file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c" " 163 #include <libubus.h> 164 int main() { return UBUS_STATUS_NO_MEMORY; } 165 ") 166 try_compile(HAVE_NEW_UBUS_STATUS_CODES 167 ${CMAKE_BINARY_DIR} 168 "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c") 169 if(HAVE_NEW_UBUS_STATUS_CODES) 170 add_definitions(-DHAVE_NEW_UBUS_STATUS_CODES) 171 endif() 172 endif() 173 174 if(UCI_SUPPORT) 175 find_path(uci_include_dir uci.h) 176 include_directories(${uci_include_dir}) 177 set(LIBRARIES ${LIBRARIES} uci_lib) 178 add_library(uci_lib MODULE lib/uci.c) 179 set_target_properties(uci_lib PROPERTIES OUTPUT_NAME uci PREFIX "") 180 target_link_options(uci_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 181 target_link_libraries(uci_lib ${libuci} ${libubox}) 182 endif() 183 184 if(RTNL_SUPPORT) 185 find_path(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny) 186 include_directories(${nl_include_dir}) 187 set(LIBRARIES ${LIBRARIES} rtnl_lib) 188 add_library(rtnl_lib MODULE lib/rtnl.c) 189 set_target_properties(rtnl_lib PROPERTIES OUTPUT_NAME rtnl PREFIX "") 190 target_link_options(rtnl_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 191 target_link_libraries(rtnl_lib ${libnl_tiny} ${libubox}) 192 endif() 193 194 if(NL80211_SUPPORT) 195 find_path(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny) 196 include_directories(${nl_include_dir}) 197 set(LIBRARIES ${LIBRARIES} nl80211_lib) 198 add_library(nl80211_lib MODULE lib/nl80211.c) 199 set_target_properties(nl80211_lib PROPERTIES OUTPUT_NAME nl80211 PREFIX "") 200 target_link_options(nl80211_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 201 target_link_libraries(nl80211_lib ${libnl_tiny} ${libubox}) 202 endif() 203 204 if(RESOLV_SUPPORT) 205 set(LIBRARIES ${LIBRARIES} resolv_lib) 206 add_library(resolv_lib MODULE lib/resolv.c) 207 set_target_properties(resolv_lib PROPERTIES OUTPUT_NAME resolv PREFIX "") 208 target_link_options(resolv_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 209 check_function_exists(res_mkquery RES_MKQUERY_FUNCTION_EXISTS) 210 check_function_exists(ns_initparse NS_INITARSE_FUNCTION_EXISTS) 211 check_function_exists(clock_gettime CLOCK_GETTIME_FUNCTION_EXISTS) 212 if(NOT RES_MKQUERY_FUNCTION_EXISTS OR NOT NS_INITARSE_FUNCTION_EXISTS) 213 target_link_libraries(resolv_lib resolv) 214 endif() 215 if(NOT CLOCK_GETTIME_FUNCTION_EXISTS) 216 target_link_libraries(resolv_lib rt) 217 endif() 218 endif() 219 220 if(STRUCT_SUPPORT) 221 set(LIBRARIES ${LIBRARIES} struct_lib) 222 add_library(struct_lib MODULE lib/struct.c) 223 set_target_properties(struct_lib PROPERTIES OUTPUT_NAME struct PREFIX "") 224 target_link_options(struct_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 225 check_function_exists(frexp FREXP_FUNCTION_EXISTS) 226 if(NOT FREXP_FUNCTION_EXISTS) 227 target_link_libraries(struct_lib m) 228 endif() 229 endif() 230 231 if(ULOOP_SUPPORT) 232 find_path(uloop_include_dir NAMES libubox/uloop.h) 233 include_directories(${uloop_include_dir}) 234 set(LIBRARIES ${LIBRARIES} uloop_lib) 235 add_library(uloop_lib MODULE lib/uloop.c) 236 set_target_properties(uloop_lib PROPERTIES OUTPUT_NAME uloop PREFIX "") 237 target_link_options(uloop_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 238 list(APPEND CMAKE_REQUIRED_LIBRARIES ${libubox}) 239 check_function_exists(uloop_timeout_remaining64 REMAINING64_FUNCTION_EXISTS) 240 check_function_exists(uloop_interval_set INTERVAL_FUNCTION_EXISTS) 241 check_function_exists(uloop_signal_add SIGNAL_FUNCTION_EXISTS) 242 if(REMAINING64_FUNCTION_EXISTS) 243 target_compile_definitions(uloop_lib PUBLIC HAVE_ULOOP_TIMEOUT_REMAINING64) 244 endif() 245 if(INTERVAL_FUNCTION_EXISTS) 246 target_compile_definitions(uloop_lib PUBLIC HAVE_ULOOP_INTERVAL) 247 endif() 248 if(SIGNAL_FUNCTION_EXISTS) 249 target_compile_definitions(uloop_lib PUBLIC HAVE_ULOOP_SIGNAL) 250 endif() 251 target_link_libraries(uloop_lib ${libubox}) 252 endif() 253 254 if(LOG_SUPPORT) 255 set(LIBRARIES ${LIBRARIES} log_lib) 256 add_library(log_lib MODULE lib/log.c) 257 set_target_properties(log_lib PROPERTIES OUTPUT_NAME log PREFIX "") 258 target_link_options(log_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 259 if(libubox) 260 find_path(ulog_include_dir NAMES libubox/ulog.h) 261 include_directories(${ulog_include_dir}) 262 target_link_libraries(log_lib ${libubox}) 263 set_target_properties(log_lib PROPERTIES COMPILE_DEFINITIONS HAVE_ULOG) 264 endif() 265 endif() 266 267 if(SOCKET_SUPPORT) 268 set(LIBRARIES ${LIBRARIES} socket_lib) 269 add_library(socket_lib MODULE lib/socket.c) 270 set_target_properties(socket_lib PROPERTIES OUTPUT_NAME socket PREFIX "") 271 target_link_options(socket_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS}) 272 endif() 273 274 if(UNIT_TESTING) 275 enable_testing() 276 add_definitions(-DUNIT_TESTING) 277 add_subdirectory(tests) 278 list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") 279 280 if(CMAKE_C_COMPILER_ID STREQUAL "Clang") 281 add_executable(ucode-san ${CLI_SOURCES} ${UCODE_SOURCES}) 282 set_property(TARGET ucode-san PROPERTY ENABLE_EXPORTS 1) 283 target_link_libraries(ucode-san ${JSONC_LINK_LIBRARIES}) 284 target_compile_options(ucode-san PRIVATE -g -fno-omit-frame-pointer -fsanitize=undefined,address,leak -fno-sanitize-recover=all) 285 target_link_options(ucode-san PRIVATE -fsanitize=undefined,address,leak) 286 endif() 287 endif() 288 289 install(TARGETS ucode RUNTIME DESTINATION bin) 290 install(TARGETS libucode LIBRARY DESTINATION lib) 291 install(TARGETS ${LIBRARIES} LIBRARY DESTINATION lib/ucode) 292 293 add_custom_target(utpl ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode utpl) 294 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/utpl DESTINATION bin) 295 296 if(COMPILE_SUPPORT) 297 add_custom_target(ucc ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode ucc) 298 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ucc DESTINATION bin) 299 endif() 300 301 file(GLOB UCODE_HEADERS "include/ucode/*.h") 302 install(FILES ${UCODE_HEADERS} DESTINATION include/ucode) 303 304 add_subdirectory(examples)
This page was automatically generated by LXR 0.3.1. • OpenWrt