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# - HDR_PUBLIC
48# - EVENT_INSTALL_INCLUDE_DIR
49# - EVENT_SHARED_FLAGS
50# - EVENT_LIBRARY_STATIC
51# - EVENT_LIBRARY_SHARED
52#
53# Exported variables:
54# - LIBEVENT_SHARED_LIBRARIES
55# - LIBEVENT_STATIC_LIBRARIES
56macro(add_event_library LIB_NAME)
57    cmake_parse_arguments(LIB
58        "" # Options
59        "VERSION" # One val
60        "SOURCES;LIBRARIES" # Multi val
61        ${ARGN}
62    )
63
64    set(ADD_EVENT_LIBRARY_TARGETS)
65    set(ADD_EVENT_LIBRARY_INTERFACE)
66
67    if (${EVENT_LIBRARY_STATIC})
68        add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
69        set_target_properties("${LIB_NAME}_static" PROPERTIES
70            OUTPUT_NAME "${LIB_NAME}"
71            CLEAN_DIRECT_OUTPUT 1)
72        set_target_properties(
73            "${LIB_NAME}_static" PROPERTIES
74            PUBLIC_HEADER "${HDR_PUBLIC}")
75
76        list(APPEND LIBEVENT_STATIC_LIBRARIES "${LIB_NAME}_static")
77        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_static")
78
79        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
80    endif()
81
82    if (${EVENT_LIBRARY_SHARED})
83        add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
84
85        target_link_libraries("${LIB_NAME}_shared"
86            ${CMAKE_THREAD_LIBS_INIT}
87            ${LIB_PLATFORM}
88            ${LIB_LIBRARIES})
89
90        if (EVENT_SHARED_FLAGS)
91            set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
92        endif()
93
94        if (WIN32)
95            set_target_properties(
96                "${LIB_NAME}_shared" PROPERTIES
97                OUTPUT_NAME "${LIB_NAME}"
98                SOVERSION ${EVENT_ABI_LIBVERSION})
99        elseif (APPLE)
100            math(EXPR COMPATIBILITY_VERSION "${EVENT_ABI_LIBVERSION_CURRENT}+1")
101            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
102            set_target_properties(
103                "${LIB_NAME}_shared" PROPERTIES
104                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
105                INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
106                LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
107        else()
108            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
109            set_target_properties(
110                "${LIB_NAME}_shared" PROPERTIES
111                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}"
112                VERSION "${CURRENT_MINUS_AGE}.${EVENT_ABI_LIBVERSION_AGE}.${EVENT_ABI_LIBVERSION_REVISION}"
113                SOVERSION "${CURRENT_MINUS_AGE}")
114        endif()
115
116        set_target_properties(
117            "${LIB_NAME}_shared" PROPERTIES
118            PUBLIC_HEADER "${HDR_PUBLIC}"
119            CLEAN_DIRECT_OUTPUT 1)
120
121        if (NOT WIN32)
122            set(LIB_LINK_NAME
123                "${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
124
125            add_custom_command(TARGET ${LIB_NAME}_shared
126                POST_BUILD
127                COMMAND ${CMAKE_COMMAND} -E create_symlink
128                    "$<TARGET_FILE_NAME:${LIB_NAME}_shared>"
129                    "${LIB_LINK_NAME}"
130                WORKING_DIRECTORY "lib")
131        endif()
132
133        list(APPEND LIBEVENT_SHARED_LIBRARIES "${LIB_NAME}_shared")
134        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_shared")
135
136        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
137    endif()
138
139    export(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
140       FILE "${PROJECT_BINARY_DIR}/LibeventTargets.cmake"
141       APPEND
142    )
143
144    install(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
145        EXPORT LibeventTargets
146        LIBRARY DESTINATION "lib" COMPONENT lib
147        ARCHIVE DESTINATION "lib" COMPONENT lib
148        RUNTIME DESTINATION "lib" COMPONENT lib
149        PUBLIC_HEADER DESTINATION "include/event2"
150        COMPONENT dev
151    )
152    if (NOT WIN32 AND ${EVENT_LIBRARY_SHARED})
153        install(FILES
154            "$<TARGET_FILE_DIR:${LIB_NAME}_shared>/${LIB_LINK_NAME}"
155            DESTINATION "lib"
156            COMPONENT lib)
157    endif()
158
159    add_library(${LIB_NAME} INTERFACE)
160    target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
161
162    generate_pkgconfig("${LIB_NAME}")
163endmacro()
164