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