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