#*******************************************************************************
#  Copyright (c) 2015, 2020 logi.cals GmbH and others
#
#  All rights reserved. This program and the accompanying materials
#  are made available under the terms of the Eclipse Public License v2.0
#  and Eclipse Distribution License v1.0 which accompany this distribution.
#
#  The Eclipse Public License is available at
#     https://www.eclipse.org/legal/epl-2.0/
#  and the Eclipse Distribution License is available at
#    http://www.eclipse.org/org/documents/edl-v10.php.
#
#  Contributors:
#     Rainer Poisel - initial version
#     Ian Craggs (IBM Corp.) - merge master
#     Ian Craggs - update for MQTTV5 support
#*******************************************************************************/

# Note: on OS X you should install XCode and the associated command-line tools

## compilation/linkage settings

CONFIGURE_FILE(VersionInfo.h.in
    ${CMAKE_BINARY_DIR}/VersionInfo.h
    @ONLY
    )

SET(common_src
  MQTTTime.c
  MQTTProtocolClient.c
  Clients.c
  utf-8.c
  MQTTPacket.c
  MQTTPacketOut.c
  Messages.c
  Tree.c
  Socket.c
  Log.c
  MQTTPersistence.c
  Thread.c
  MQTTProtocolOut.c
  MQTTPersistenceDefault.c
  SocketBuffer.c
  LinkedList.c
  MQTTProperties.c
  MQTTReasonCodes.c
  Base64.c
  SHA1.c
  WebSocket.c
)

IF (NOT PAHO_HIGH_PERFORMANCE)
  SET(common_src ${common_src}
    StackTrace.c
    Heap.c
    )
ENDIF()

IF (WIN32)
    SET(LIBS_SYSTEM ws2_32 crypt32 RpcRT4)
ELSEIF (UNIX)
    IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
        SET(LIBS_SYSTEM c dl pthread rt)
        # anl is only available with glibc so check if it is found before using
        # it or build will fail on uclibc or musl
        FIND_LIBRARY(LIB_ANL anl)
        IF(LIB_ANL)
            SET(LIBS_SYSTEM "${LIBS_SYSTEM} ${LIB_ANL}")
        ENDIF()
        ADD_DEFINITIONS(-D_GNU_SOURCE -fvisibility=hidden)
    ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Android")
        SET(LIBS_SYSTEM c dl)
    ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
        SET(LIBS_SYSTEM compat pthread)
    ELSE()
        SET(LIBS_SYSTEM c pthread)
    ENDIF()
ENDIF()

