19806b126SAzat Khuzhininclude(CMakeParseArguments)
29806b126SAzat Khuzhin
39806b126SAzat Khuzhinset(LIBEVENT_SHARED_LIBRARIES "")
49806b126SAzat Khuzhinset(LIBEVENT_STATIC_LIBRARIES "")
59806b126SAzat Khuzhin
69806b126SAzat Khuzhinmacro(set_event_shared_lib_flags LIB_NAME)
79806b126SAzat Khuzhin    set_target_properties("${LIB_NAME}_shared" PROPERTIES
89806b126SAzat Khuzhin        COMPILE_FLAGS ${ARGN})
99806b126SAzat Khuzhin    set_target_properties("${LIB_NAME}_shared" PROPERTIES
109806b126SAzat Khuzhin        LINK_FLAGS ${ARGN})
119806b126SAzat Khuzhinendmacro()
129806b126SAzat Khuzhin
139806b126SAzat Khuzhinmacro(generate_pkgconfig LIB_NAME)
149806b126SAzat Khuzhin    set(prefix      ${CMAKE_INSTALL_PREFIX})
159806b126SAzat Khuzhin    set(exec_prefix ${CMAKE_INSTALL_PREFIX})
169806b126SAzat Khuzhin    set(libdir      ${CMAKE_INSTALL_PREFIX}/lib)
179806b126SAzat Khuzhin    set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
189806b126SAzat Khuzhin
199806b126SAzat Khuzhin    set(VERSION ${EVENT_ABI_LIBVERSION})
209806b126SAzat Khuzhin
219806b126SAzat Khuzhin    set(LIBS         "")
229806b126SAzat Khuzhin    foreach (LIB ${LIB_PLATFORM})
23cc554d87SAzat Khuzhin        set(LIBS "${LIBS} -L${LIB}")
249806b126SAzat Khuzhin    endforeach()
259806b126SAzat Khuzhin
269806b126SAzat Khuzhin    set(OPENSSL_LIBS "")
279806b126SAzat Khuzhin    foreach(LIB ${OPENSSL_LIBRARIES})
28cc554d87SAzat Khuzhin        set(OPENSSL_LIBS "${OPENSSL_LIBS} -L${LIB}")
299806b126SAzat Khuzhin    endforeach()
309806b126SAzat Khuzhin
319806b126SAzat Khuzhin    configure_file("lib${LIB_NAME}.pc.in" "lib${LIB_NAME}.pc" @ONLY)
329806b126SAzat Khuzhin    install(
339806b126SAzat Khuzhin        FILES "${CMAKE_CURRENT_BINARY_DIR}/lib${LIB_NAME}.pc"
349806b126SAzat Khuzhin        DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig"
359806b126SAzat Khuzhin    )
369806b126SAzat Khuzhinendmacro()
379806b126SAzat Khuzhin
381c047618Syuangongji# LIB_NAME maybe event_core, event_extra, event_openssl, event_pthreads or event.
391c047618Syuangongji# Targets whose LIB_NAME is not 'event' should be exported and installed.
401c047618Syuangongjimacro(export_install_target TYPE LIB_NAME OUTER_INCLUDES)
411c047618Syuangongji    if("${LIB_NAME}" STREQUAL "event")
421c047618Syuangongji        install(TARGETS "${LIB_NAME}_${TYPE}"
431c047618Syuangongji            LIBRARY DESTINATION "lib" COMPONENT lib
441c047618Syuangongji            ARCHIVE DESTINATION "lib" COMPONENT lib
451c047618Syuangongji            RUNTIME DESTINATION "lib" COMPONENT lib
461c047618Syuangongji            COMPONENT dev
471c047618Syuangongji        )
481c047618Syuangongji    else()
491c047618Syuangongji        string(REPLACE "event_" "" PURE_NAME ${LIB_NAME})
501c047618Syuangongji        string(TOUPPER ${TYPE} UPPER_TYPE)
511c047618Syuangongji        list(APPEND LIBEVENT_${UPPER_TYPE}_LIBRARIES "${PURE_NAME}")
521c047618Syuangongji        set(OUTER_INCS)
531c047618Syuangongji        if (NOT "${OUTER_INCLUDES}" STREQUAL "NONE")
541c047618Syuangongji            set(OUTER_INCS ${OUTER_INCLUDES})
551c047618Syuangongji        endif()
561c047618Syuangongji        target_include_directories("${LIB_NAME}_${TYPE}"
571c047618Syuangongji            PUBLIC  "$<INSTALL_INTERFACE:include>"
581c047618Syuangongji                    "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
591c047618Syuangongji                    "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
601c047618Syuangongji                    ${OUTER_INCS}
611c047618Syuangongji        )
621c047618Syuangongji        set_target_properties("${LIB_NAME}_${TYPE}" PROPERTIES EXPORT_NAME ${PURE_NAME})
631c047618Syuangongji        export(TARGETS "${LIB_NAME}_${TYPE}"
641c047618Syuangongji            NAMESPACE ${PROJECT_NAME}::
651c047618Syuangongji            FILE "${PROJECT_BINARY_DIR}/LibeventTargets-${TYPE}.cmake"
661c047618Syuangongji            APPEND
671c047618Syuangongji        )
681c047618Syuangongji        install(TARGETS "${LIB_NAME}_${TYPE}"
691c047618Syuangongji            EXPORT LibeventTargets-${TYPE}
701c047618Syuangongji            LIBRARY DESTINATION "lib" COMPONENT lib
711c047618Syuangongji            ARCHIVE DESTINATION "lib" COMPONENT lib
721c047618Syuangongji            RUNTIME DESTINATION "lib" COMPONENT lib
731c047618Syuangongji            COMPONENT dev
741c047618Syuangongji        )
751c047618Syuangongji    endif()
761c047618Syuangongjiendmacro()
779806b126SAzat Khuzhin
789806b126SAzat Khuzhin# Global variables that it uses:
799806b126SAzat Khuzhin# - EVENT_ABI_LIBVERSION
80305251b9Syuangongji# - EVENT_ABI_LIBVERSION_CURRENT
81305251b9Syuangongji# - EVENT_ABI_LIBVERSION_REVISION
82305251b9Syuangongji# - EVENT_ABI_LIBVERSION_AGE
83305251b9Syuangongji# - EVENT_PACKAGE_RELEASE
849806b126SAzat Khuzhin# - CMAKE_THREAD_LIBS_INIT LIB_PLATFORM
859806b126SAzat Khuzhin# - OPENSSL_LIBRARIES
869806b126SAzat Khuzhin# - EVENT_SHARED_FLAGS
87eb10a738SAzat Khuzhin# - EVENT_LIBRARY_STATIC
88eb10a738SAzat Khuzhin# - EVENT_LIBRARY_SHARED
899806b126SAzat Khuzhin#
909806b126SAzat Khuzhin# Exported variables:
919806b126SAzat Khuzhin# - LIBEVENT_SHARED_LIBRARIES
929806b126SAzat Khuzhin# - LIBEVENT_STATIC_LIBRARIES
939806b126SAzat Khuzhinmacro(add_event_library LIB_NAME)
949806b126SAzat Khuzhin    cmake_parse_arguments(LIB
959806b126SAzat Khuzhin        "" # Options
969806b126SAzat Khuzhin        "VERSION" # One val
971c047618Syuangongji        "SOURCES;LIBRARIES;INNER_LIBRARIES;OUTER_INCLUDES" # Multi val
989806b126SAzat Khuzhin        ${ARGN}
999806b126SAzat Khuzhin    )
1009806b126SAzat Khuzhin
1011c047618Syuangongji    if ("${LIB_OUTER_INCLUDES}" STREQUAL "")
1021c047618Syuangongji        set(LIB_OUTER_INCLUDES NONE)
1031c047618Syuangongji    endif()
104eb10a738SAzat Khuzhin    set(ADD_EVENT_LIBRARY_INTERFACE)
105eb10a738SAzat Khuzhin
106eb10a738SAzat Khuzhin    if (${EVENT_LIBRARY_STATIC})
1079806b126SAzat Khuzhin        add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
108eb10a738SAzat Khuzhin        set_target_properties("${LIB_NAME}_static" PROPERTIES
109eb10a738SAzat Khuzhin            OUTPUT_NAME "${LIB_NAME}"
110eb10a738SAzat Khuzhin            CLEAN_DIRECT_OUTPUT 1)
111eb10a738SAzat Khuzhin
1121c047618Syuangongji        if(LIB_INNER_LIBRARIES)
1131c047618Syuangongji            set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_static")
1141c047618Syuangongji        endif()
1151c047618Syuangongji        target_link_libraries("${LIB_NAME}_static"
1161c047618Syuangongji            ${CMAKE_THREAD_LIBS_INIT}
1171c047618Syuangongji            ${LIB_PLATFORM}
1181c047618Syuangongji            ${INNER_LIBRARIES}
1191c047618Syuangongji            ${LIB_LIBRARIES})
1201c047618Syuangongji
1211c047618Syuangongji        export_install_target(static "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
122eb10a738SAzat Khuzhin
123eb10a738SAzat Khuzhin        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
124eb10a738SAzat Khuzhin    endif()
125eb10a738SAzat Khuzhin
126eb10a738SAzat Khuzhin    if (${EVENT_LIBRARY_SHARED})
1279806b126SAzat Khuzhin        add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
1289806b126SAzat Khuzhin
1291c047618Syuangongji        if(LIB_INNER_LIBRARIES)
1301c047618Syuangongji            set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_shared")
1311c047618Syuangongji        endif()
1329806b126SAzat Khuzhin        target_link_libraries("${LIB_NAME}_shared"
1339806b126SAzat Khuzhin            ${CMAKE_THREAD_LIBS_INIT}
1349806b126SAzat Khuzhin            ${LIB_PLATFORM}
1351c047618Syuangongji            ${INNER_LIBRARIES}
1369806b126SAzat Khuzhin            ${LIB_LIBRARIES})
1379806b126SAzat Khuzhin
1389806b126SAzat Khuzhin        if (EVENT_SHARED_FLAGS)
1399806b126SAzat Khuzhin            set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
1409806b126SAzat Khuzhin        endif()
1419806b126SAzat Khuzhin
142305251b9Syuangongji        if (WIN32)
143305251b9Syuangongji            set_target_properties(
144305251b9Syuangongji                "${LIB_NAME}_shared" PROPERTIES
1459806b126SAzat Khuzhin                OUTPUT_NAME "${LIB_NAME}"
146305251b9Syuangongji                SOVERSION ${EVENT_ABI_LIBVERSION})
147305251b9Syuangongji        elseif (APPLE)
148305251b9Syuangongji            math(EXPR COMPATIBILITY_VERSION "${EVENT_ABI_LIBVERSION_CURRENT}+1")
149305251b9Syuangongji            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
150305251b9Syuangongji            set_target_properties(
151305251b9Syuangongji                "${LIB_NAME}_shared" PROPERTIES
152305251b9Syuangongji                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
153305251b9Syuangongji                INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
154305251b9Syuangongji                LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
155305251b9Syuangongji        else()
156305251b9Syuangongji            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
157305251b9Syuangongji            set_target_properties(
158305251b9Syuangongji                "${LIB_NAME}_shared" PROPERTIES
159305251b9Syuangongji                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}"
160305251b9Syuangongji                VERSION "${CURRENT_MINUS_AGE}.${EVENT_ABI_LIBVERSION_AGE}.${EVENT_ABI_LIBVERSION_REVISION}"
161*813cc739Syuangongji                SOVERSION "${CURRENT_MINUS_AGE}"
162*813cc739Syuangongji                INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
163305251b9Syuangongji        endif()
164305251b9Syuangongji
165305251b9Syuangongji        if (NOT WIN32)
166305251b9Syuangongji            set(LIB_LINK_NAME
167305251b9Syuangongji                "${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
168305251b9Syuangongji
169305251b9Syuangongji            add_custom_command(TARGET ${LIB_NAME}_shared
170305251b9Syuangongji                POST_BUILD
171305251b9Syuangongji                COMMAND ${CMAKE_COMMAND} -E create_symlink
172305251b9Syuangongji                    "$<TARGET_FILE_NAME:${LIB_NAME}_shared>"
173305251b9Syuangongji                    "${LIB_LINK_NAME}"
17447eb8c12SAzat Khuzhin                WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
175305251b9Syuangongji        endif()
1769806b126SAzat Khuzhin
1771c047618Syuangongji        export_install_target(shared "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
178eb10a738SAzat Khuzhin
179eb10a738SAzat Khuzhin        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
180eb10a738SAzat Khuzhin
1811c047618Syuangongji        if (NOT WIN32)
182305251b9Syuangongji            install(FILES
183305251b9Syuangongji                "$<TARGET_FILE_DIR:${LIB_NAME}_shared>/${LIB_LINK_NAME}"
184305251b9Syuangongji                DESTINATION "lib"
185305251b9Syuangongji                COMPONENT lib)
186305251b9Syuangongji        endif()
1871c047618Syuangongji    endif()
1889806b126SAzat Khuzhin
189eb10a738SAzat Khuzhin    add_library(${LIB_NAME} INTERFACE)
190eb10a738SAzat Khuzhin    target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
1919806b126SAzat Khuzhin
1929806b126SAzat Khuzhin    generate_pkgconfig("${LIB_NAME}")
1939806b126SAzat Khuzhinendmacro()
194