summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt496
1 files changed, 248 insertions, 248 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9c2aead..820ae63 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,256 +2,256 @@ cmake_minimum_required(VERSION 3.13)
include(CheckFunctionExists)
include(CheckSymbolExists)
-PROJECT(ucode C)
-ADD_DEFINITIONS(-Os -Wall -Werror --std=gnu99 -ffunction-sections -fwrapv -D_GNU_SOURCE)
-
-IF(CMAKE_C_COMPILER_VERSION VERSION_GREATER 6)
- ADD_DEFINITIONS(-Wextra -Werror=implicit-function-declaration)
- ADD_DEFINITIONS(-Wformat -Werror=format-security -Werror=format-nonliteral)
-ENDIF()
-ADD_DEFINITIONS(-Wmissing-declarations -Wno-error=unused-variable -Wno-unused-parameter)
-
-INCLUDE_DIRECTORIES(include)
-
-OPTION(COMPILE_SUPPORT "Support compilation from source" ON)
-
-IF(NOT COMPILE_SUPPORT)
- ADD_DEFINITIONS(-DNO_COMPILE)
-ENDIF()
-
-OPTION(DEBUG_SUPPORT "Debug plugin support" ON)
-OPTION(FS_SUPPORT "Filesystem plugin support" ON)
-OPTION(MATH_SUPPORT "Math plugin support" ON)
-OPTION(UBUS_SUPPORT "Ubus plugin support" ON)
-OPTION(UCI_SUPPORT "UCI plugin support" ON)
-OPTION(RTNL_SUPPORT "Route Netlink plugin support" ${LINUX})
-OPTION(NL80211_SUPPORT "Wireless Netlink plugin support" ${LINUX})
-OPTION(RESOLV_SUPPORT "NS resolve plugin support" ON)
-OPTION(STRUCT_SUPPORT "Struct plugin support" ON)
-OPTION(ULOOP_SUPPORT "Uloop plugin support" ON)
-
-SET(LIB_SEARCH_PATH "${CMAKE_INSTALL_PREFIX}/lib/ucode/*.so:${CMAKE_INSTALL_PREFIX}/share/ucode/*.uc:./*.so:./*.uc" CACHE STRING "Default library search path")
-STRING(REPLACE ":" "\", \"" LIB_SEARCH_DEFINE "${LIB_SEARCH_PATH}")
-ADD_DEFINITIONS(-DLIB_SEARCH_PATH="${LIB_SEARCH_DEFINE}")
-
-IF(APPLE)
- SET(UCODE_MODULE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
- ADD_DEFINITIONS(-DBIND_8_COMPAT)
-ELSE()
- SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-Wl,--gc-sections")
-ENDIF()
-
-IF(DEBUG)
- ADD_DEFINITIONS(-DDEBUG -g3 -O0)
-ELSE()
- ADD_DEFINITIONS(-DNDEBUG)
-ENDIF()
-
-INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(JSONC REQUIRED json-c)
-INCLUDE_DIRECTORIES(${JSONC_INCLUDE_DIRS})
-
-SET(UCODE_SOURCES lexer.c lib.c vm.c chunk.c vallist.c compiler.c source.c types.c program.c platform.c)
-ADD_LIBRARY(libucode SHARED ${UCODE_SOURCES})
-SET(SOVERSION 0 CACHE STRING "Override ucode library version")
-SET_TARGET_PROPERTIES(libucode PROPERTIES OUTPUT_NAME ucode SOVERSION ${SOVERSION})
-TARGET_LINK_LIBRARIES(libucode ${JSONC_LINK_LIBRARIES})
-
-SET(CLI_SOURCES main.c)
-ADD_EXECUTABLE(ucode ${CLI_SOURCES})
-TARGET_LINK_LIBRARIES(ucode libucode ${JSONC_LINK_LIBRARIES})
-
-CHECK_FUNCTION_EXISTS(dlopen DLOPEN_FUNCTION_EXISTS)
-IF (NOT DLOPEN_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(libucode dl)
-ENDIF()
-
-CHECK_FUNCTION_EXISTS(fmod FMOD_FUNCTION_EXISTS)
-IF (NOT FMOD_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(libucode m)
-ENDIF()
-
-SET(CMAKE_REQUIRED_INCLUDES ${JSONC_INCLUDE_DIRS})
-SET(CMAKE_REQUIRED_LIBRARIES ${JSONC_LINK_LIBRARIES})
-CHECK_SYMBOL_EXISTS(json_tokener_get_parse_end "json-c/json.h" HAVE_PARSE_END)
-IF(HAVE_PARSE_END)
- ADD_DEFINITIONS(-DHAVE_PARSE_END)
-ENDIF()
-CHECK_SYMBOL_EXISTS(json_object_new_array_ext "json-c/json.h" HAVE_ARRAY_EXT)
-IF(HAVE_ARRAY_EXT)
- ADD_DEFINITIONS(-DHAVE_ARRAY_EXT)
-ENDIF()
-CHECK_SYMBOL_EXISTS(json_object_new_uint64 "json-c/json.h" HAVE_JSON_UINT64)
-IF(HAVE_JSON_UINT64)
- ADD_DEFINITIONS(-DHAVE_JSON_UINT64)
-ENDIF()
-UNSET(CMAKE_REQUIRED_INCLUDES)
-UNSET(CMAKE_REQUIRED_LIBRARIES)
-
-SET(LIBRARIES "")
-
-IF(DEBUG_SUPPORT)
- SET(LIBRARIES ${LIBRARIES} debug_lib)
- ADD_LIBRARY(debug_lib MODULE lib/debug.c)
- SET_TARGET_PROPERTIES(debug_lib PROPERTIES OUTPUT_NAME debug PREFIX "")
- TARGET_LINK_OPTIONS(debug_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- FIND_LIBRARY(ubox NAMES ubox)
- IF(ubox)
- FIND_PATH(uloop_include_dir NAMES libubox/uloop.h)
- INCLUDE_DIRECTORIES(${uloop_include_dir})
- TARGET_LINK_LIBRARIES(debug_lib ${ubox} ${libucode})
- SET_TARGET_PROPERTIES(debug_lib PROPERTIES COMPILE_DEFINITIONS HAVE_ULOOP)
- ENDIF()
-ENDIF()
-
-IF(FS_SUPPORT)
- SET(LIBRARIES ${LIBRARIES} fs_lib)
- ADD_LIBRARY(fs_lib MODULE lib/fs.c)
- SET_TARGET_PROPERTIES(fs_lib PROPERTIES OUTPUT_NAME fs PREFIX "")
- TARGET_LINK_OPTIONS(fs_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
-ENDIF()
-
-IF(MATH_SUPPORT)
- SET(LIBRARIES ${LIBRARIES} math_lib)
- ADD_LIBRARY(math_lib MODULE lib/math.c)
- SET_TARGET_PROPERTIES(math_lib PROPERTIES OUTPUT_NAME math PREFIX "")
- TARGET_LINK_OPTIONS(math_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- CHECK_FUNCTION_EXISTS(ceil CEIL_FUNCTION_EXISTS)
- IF (NOT CEIL_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(math_lib m)
- ENDIF()
-ENDIF()
-
-IF(UBUS_SUPPORT)
- FIND_LIBRARY(ubus NAMES ubus)
- FIND_LIBRARY(blobmsg_json NAMES blobmsg_json)
- FIND_PATH(ubus_include_dir NAMES libubus.h)
- INCLUDE_DIRECTORIES(${ubus_include_dir})
- SET(LIBRARIES ${LIBRARIES} ubus_lib)
- ADD_LIBRARY(ubus_lib MODULE lib/ubus.c)
- SET_TARGET_PROPERTIES(ubus_lib PROPERTIES OUTPUT_NAME ubus PREFIX "")
- TARGET_LINK_OPTIONS(ubus_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- TARGET_LINK_LIBRARIES(ubus_lib ${ubus} ${blobmsg_json})
- FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c" "
+project(ucode C)
+add_definitions(-Os -Wall -Werror --std=gnu99 -ffunction-sections -fwrapv -D_GNU_SOURCE)
+
+if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 6)
+ add_definitions(-Wextra -Werror=implicit-function-declaration)
+ add_definitions(-Wformat -Werror=format-security -Werror=format-nonliteral)
+endif()
+add_definitions(-Wmissing-declarations -Wno-error=unused-variable -Wno-unused-parameter)
+
+include_directories(include)
+
+option(COMPILE_SUPPORT "Support compilation from source" ON)
+
+if(NOT COMPILE_SUPPORT)
+ add_definitions(-DNO_COMPILE)
+endif()
+
+option(DEBUG_SUPPORT "Debug plugin support" ON)
+option(FS_SUPPORT "Filesystem plugin support" ON)
+option(MATH_SUPPORT "Math plugin support" ON)
+option(UBUS_SUPPORT "Ubus plugin support" ON)
+option(UCI_SUPPORT "UCI plugin support" ON)
+option(RTNL_SUPPORT "Route Netlink plugin support" ${LINUX})
+option(NL80211_SUPPORT "Wireless Netlink plugin support" ${LINUX})
+option(RESOLV_SUPPORT "NS resolve plugin support" ON)
+option(STRUCT_SUPPORT "Struct plugin support" ON)
+option(ULOOP_SUPPORT "Uloop plugin support" ON)
+
+set(LIB_SEARCH_PATH "${CMAKE_INSTALL_PREFIX}/lib/ucode/*.so:${CMAKE_INSTALL_PREFIX}/share/ucode/*.uc:./*.so:./*.uc" CACHE STRING "Default library search path")
+string(REPLACE ":" "\", \"" LIB_SEARCH_DEFINE "${LIB_SEARCH_PATH}")
+add_definitions(-DLIB_SEARCH_PATH="${LIB_SEARCH_DEFINE}")
+
+if(APPLE)
+ set(UCODE_MODULE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
+ add_definitions(-DBIND_8_COMPAT)
+else()
+ set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-Wl,--gc-sections")
+endif()
+
+if(DEBUG)
+ add_definitions(-DDEBUG -g3 -O0)
+else()
+ add_definitions(-DNDEBUG)
+endif()
+
+include(FindPkgConfig)
+pkg_check_modules(JSONC REQUIRED json-c)
+include_directories(${JSONC_INCLUDE_DIRS})
+
+set(UCODE_SOURCES lexer.c lib.c vm.c chunk.c vallist.c compiler.c source.c types.c program.c platform.c)
+add_library(libucode SHARED ${UCODE_SOURCES})
+set(SOVERSION 0 CACHE STRING "Override ucode library version")
+set_target_properties(libucode PROPERTIES OUTPUT_NAME ucode SOVERSION ${SOVERSION})
+target_link_libraries(libucode ${JSONC_LINK_LIBRARIES})
+
+set(CLI_SOURCES main.c)
+add_executable(ucode ${CLI_SOURCES})
+target_link_libraries(ucode libucode ${JSONC_LINK_LIBRARIES})
+
+check_function_exists(dlopen DLOPEN_FUNCTION_EXISTS)
+if(NOT DLOPEN_FUNCTION_EXISTS)
+ target_link_libraries(libucode dl)
+endif()
+
+check_function_exists(fmod FMOD_FUNCTION_EXISTS)
+if(NOT FMOD_FUNCTION_EXISTS)
+ target_link_libraries(libucode m)
+endif()
+
+set(CMAKE_REQUIRED_INCLUDES ${JSONC_INCLUDE_DIRS})
+set(CMAKE_REQUIRED_LIBRARIES ${JSONC_LINK_LIBRARIES})
+check_symbol_exists(json_tokener_get_parse_end "json-c/json.h" HAVE_PARSE_END)
+if(HAVE_PARSE_END)
+ add_definitions(-DHAVE_PARSE_END)
+endif()
+check_symbol_exists(json_object_new_array_ext "json-c/json.h" HAVE_ARRAY_EXT)
+if(HAVE_ARRAY_EXT)
+ add_definitions(-DHAVE_ARRAY_EXT)
+endif()
+check_symbol_exists(json_object_new_uint64 "json-c/json.h" HAVE_JSON_UINT64)
+if(HAVE_JSON_UINT64)
+ add_definitions(-DHAVE_JSON_UINT64)
+endif()
+unset(CMAKE_REQUIRED_INCLUDES)
+unset(CMAKE_REQUIRED_LIBRARIES)
+
+set(LIBRARIES "")
+
+if(DEBUG_SUPPORT)
+ set(LIBRARIES ${LIBRARIES} debug_lib)
+ add_library(debug_lib MODULE lib/debug.c)
+ set_target_properties(debug_lib PROPERTIES OUTPUT_NAME debug PREFIX "")
+ target_link_options(debug_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ find_library(ubox NAMES ubox)
+ if(ubox)
+ find_path(uloop_include_dir NAMES libubox/uloop.h)
+ include_directories(${uloop_include_dir})
+ target_link_libraries(debug_lib ${ubox} ${libucode})
+ set_target_properties(debug_lib PROPERTIES COMPILE_DEFINITIONS HAVE_ULOOP)
+ endif()
+endif()
+
+if(FS_SUPPORT)
+ set(LIBRARIES ${LIBRARIES} fs_lib)
+ add_library(fs_lib MODULE lib/fs.c)
+ set_target_properties(fs_lib PROPERTIES OUTPUT_NAME fs PREFIX "")
+ target_link_options(fs_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+endif()
+
+if(MATH_SUPPORT)
+ set(LIBRARIES ${LIBRARIES} math_lib)
+ add_library(math_lib MODULE lib/math.c)
+ set_target_properties(math_lib PROPERTIES OUTPUT_NAME math PREFIX "")
+ target_link_options(math_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ check_function_exists(ceil CEIL_FUNCTION_EXISTS)
+ if(NOT CEIL_FUNCTION_EXISTS)
+ target_link_libraries(math_lib m)
+ endif()
+endif()
+
+if(UBUS_SUPPORT)
+ find_library(ubus NAMES ubus)
+ find_library(blobmsg_json NAMES blobmsg_json)
+ find_path(ubus_include_dir NAMES libubus.h)
+ include_directories(${ubus_include_dir})
+ set(LIBRARIES ${LIBRARIES} ubus_lib)
+ add_library(ubus_lib MODULE lib/ubus.c)
+ set_target_properties(ubus_lib PROPERTIES OUTPUT_NAME ubus PREFIX "")
+ target_link_options(ubus_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ target_link_libraries(ubus_lib ${ubus} ${blobmsg_json})
+ file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c" "
#include <libubus.h>
int main() { return UBUS_STATUS_NO_MEMORY; }
")
- TRY_COMPILE(HAVE_NEW_UBUS_STATUS_CODES
+ try_compile(HAVE_NEW_UBUS_STATUS_CODES
${CMAKE_BINARY_DIR}
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c")
- IF(HAVE_NEW_UBUS_STATUS_CODES)
- ADD_DEFINITIONS(-DHAVE_NEW_UBUS_STATUS_CODES)
- ENDIF()
-ENDIF()
-
-IF(UCI_SUPPORT)
- FIND_LIBRARY(uci NAMES uci)
- FIND_LIBRARY(ubox NAMES ubox)
- FIND_PATH(uci_include_dir uci.h)
- INCLUDE_DIRECTORIES(${uci_include_dir})
- SET(LIBRARIES ${LIBRARIES} uci_lib)
- ADD_LIBRARY(uci_lib MODULE lib/uci.c)
- SET_TARGET_PROPERTIES(uci_lib PROPERTIES OUTPUT_NAME uci PREFIX "")
- TARGET_LINK_OPTIONS(uci_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- TARGET_LINK_LIBRARIES(uci_lib ${uci} ${ubox})
-ENDIF()
-
-IF(RTNL_SUPPORT)
- FIND_LIBRARY(nl NAMES nl-tiny)
- FIND_LIBRARY(ubox NAMES ubox)
- FIND_PATH(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny)
- INCLUDE_DIRECTORIES(${nl_include_dir})
- SET(LIBRARIES ${LIBRARIES} rtnl_lib)
- ADD_LIBRARY(rtnl_lib MODULE lib/rtnl.c)
- SET_TARGET_PROPERTIES(rtnl_lib PROPERTIES OUTPUT_NAME rtnl PREFIX "")
- TARGET_LINK_OPTIONS(rtnl_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- TARGET_LINK_LIBRARIES(rtnl_lib ${nl} ${ubox})
-ENDIF()
-
-IF(NL80211_SUPPORT)
- FIND_LIBRARY(nl NAMES nl-tiny)
- FIND_LIBRARY(ubox NAMES ubox)
- FIND_PATH(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny)
- INCLUDE_DIRECTORIES(${nl_include_dir})
- SET(LIBRARIES ${LIBRARIES} nl80211_lib)
- ADD_LIBRARY(nl80211_lib MODULE lib/nl80211.c)
- SET_TARGET_PROPERTIES(nl80211_lib PROPERTIES OUTPUT_NAME nl80211 PREFIX "")
- TARGET_LINK_OPTIONS(nl80211_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- TARGET_LINK_LIBRARIES(nl80211_lib ${nl} ${ubox})
-ENDIF()
-
-IF(RESOLV_SUPPORT)
- SET(LIBRARIES ${LIBRARIES} resolv_lib)
- ADD_LIBRARY(resolv_lib MODULE lib/resolv.c)
- SET_TARGET_PROPERTIES(resolv_lib PROPERTIES OUTPUT_NAME resolv PREFIX "")
- TARGET_LINK_OPTIONS(resolv_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- CHECK_FUNCTION_EXISTS(res_mkquery RES_MKQUERY_FUNCTION_EXISTS)
- CHECK_FUNCTION_EXISTS(ns_initparse NS_INITARSE_FUNCTION_EXISTS)
- CHECK_FUNCTION_EXISTS(clock_gettime CLOCK_GETTIME_FUNCTION_EXISTS)
- IF (NOT RES_MKQUERY_FUNCTION_EXISTS OR NOT NS_INITARSE_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(resolv_lib resolv)
- ENDIF()
- IF (NOT CLOCK_GETTIME_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(resolv_lib rt)
- ENDIF()
-ENDIF()
-
-IF(STRUCT_SUPPORT)
- SET(LIBRARIES ${LIBRARIES} struct_lib)
- ADD_LIBRARY(struct_lib MODULE lib/struct.c)
- SET_TARGET_PROPERTIES(struct_lib PROPERTIES OUTPUT_NAME struct PREFIX "")
- TARGET_LINK_OPTIONS(struct_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- CHECK_FUNCTION_EXISTS(frexp FREXP_FUNCTION_EXISTS)
- IF (NOT FREXP_FUNCTION_EXISTS)
- TARGET_LINK_LIBRARIES(struct_lib m)
- ENDIF()
-ENDIF()
-
-IF(ULOOP_SUPPORT)
- FIND_LIBRARY(ubox NAMES ubox)
- FIND_PATH(uloop_include_dir NAMES libubox/uloop.h)
- INCLUDE_DIRECTORIES(${uloop_include_dir})
- SET(LIBRARIES ${LIBRARIES} uloop_lib)
- ADD_LIBRARY(uloop_lib MODULE lib/uloop.c)
- SET_TARGET_PROPERTIES(uloop_lib PROPERTIES OUTPUT_NAME uloop PREFIX "")
- TARGET_LINK_OPTIONS(uloop_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
- SET(CMAKE_REQUIRED_LIBRARIES ${ubox})
- CHECK_FUNCTION_EXISTS(uloop_timeout_remaining64 REMAINING64_FUNCTION_EXISTS)
- UNSET(CMAKE_REQUIRED_LIBRARIES)
- IF (REMAINING64_FUNCTION_EXISTS)
- TARGET_COMPILE_DEFINITIONS(uloop_lib PUBLIC HAVE_ULOOP_TIMEOUT_REMAINING64)
- ENDIF()
- TARGET_LINK_LIBRARIES(uloop_lib ${ubox})
-ENDIF()
-
-IF(UNIT_TESTING)
- ENABLE_TESTING()
- ADD_DEFINITIONS(-DUNIT_TESTING)
- ADD_SUBDIRECTORY(tests)
- LIST(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
-
- IF(CMAKE_C_COMPILER_ID STREQUAL "Clang")
- ADD_EXECUTABLE(ucode-san ${CLI_SOURCES} ${UCODE_SOURCES})
- SET_PROPERTY(TARGET ucode-san PROPERTY ENABLE_EXPORTS 1)
- TARGET_LINK_LIBRARIES(ucode-san ${JSONC_LINK_LIBRARIES})
- TARGET_COMPILE_OPTIONS(ucode-san PRIVATE -g -fno-omit-frame-pointer -fsanitize=undefined,address,leak -fno-sanitize-recover=all)
- TARGET_LINK_OPTIONS(ucode-san PRIVATE -fsanitize=undefined,address,leak)
- ENDIF()
-ENDIF()
-
-INSTALL(TARGETS ucode RUNTIME DESTINATION bin)
-INSTALL(TARGETS libucode LIBRARY DESTINATION lib)
-INSTALL(TARGETS ${LIBRARIES} LIBRARY DESTINATION lib/ucode)
-
-ADD_CUSTOM_TARGET(utpl ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode utpl)
-INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/utpl DESTINATION bin)
-
-IF(COMPILE_SUPPORT)
- ADD_CUSTOM_TARGET(ucc ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode ucc)
- INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/ucc DESTINATION bin)
-ENDIF()
-
-FILE(GLOB UCODE_HEADERS "include/ucode/*.h")
-INSTALL(FILES ${UCODE_HEADERS} DESTINATION include/ucode)
-
-ADD_SUBDIRECTORY(examples)
+ if(HAVE_NEW_UBUS_STATUS_CODES)
+ add_definitions(-DHAVE_NEW_UBUS_STATUS_CODES)
+ endif()
+endif()
+
+if(UCI_SUPPORT)
+ find_library(uci NAMES uci)
+ find_library(ubox NAMES ubox)
+ find_path(uci_include_dir uci.h)
+ include_directories(${uci_include_dir})
+ set(LIBRARIES ${LIBRARIES} uci_lib)
+ add_library(uci_lib MODULE lib/uci.c)
+ set_target_properties(uci_lib PROPERTIES OUTPUT_NAME uci PREFIX "")
+ target_link_options(uci_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ target_link_libraries(uci_lib ${uci} ${ubox})
+endif()
+
+if(RTNL_SUPPORT)
+ find_library(nl NAMES nl-tiny)
+ find_library(ubox NAMES ubox)
+ find_path(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny)
+ include_directories(${nl_include_dir})
+ set(LIBRARIES ${LIBRARIES} rtnl_lib)
+ add_library(rtnl_lib MODULE lib/rtnl.c)
+ set_target_properties(rtnl_lib PROPERTIES OUTPUT_NAME rtnl PREFIX "")
+ target_link_options(rtnl_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ target_link_libraries(rtnl_lib ${nl} ${ubox})
+endif()
+
+if(NL80211_SUPPORT)
+ find_library(nl NAMES nl-tiny)
+ find_library(ubox NAMES ubox)
+ find_path(nl_include_dir NAMES netlink/msg.h PATH_SUFFIXES libnl-tiny)
+ include_directories(${nl_include_dir})
+ set(LIBRARIES ${LIBRARIES} nl80211_lib)
+ add_library(nl80211_lib MODULE lib/nl80211.c)
+ set_target_properties(nl80211_lib PROPERTIES OUTPUT_NAME nl80211 PREFIX "")
+ target_link_options(nl80211_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ target_link_libraries(nl80211_lib ${nl} ${ubox})
+endif()
+
+if(RESOLV_SUPPORT)
+ set(LIBRARIES ${LIBRARIES} resolv_lib)
+ add_library(resolv_lib MODULE lib/resolv.c)
+ set_target_properties(resolv_lib PROPERTIES OUTPUT_NAME resolv PREFIX "")
+ target_link_options(resolv_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ check_function_exists(res_mkquery RES_MKQUERY_FUNCTION_EXISTS)
+ check_function_exists(ns_initparse NS_INITARSE_FUNCTION_EXISTS)
+ check_function_exists(clock_gettime CLOCK_GETTIME_FUNCTION_EXISTS)
+ if(NOT RES_MKQUERY_FUNCTION_EXISTS OR NOT NS_INITARSE_FUNCTION_EXISTS)
+ target_link_libraries(resolv_lib resolv)
+ endif()
+ if(NOT CLOCK_GETTIME_FUNCTION_EXISTS)
+ target_link_libraries(resolv_lib rt)
+ endif()
+endif()
+
+if(STRUCT_SUPPORT)
+ set(LIBRARIES ${LIBRARIES} struct_lib)
+ add_library(struct_lib MODULE lib/struct.c)
+ set_target_properties(struct_lib PROPERTIES OUTPUT_NAME struct PREFIX "")
+ target_link_options(struct_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ check_function_exists(frexp FREXP_FUNCTION_EXISTS)
+ if(NOT FREXP_FUNCTION_EXISTS)
+ target_link_libraries(struct_lib m)
+ endif()
+endif()
+
+if(ULOOP_SUPPORT)
+ find_library(ubox NAMES ubox)
+ find_path(uloop_include_dir NAMES libubox/uloop.h)
+ include_directories(${uloop_include_dir})
+ set(LIBRARIES ${LIBRARIES} uloop_lib)
+ add_library(uloop_lib MODULE lib/uloop.c)
+ set_target_properties(uloop_lib PROPERTIES OUTPUT_NAME uloop PREFIX "")
+ target_link_options(uloop_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
+ set(CMAKE_REQUIRED_LIBRARIES ${ubox})
+ check_function_exists(uloop_timeout_remaining64 REMAINING64_FUNCTION_EXISTS)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+ if(REMAINING64_FUNCTION_EXISTS)
+ target_compile_definitions(uloop_lib PUBLIC HAVE_ULOOP_TIMEOUT_REMAINING64)
+ endif()
+ target_link_libraries(uloop_lib ${ubox})
+endif()
+
+if(UNIT_TESTING)
+ enable_testing()
+ add_definitions(-DUNIT_TESTING)
+ add_subdirectory(tests)
+ list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
+
+ if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ add_executable(ucode-san ${CLI_SOURCES} ${UCODE_SOURCES})
+ set_property(TARGET ucode-san PROPERTY ENABLE_EXPORTS 1)
+ target_link_libraries(ucode-san ${JSONC_LINK_LIBRARIES})
+ target_compile_options(ucode-san PRIVATE -g -fno-omit-frame-pointer -fsanitize=undefined,address,leak -fno-sanitize-recover=all)
+ target_link_options(ucode-san PRIVATE -fsanitize=undefined,address,leak)
+ endif()
+endif()
+
+install(TARGETS ucode RUNTIME DESTINATION bin)
+install(TARGETS libucode LIBRARY DESTINATION lib)
+install(TARGETS ${LIBRARIES} LIBRARY DESTINATION lib/ucode)
+
+add_custom_target(utpl ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode utpl)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/utpl DESTINATION bin)
+
+if(COMPILE_SUPPORT)
+ add_custom_target(ucc ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ucode ucc)
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ucc DESTINATION bin)
+endif()
+
+file(GLOB UCODE_HEADERS "include/ucode/*.h")
+install(FILES ${UCODE_HEADERS} DESTINATION include/ucode)
+
+add_subdirectory(examples)