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