• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/ucode/CMakeLists.txt

  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