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