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