IF (PAHO_BUILD_SHARED)
# common compilation for libpaho-mqtt3c and libpaho-mqtt3a
ADD_LIBRARY(common_obj OBJECT ${common_src})
SET_TARGET_PROPERTIES(common_obj PROPERTIES
    POSITION_INDEPENDENT_CODE ON
    COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")
ADD_EXECUTABLE(MQTTVersion MQTTVersion.c)
SET_TARGET_PROPERTIES(MQTTVersion PROPERTIES
    POSITION_INDEPENDENT_CODE ON
    COMPILE_DEFINITIONS "PAHO_MQTT_IMPORTS=1")
ENDIF()

IF (PAHO_BUILD_STATIC)    
ADD_LIBRARY(common_obj_static OBJECT ${common_src})
SET_TARGET_PROPERTIES(common_obj_static PROPERTIES
    POSITION_INDEPENDENT_CODE ON
    COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")
ENDIF()

IF (PAHO_BUILD_SHARED)
    ADD_LIBRARY(paho-mqtt3c SHARED $<TARGET_OBJECTS:common_obj> MQTTClient.c)
    ADD_LIBRARY(paho-mqtt3a SHARED $<TARGET_OBJECTS:common_obj> MQTTAsync.c)
    
    TARGET_LINK_LIBRARIES(paho-mqtt3c ${LIBS_SYSTEM})
    TARGET_LINK_LIBRARIES(paho-mqtt3a ${LIBS_SYSTEM})
    TARGET_LINK_LIBRARIES(MQTTVersion paho-mqtt3a paho-mqtt3c ${LIBS_SYSTEM})
    
    SET_TARGET_PROPERTIES(
        paho-mqtt3c paho-mqtt3a PROPERTIES
        VERSION ${CLIENT_VERSION}
        SOVERSION ${PAHO_VERSION_MAJOR}
        COMPILE_DEFINITIONS "PAHO_MQTT_EXPORTS=1")

    IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
		SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
		SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
	ELSEIF (NOT WIN32)
		SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
		SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
	ENDIF()

    IF (NOT WIN32)
        SET_TARGET_PROPERTIES(
            paho-mqtt3c PROPERTIES
            LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
        SET_TARGET_PROPERTIES(
            paho-mqtt3a PROPERTIES
            LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
    ENDIF()

    FOREACH(TARGET paho-mqtt3c paho-mqtt3a)
        TARGET_INCLUDE_DIRECTORIES(${TARGET}
            PUBLIC
                $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
            PRIVATE
                ${CMAKE_BINARY_DIR})
    ENDFOREACH()
    
	INSTALL(TARGETS paho-mqtt3c paho-mqtt3a
		EXPORT eclipse-paho-mqtt-cTargets
		ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
		LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
		RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    INSTALL(TARGETS MQTTVersion
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
ENDIF()

IF (PAHO_BUILD_STATIC)
    ADD_LIBRARY(paho-mqtt3c-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTClient.c)
    ADD_LIBRARY(paho-mqtt3a-static STATIC $<TARGET_OBJECTS:common_obj_static> MQTTAsync.c)

    TARGET_LINK_LIBRARIES(paho-mqtt3c-static ${LIBS_SYSTEM})
    TARGET_LINK_LIBRARIES(paho-mqtt3a-static ${LIBS_SYSTEM})
    IF (NOT WIN32)
        SET_TARGET_PROPERTIES(paho-mqtt3c-static PROPERTIES OUTPUT_NAME paho-mqtt3c)
        SET_TARGET_PROPERTIES(paho-mqtt3a-static PROPERTIES OUTPUT_NAME paho-mqtt3a)
    ENDIF()       
    SET_TARGET_PROPERTIES(
        paho-mqtt3c-static paho-mqtt3a-static PROPERTIES
        VERSION ${CLIENT_VERSION}
        SOVERSION ${PAHO_VERSION_MAJOR}
        COMPILE_DEFINITIONS "PAHO_MQTT_STATIC=1")

    FOREACH(TARGET paho-mqtt3c-static paho-mqtt3a-static)
        TARGET_INCLUDE_DIRECTORIES(${TARGET}
            PUBLIC
                $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
            PRIVATE
                ${CMAKE_BINARY_DIR})
    ENDFOREACH()

    IF (NOT PAHO_BUILD_SHARED)
        INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
            EXPORT eclipse-paho-mqtt-cTargets
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    ELSE()
        INSTALL(TARGETS paho-mqtt3c-static paho-mqtt3a-static
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
    ENDIF()
ENDIF()

INSTALL(FILES MQTTAsync.h MQTTClient.h MQTTClientPersistence.h MQTTProperties.h MQTTReasonCodes.h MQTTSubscribeOpts.h MQTTExportDeclarations.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

IF (PAHO_WITH_SSL)
    SET(OPENSSL_ROOT_DIR "" CACHE PATH "Directory containing OpenSSL libraries and includes")
    find_package(OpenSSL REQUIRED)

    IF (PAHO_BUILD_SHARED)
        ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
    	## Note: SSL libraries must be recompiled due ifdefs
    	ADD_LIBRARY(common_ssl_obj OBJECT ${common_src})
    	TARGET_INCLUDE_DIRECTORIES(common_ssl_obj PUBLIC ${OPENSSL_INCLUDE_DIR})
    	SET_PROPERTY(TARGET common_ssl_obj PROPERTY	POSITION_INDEPENDENT_CODE ON)
    	SET_PROPERTY(TARGET common_ssl_obj PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")
    
        ADD_LIBRARY(paho-mqtt3cs SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTClient.c SSLSocket.c)
        ADD_LIBRARY(paho-mqtt3as SHARED $<TARGET_OBJECTS:common_ssl_obj> MQTTAsync.c SSLSocket.c)
    
        SET_TARGET_PROPERTIES(
            paho-mqtt3cs paho-mqtt3as PROPERTIES
            VERSION ${CLIENT_VERSION}
            SOVERSION ${PAHO_VERSION_MAJOR}
            COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_EXPORTS=1")

        IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
		    SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
		    SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
        ELSEIF (NOT WIN32)
            SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
		    SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
        ENDIF()

        IF (NOT WIN32)
            SET_TARGET_PROPERTIES(
	           paho-mqtt3cs PROPERTIES
	           LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
	        SET_TARGET_PROPERTIES(
	           paho-mqtt3as PROPERTIES
	           LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
        ENDIF()

        FOREACH(TARGET paho-mqtt3cs paho-mqtt3as)
            TARGET_INCLUDE_DIRECTORIES(${TARGET}
                PUBLIC
                    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
                    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                PRIVATE
                    ${CMAKE_BINARY_DIR})
            TARGET_LINK_LIBRARIES(${TARGET}
                PUBLIC
                    OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
        ENDFOREACH()
        INSTALL(TARGETS paho-mqtt3cs paho-mqtt3as
            EXPORT eclipse-paho-mqtt-cTargets
            ARCHIVE DESTINATION  ${CMAKE_INSTALL_LIBDIR}
            LIBRARY DESTINATION  ${CMAKE_INSTALL_LIBDIR}
            RUNTIME DESTINATION  ${CMAKE_INSTALL_BINDIR})
    ENDIF()

    IF (PAHO_BUILD_STATIC)
        ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as
    	## Note: SSL libraries must be recompiled due ifdefs
    	ADD_LIBRARY(common_ssl_obj_static OBJECT ${common_src})
    	TARGET_INCLUDE_DIRECTORIES(common_ssl_obj_static PUBLIC ${OPENSSL_INCLUDE_DIR})
    	SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY POSITION_INDEPENDENT_CODE ON)
    	SET_PROPERTY(TARGET common_ssl_obj_static PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
    
        ADD_LIBRARY(paho-mqtt3cs-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTClient.c SSLSocket.c)
        ADD_LIBRARY(paho-mqtt3as-static STATIC $<TARGET_OBJECTS:common_ssl_obj_static> MQTTAsync.c SSLSocket.c)

        SET_TARGET_PROPERTIES(
            paho-mqtt3cs-static paho-mqtt3as-static PROPERTIES
            VERSION ${CLIENT_VERSION}
            SOVERSION ${PAHO_VERSION_MAJOR}
            COMPILE_DEFINITIONS "OPENSSL=1;PAHO_MQTT_STATIC=1")
        IF (NOT WIN32)
            SET_TARGET_PROPERTIES(paho-mqtt3cs-static PROPERTIES OUTPUT_NAME paho-mqtt3cs)
            SET_TARGET_PROPERTIES(paho-mqtt3as-static PROPERTIES OUTPUT_NAME paho-mqtt3as)
        ENDIF()

	    IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
			SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init)
			SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init)
		ELSEIF (NOT WIN32)
			SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init)
			SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init)
		ENDIF()

		IF (NOT WIN32)
		    SET_TARGET_PROPERTIES(
	            paho-mqtt3cs-static PROPERTIES
	            LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}")
	        SET_TARGET_PROPERTIES(
	            paho-mqtt3as-static PROPERTIES
	            LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}")
	    ENDIF()

        IF (NOT PAHO_BUILD_SHARED)
            INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
                EXPORT eclipse-paho-mqtt-cTargets
                ARCHIVE DESTINATION  ${CMAKE_INSTALL_LIBDIR}
                LIBRARY DESTINATION  ${CMAKE_INSTALL_LIBDIR}
                RUNTIME DESTINATION  ${CMAKE_INSTALL_BINDIR})
        ELSE()
            INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static
                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
        ENDIF()
        FOREACH(TARGET paho-mqtt3cs-static paho-mqtt3as-static)
            TARGET_INCLUDE_DIRECTORIES(${TARGET}
                PUBLIC
                    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
                    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                PRIVATE
                    ${CMAKE_BINARY_DIR})
            TARGET_LINK_LIBRARIES(${TARGET}
                PUBLIC
                    OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM})
        ENDFOREACH()
    ENDIF()
ENDIF()

INSTALL(EXPORT eclipse-paho-mqtt-cTargets
    FILE eclipse-paho-mqtt-cConfig.cmake
    NAMESPACE eclipse-paho-mqtt-c::
    DESTINATION lib/cmake/eclipse-paho-mqtt-c)

INCLUDE(CMakePackageConfigHelpers)
WRITE_BASIC_PACKAGE_VERSION_FILE("eclipse-paho-mqtt-cConfigVersion.cmake"
    VERSION ${CLIENT_VERSION}
    COMPATIBILITY SameMajorVersion)
INSTALL(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/eclipse-paho-mqtt-cConfigVersion.cmake"
    DESTINATION lib/cmake/eclipse-paho-mqtt-c)

# Base64 test
ADD_EXECUTABLE( Base64Test EXCLUDE_FROM_ALL Base64.c Base64.h )
TARGET_COMPILE_DEFINITIONS( Base64Test PUBLIC "-DBASE64_TEST" )
IF (PAHO_WITH_SSL)
	ADD_EXECUTABLE( Base64TestOpenSSL EXCLUDE_FROM_ALL Base64.c Base64.h )
	TARGET_LINK_LIBRARIES( Base64TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
	TARGET_COMPILE_DEFINITIONS( Base64TestOpenSSL PUBLIC "-DBASE64_TEST -DOPENSSL=1" )
ENDIF (PAHO_WITH_SSL)

# SHA1 test
ADD_EXECUTABLE( Sha1Test EXCLUDE_FROM_ALL SHA1.c SHA1.h )
TARGET_COMPILE_DEFINITIONS( Sha1Test PUBLIC "-DSHA1_TEST" )
IF (PAHO_WITH_SSL)
	ADD_EXECUTABLE( Sha1TestOpenSSL EXCLUDE_FROM_ALL SHA1.c SHA1.h )
	TARGET_LINK_LIBRARIES( Sha1TestOpenSSL OpenSSL::SSL OpenSSL::Crypto)
	TARGET_COMPILE_DEFINITIONS( Sha1TestOpenSSL PUBLIC "-DSHA1_TEST -DOPENSSL=1" )
ENDIF (PAHO_WITH_SSL)
