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# - CMAKE_THREAD_LIBS_INIT LIB_PLATFORM
42# - OPENSSL_LIBRARIES
43# - HDR_PUBLIC
44# - EVENT_INSTALL_INCLUDE_DIR
45# - EVENT_SHARED_FLAGS
46# - EVENT_LIBRARY_STATIC
47# - EVENT_LIBRARY_SHARED
48#
49# Exported variables:
50# - LIBEVENT_SHARED_LIBRARIES
51# - LIBEVENT_STATIC_LIBRARIES
52macro(add_event_library LIB_NAME)
53    cmake_parse_arguments(LIB
54        "" # Options
55        "VERSION" # One val
56        "SOURCES;LIBRARIES" # Multi val
57        ${ARGN}
58    )
59
60    set(ADD_EVENT_LIBRARY_TARGETS)
61    set(ADD_EVENT_LIBRARY_INTERFACE)
62
63    if (${EVENT_LIBRARY_STATIC})
64        add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
65        set_target_properties("${LIB_NAME}_static" PROPERTIES
66            OUTPUT_NAME "${LIB_NAME}"
67            CLEAN_DIRECT_OUTPUT 1)
68        set_target_properties(
69            "${LIB_NAME}_static" PROPERTIES
70            PUBLIC_HEADER "${HDR_PUBLIC}")
71
72        list(APPEND LIBEVENT_STATIC_LIBRARIES "${LIB_NAME}_static")
73        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_static")
74
75        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
76    endif()
77
78    if (${EVENT_LIBRARY_SHARED})
79        add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
80
81        target_link_libraries("${LIB_NAME}_shared"
82            ${CMAKE_THREAD_LIBS_INIT}
83            ${LIB_PLATFORM}
84            ${LIB_LIBRARIES})
85
86        if (EVENT_SHARED_FLAGS)
87            set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
88        endif()
89
90        set_target_properties("${LIB_NAME}_shared" PROPERTIES
91            OUTPUT_NAME "${LIB_NAME}"
92            CLEAN_DIRECT_OUTPUT 1)
93        set_target_properties(
94            "${LIB_NAME}_shared" PROPERTIES
95            PUBLIC_HEADER "${HDR_PUBLIC}")
96        set_target_properties(
97            "${LIB_NAME}_shared" PROPERTIES
98            SOVERSION ${EVENT_ABI_LIBVERSION}
99        )
100
101        list(APPEND LIBEVENT_SHARED_LIBRARIES "${LIB_NAME}_shared")
102        list(APPEND ADD_EVENT_LIBRARY_TARGETS "${LIB_NAME}_shared")
103
104        set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
105    endif()
106
107    export(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
108       FILE "${PROJECT_BINARY_DIR}/LibeventTargets.cmake"
109       APPEND
110    )
111
112    install(TARGETS ${ADD_EVENT_LIBRARY_TARGETS}
113        EXPORT LibeventTargets
114        LIBRARY DESTINATION "lib" COMPONENT lib
115        ARCHIVE DESTINATION "lib" COMPONENT lib
116        RUNTIME DESTINATION "lib" COMPONENT lib
117        PUBLIC_HEADER DESTINATION "include/event2"
118        COMPONENT dev
119    )
120
121    add_library(${LIB_NAME} INTERFACE)
122    target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
123
124    generate_pkgconfig("${LIB_NAME}")
125endmacro()
126