1include(CMakeParseArguments)
2
3set(LIBEVENT_SHARED_LIBRARIES "")
4set(LIBEVENT_STATIC_LIBRARIES "")
5
6macro(set_event_shared_lib_flags LIB_NAME)
7    set_target_properties("${LIB_NAME}_shared" PROPERTIES
8        COMPILE_FLAGS ${ARGN})
9    set_target_properties("${LIB_NAME}_shared" PROPERTIES
10        LINK_FLAGS ${ARGN})
11endmacro()
12
13macro(generate_pkgconfig LIB_NAME)
14    set(prefix      ${CMAKE_INSTALL_PREFIX})
15    set(exec_prefix ${CMAKE_INSTALL_PREFIX})
16    set(libdir      ${CMAKE_INSTALL_PREFIX}/lib)
17    set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
18
19    set(VERSION ${EVENT_ABI_LIBVERSION})
20
21    set(LIBS         "")
22    foreach (LIB ${LIB_PLATFORM})
23        set(LIBS "${LIBS} -L${LIB}")
24    endforeach()
25
26    set(OPENSSL_LIBS "")
27    foreach(LIB ${OPENSSL_LIBRARIES})
28        set(OPENSSL_LIBS "${OPENSSL_LIBS} -L${LIB}")
29    endforeach()
30
31    configure_file("lib${LIB_NAME}.pc.in" "lib${LIB_NAME}.pc" @ONLY)
32    install(
33        FILES "${CMAKE_CURRENT_BINARY_DIR}/lib${LIB_NAME}.pc"
34        DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig"
35    )
36endmacro()
37
38
39# Global variables that it uses:
40# - EVENT_ABI_LIBVERSION
41# - EVENT_ABI_LIBVERSION_CURRENT
42# - EVENT_ABI_LIBVERSION_REVISION
43# - EVENT_ABI_LIBVERSION_AGE
44# - EVENT_PACKAGE_RELEASE
45# - CMAKE_THREAD_LIBS_INIT LIB_PLATFORM
46# - OPENSSL_LIBRARIES
47# - EVENT_SHARED_FLAGS
48# - EVENT_LIBRARY_STATIC
49# - EVENT_LIBRARY_SHARED
50#
51# Exported variables:
52# - LIBEVENT_SHARED_LIBRARIES
53# - LIBEVENT_STATIC_LIBRARIES
54macro(add_event_library LIB_NAME)
55    cmake_parse_arguments(LIB
56        "" # Options
57        "VERSION" # One val
58        "SOURCES;LIBRARIES" # Multi val
59        ${ARGN}
60    )
61
62    set(ADD_EVENT_LIBRARY_TARGETS)
63    set(ADD_EVENT_LIBRARY_INTERFACE)
64
65    if (${EVENT_LIBRARY_STATIC})
66        add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
67        set_target_properties("${LIB_NAME}_static" PROPERTIES
68            OUTPUT_NAME "${LIB_NAME}"
69            CLEAN_DIRECT_OUTPUT 1)
70
71        list(APPEND LIBEVENT_STATIC_LIBRARIES "${LIB_NAME}_static")
72        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_static")
73
74        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
75    endif()
76
77    if (${EVENT_LIBRARY_SHARED})
78        add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
79
80        target_link_libraries("${LIB_NAME}_shared"
81            ${CMAKE_THREAD_LIBS_INIT}
82            ${LIB_PLATFORM}
83            ${LIB_LIBRARIES})
84
85        if (EVENT_SHARED_FLAGS)
86            set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
87        endif()
88
89        if (WIN32)
90            set_target_properties(
91                "${LIB_NAME}_shared" PROPERTIES
92                OUTPUT_NAME "${LIB_NAME}"
93                SOVERSION ${EVENT_ABI_LIBVERSION})
94        elseif (APPLE)
95            math(EXPR COMPATIBILITY_VERSION "${EVENT_ABI_LIBVERSION_CURRENT}+1")
96            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
97            set_target_properties(
98                "${LIB_NAME}_shared" PROPERTIES
99                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
100                INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
101                LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
102        else()
103            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
104            set_target_properties(
105                "${LIB_NAME}_shared" PROPERTIES
106                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}"
107                VERSION "${CURRENT_MINUS_AGE}.${EVENT_ABI_LIBVERSION_AGE}.${EVENT_ABI_LIBVERSION_REVISION}"
108                SOVERSION "${CURRENT_MINUS_AGE}")
109        endif()
110
111        if (NOT WIN32)
112            set(LIB_LINK_NAME
113                "${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
114
115            add_custom_command(TARGET ${LIB_NAME}_shared
116                POST_BUILD
117                COMMAND ${CMAKE_COMMAND} -E create_symlink
118                    "$<TARGET_FILE_NAME:${LIB_NAME}_shared>"
119                    "${LIB_LINK_NAME}"
120                WORKING_DIRECTORY "lib")
121        endif()
122
123        list(APPEND LIBEVENT_SHARED_LIBRARIES "${LIB_NAME}_shared")
124        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_shared")
125
126        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
127    endif()
128
129    export(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
130       FILE "${PROJECT_BINARY_DIR}/LibeventTargets.cmake"
131       APPEND
132    )
133
134    install(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
135        EXPORT LibeventTargets
136        LIBRARY DESTINATION "lib" COMPONENT lib
137        ARCHIVE DESTINATION "lib" COMPONENT lib
138        RUNTIME DESTINATION "lib" COMPONENT lib
139        COMPONENT dev
140    )
141    if (NOT WIN32 AND ${EVENT_LIBRARY_SHARED})
142        install(FILES
143            "$<TARGET_FILE_DIR:${LIB_NAME}_shared>/${LIB_LINK_NAME}"
144            DESTINATION "lib"
145            COMPONENT lib)
146    endif()
147
148    add_library(${LIB_NAME} INTERFACE)
149    target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
150
151    generate_pkgconfig("${LIB_NAME}")
152endmacro()
153