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# LIB_NAME maybe event_core, event_extra, event_openssl, event_pthreads or event.
39# Targets whose LIB_NAME is not 'event' should be exported and installed.
40macro(export_install_target TYPE LIB_NAME OUTER_INCLUDES)
41    if("${LIB_NAME}" STREQUAL "event")
42        install(TARGETS "${LIB_NAME}_${TYPE}"
43            LIBRARY DESTINATION "lib" COMPONENT lib
44            ARCHIVE DESTINATION "lib" COMPONENT lib
45            RUNTIME DESTINATION "lib" COMPONENT lib
46            COMPONENT dev
47        )
48    else()
49        string(REPLACE "event_" "" PURE_NAME ${LIB_NAME})
50        string(TOUPPER ${TYPE} UPPER_TYPE)
51        list(APPEND LIBEVENT_${UPPER_TYPE}_LIBRARIES "${PURE_NAME}")
52        set(OUTER_INCS)
53        if (NOT "${OUTER_INCLUDES}" STREQUAL "NONE")
54            set(OUTER_INCS ${OUTER_INCLUDES})
55        endif()
56        target_include_directories("${LIB_NAME}_${TYPE}"
57            PUBLIC  "$<INSTALL_INTERFACE:include>"
58                    "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
59                    "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
60                    ${OUTER_INCS}
61        )
62        set_target_properties("${LIB_NAME}_${TYPE}" PROPERTIES EXPORT_NAME ${PURE_NAME})
63        export(TARGETS "${LIB_NAME}_${TYPE}"
64            NAMESPACE ${PROJECT_NAME}::
65            FILE "${PROJECT_BINARY_DIR}/LibeventTargets-${TYPE}.cmake"
66            APPEND
67        )
68        install(TARGETS "${LIB_NAME}_${TYPE}"
69            EXPORT LibeventTargets-${TYPE}
70            LIBRARY DESTINATION "lib" COMPONENT lib
71            ARCHIVE DESTINATION "lib" COMPONENT lib
72            RUNTIME DESTINATION "lib" COMPONENT lib
73            COMPONENT dev
74        )
75    endif()
76endmacro()
77
78# Global variables that it uses:
79# - EVENT_ABI_LIBVERSION
80# - EVENT_ABI_LIBVERSION_CURRENT
81# - EVENT_ABI_LIBVERSION_REVISION
82# - EVENT_ABI_LIBVERSION_AGE
83# - EVENT_PACKAGE_RELEASE
84# - CMAKE_THREAD_LIBS_INIT LIB_PLATFORM
85# - OPENSSL_LIBRARIES
86# - EVENT_SHARED_FLAGS
87# - EVENT_LIBRARY_STATIC
88# - EVENT_LIBRARY_SHARED
89#
90# Exported variables:
91# - LIBEVENT_SHARED_LIBRARIES
92# - LIBEVENT_STATIC_LIBRARIES
93macro(add_event_library LIB_NAME)
94    cmake_parse_arguments(LIB
95        "" # Options
96        "VERSION" # One val
97        "SOURCES;LIBRARIES;INNER_LIBRARIES;OUTER_INCLUDES" # Multi val
98        ${ARGN}
99    )
100
101    if ("${LIB_OUTER_INCLUDES}" STREQUAL "")
102        set(LIB_OUTER_INCLUDES NONE)
103    endif()
104    set(ADD_EVENT_LIBRARY_INTERFACE)
105
106    if (${EVENT_LIBRARY_STATIC})
107        add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
108        set_target_properties("${LIB_NAME}_static" PROPERTIES
109            OUTPUT_NAME "${LIB_NAME}"
110            CLEAN_DIRECT_OUTPUT 1)
111
112        if(LIB_INNER_LIBRARIES)
113            set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_static")
114        endif()
115        target_link_libraries("${LIB_NAME}_static"
116            ${CMAKE_THREAD_LIBS_INIT}
117            ${LIB_PLATFORM}
118            ${INNER_LIBRARIES}
119            ${LIB_LIBRARIES})
120
121        export_install_target(static "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
122
123        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
124    endif()
125
126    if (${EVENT_LIBRARY_SHARED})
127        add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
128
129        if(LIB_INNER_LIBRARIES)
130            set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_shared")
131        endif()
132        target_link_libraries("${LIB_NAME}_shared"
133            ${CMAKE_THREAD_LIBS_INIT}
134            ${LIB_PLATFORM}
135            ${INNER_LIBRARIES}
136            ${LIB_LIBRARIES})
137
138        if (EVENT_SHARED_FLAGS)
139            set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
140        endif()
141
142        if (WIN32)
143            set_target_properties(
144                "${LIB_NAME}_shared" PROPERTIES
145                OUTPUT_NAME "${LIB_NAME}"
146                SOVERSION ${EVENT_ABI_LIBVERSION})
147        elseif (APPLE)
148            math(EXPR COMPATIBILITY_VERSION "${EVENT_ABI_LIBVERSION_CURRENT}+1")
149            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
150            set_target_properties(
151                "${LIB_NAME}_shared" PROPERTIES
152                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
153                INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
154                LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
155        else()
156            math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
157            set_target_properties(
158                "${LIB_NAME}_shared" PROPERTIES
159                OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}"
160                VERSION "${CURRENT_MINUS_AGE}.${EVENT_ABI_LIBVERSION_AGE}.${EVENT_ABI_LIBVERSION_REVISION}"
161                SOVERSION "${CURRENT_MINUS_AGE}"
162                INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
163        endif()
164
165        if (NOT WIN32)
166            set(LIB_LINK_NAME
167                "${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
168
169            add_custom_command(TARGET ${LIB_NAME}_shared
170                POST_BUILD
171                COMMAND ${CMAKE_COMMAND} -E create_symlink
172                    "$<TARGET_FILE_NAME:${LIB_NAME}_shared>"
173                    "${LIB_LINK_NAME}"
174                WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
175        endif()
176
177        export_install_target(shared "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
178
179        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
180
181        if (NOT WIN32)
182            install(FILES
183                "$<TARGET_FILE_DIR:${LIB_NAME}_shared>/${LIB_LINK_NAME}"
184                DESTINATION "lib"
185                COMPONENT lib)
186        endif()
187    endif()
188
189    add_library(${LIB_NAME} INTERFACE)
190    target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
191
192    generate_pkgconfig("${LIB_NAME}")
193endmacro()
194