CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

PROJECT(urpc C)

OPTION(URPC_ENABLE_SERIAL "Enable serial port devices support" ON)
OPTION(URPC_ENABLE_XINET "Enable network devices support via bindy/cryptopp" ON)

IF(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
    # It is required to build a rpath framework
    CMAKE_POLICY(SET CMP0042 NEW)
ENDIF()

ADD_LIBRARY(urpc urpc.c uri.c synchronizer.c)
CONFIGURE_FILE(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/generated/private/config.h)
TARGET_INCLUDE_DIRECTORIES(urpc PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/private)

INCLUDE(GenerateExportHeader)
GENERATE_EXPORT_HEADER(urpc EXPORT_MACRO_NAME URPC_API_EXPORT EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/generated/public/urpc_export.h)
# make available to all dependants
TARGET_INCLUDE_DIRECTORIES(urpc PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/generated/public)
# make available to all dev* submodules
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/generated/public)

IF(BUILD_SHARED_LIBS)
    SET_TARGET_PROPERTIES(urpc PROPERTIES C_VISIBILITY_PRESET hidden)
    SET_TARGET_PROPERTIES(urpc PROPERTIES CXX_VISIBILITY_PRESET hidden)
    SET_TARGET_PROPERTIES(urpc PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
ENDIF()

FUNCTION(ADD_SUBDIRECTORY_ZF_LOG)
    SET(BUILD_SHARED_LIBS OFF CACHE INTERNAL "")
    GET_DIRECTORY_PROPERTY(HAS_PARENT PARENT_DIRECTORY)
    IF(NOT HAS_PARENT)
        SET(ZF_LOG_LIBRARY_PREFIX "urpc_" CACHE INTERNAL "")
        SET(ZF_LOG_OPTIMIZE_SIZE ON CACHE INTERNAL "")
    ENDIF()
    ADD_SUBDIRECTORY(vendor/zf_log/zf_log)
ENDFUNCTION()
ADD_SUBDIRECTORY_ZF_LOG()
# Make zf_log.h available for all submodules
INCLUDE_DIRECTORIES(vendor/zf_log/zf_log)
TARGET_LINK_LIBRARIES(urpc PUBLIC zf_log)

FUNCTION(ADD_SUBDIRECTORY_TINYCTHREAD)
    SET(BUILD_SHARED_LIBS OFF CACHE INTERNAL "")
    SET(TINYCTHREAD_DISABLE_TESTS ON CACHE INTERNAL "")
    SET(TINYCTHREAD_INSTALL OFF CACHE INTERNAL "")
    ADD_SUBDIRECTORY(vendor/tinycthread)
ENDFUNCTION()
ADD_SUBDIRECTORY_TINYCTHREAD()
TARGET_INCLUDE_DIRECTORIES(urpc PRIVATE vendor/tinycthread/source)
TARGET_LINK_LIBRARIES(urpc PRIVATE tinycthread)

IF(URPC_ENABLE_SERIAL)
    ADD_SUBDIRECTORY(devserial)
    TARGET_LINK_LIBRARIES(urpc PRIVATE urpc-serial)
ENDIF()

IF(URPC_ENABLE_XINET)
    ADD_SUBDIRECTORY(devxinet)
    TARGET_LINK_LIBRARIES(urpc PRIVATE urpc-xinet)
ENDIF()
