]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/tools/cmake/include/BoostInstall.cmake
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / tools / cmake / include / BoostInstall.cmake
CommitLineData
1e59de90 1# Copyright 2019, 2020, 2021 Peter Dimov
f67539c2
TL
2# Distributed under the Boost Software License, Version 1.0.
3# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
4
5if(NOT CMAKE_VERSION VERSION_LESS 3.10)
6 include_guard()
7endif()
8
9include(BoostMessage)
10include(GNUInstallDirs)
11include(CMakePackageConfigHelpers)
12
13# Variables
14
15if(WIN32)
16 set(__boost_default_layout "versioned")
17else()
18 set(__boost_default_layout "system")
19endif()
20
1e59de90
TL
21set(__boost_default_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake")
22set(__boost_default_include_subdir "/boost-${PROJECT_VERSION_MAJOR}_${PROJECT_VERSION_MINOR}")
f67539c2 23
1e59de90
TL
24# Define cache variables when Boost is the root project
25
26if(CMAKE_SOURCE_DIR STREQUAL "${BOOST_SUPERPROJECT_SOURCE_DIR}")
27
28 set(BOOST_INSTALL_LAYOUT "${__boost_default_layout}" CACHE STRING "Installation layout (versioned, tagged, or system)")
29 set_property(CACHE BOOST_INSTALL_LAYOUT PROPERTY STRINGS versioned tagged system)
30
31 set(BOOST_INSTALL_CMAKEDIR "${__boost_default_cmakedir}" CACHE STRING "Installation directory for CMake configuration files")
32 set(BOOST_INSTALL_INCLUDE_SUBDIR "${__boost_default_include_subdir}" CACHE STRING "Header subdirectory when layout is versioned")
33
34else()
35
36 # add_subdirectory use
37
38 if(NOT DEFINED BOOST_INSTALL_LAYOUT)
39 set(BOOST_INSTALL_LAYOUT "${__boost_default_layout}")
40 endif()
41
42 if(NOT DEFINED BOOST_INSTALL_CMAKEDIR)
43 set(BOOST_INSTALL_CMAKEDIR "${__boost_default_cmakedir}")
44 endif()
45
46 if(NOT DEFINED BOOST_INSTALL_INCLUDE_SUBDIR)
47 set(BOOST_INSTALL_INCLUDE_SUBDIR "${__boost_default_include_subdir}")
48 endif()
49
50endif()
f67539c2
TL
51
52if(BOOST_INSTALL_LAYOUT STREQUAL "versioned")
1e59de90
TL
53 string(APPEND CMAKE_INSTALL_INCLUDEDIR "${BOOST_INSTALL_INCLUDE_SUBDIR}")
54endif()
55
56#
57
58if(CMAKE_SOURCE_DIR STREQUAL "${BOOST_SUPERPROJECT_SOURCE_DIR}" AND NOT __boost_install_status_message_guard)
59 message(STATUS "Boost: using ${BOOST_INSTALL_LAYOUT} layout: ${CMAKE_INSTALL_INCLUDEDIR}, ${CMAKE_INSTALL_BINDIR}, ${CMAKE_INSTALL_LIBDIR}, ${BOOST_INSTALL_CMAKEDIR}")
60 set(__boost_install_status_message_guard TRUE)
f67539c2
TL
61endif()
62
63#
64
65function(__boost_install_set_output_name LIB TYPE VERSION)
66
67 set(name_debug ${LIB})
68 set(name_release ${LIB})
69
70 # prefix
71 if(WIN32 AND TYPE STREQUAL "STATIC_LIBRARY")
72 set_target_properties(${LIB} PROPERTIES PREFIX "lib")
73 endif()
74
75 # toolset
76 if(BOOST_INSTALL_LAYOUT STREQUAL versioned)
77
78 string(TOLOWER ${CMAKE_CXX_COMPILER_ID} toolset)
79
80 if(toolset STREQUAL "msvc")
81
82 set(toolset "vc")
83
84 if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]([0-9]+)")
85
86 if(CMAKE_MATCH_1 GREATER 18)
87 math(EXPR major ${CMAKE_MATCH_1}-5)
88 else()
89 math(EXPR major ${CMAKE_MATCH_1}-6)
90 endif()
91
92 math(EXPR minor ${CMAKE_MATCH_2}/10)
93
94 string(APPEND toolset ${major}${minor})
95
96 endif()
97
98 else()
99
100 if(toolset STREQUAL "gnu")
101
102 set(toolset "gcc")
103
104 elseif(toolset STREQUAL "clang")
105
106 if(MSVC)
107 set(toolset "clangw")
108 endif()
109
110 endif()
111
112 if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]")
113 string(APPEND toolset ${CMAKE_MATCH_1})
114 endif()
115
116 endif()
117
118 string(APPEND name_debug "-${toolset}")
119 string(APPEND name_release "-${toolset}")
120
121 endif()
122
123 if(BOOST_INSTALL_LAYOUT STREQUAL versioned OR BOOST_INSTALL_LAYOUT STREQUAL tagged)
124
125 # threading
126 string(APPEND name_debug "-mt")
127 string(APPEND name_release "-mt")
128
129 # ABI tag
130
131 if(MSVC)
132
133 get_target_property(MSVC_RUNTIME_LIBRARY ${LIB} MSVC_RUNTIME_LIBRARY)
134
135 if(MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreaded$<$<CONFIG:Debug>:Debug>")
136
137 string(APPEND name_debug "-sgd")
138 string(APPEND name_release "-s")
139
140 else()
141
142 string(APPEND name_debug "-gd")
143
144 endif()
145
146 else()
147
148 string(APPEND name_debug "-d")
149
150 endif()
151
152 # Arch and model
153 math(EXPR bits ${CMAKE_SIZEOF_VOID_P}*8)
154
155 string(APPEND name_debug "-x${bits}") # x86 only for now
156 string(APPEND name_release "-x${bits}")
157
158 endif()
159
160 if(BOOST_INSTALL_LAYOUT STREQUAL versioned)
161
162 string(REGEX REPLACE "^([0-9]+)[.]([0-9]+).*" "\\1_\\2" __ver ${VERSION})
163
164 string(APPEND name_debug "-${__ver}")
165 string(APPEND name_release "-${__ver}")
166
167 endif()
168
169 set_target_properties(${LIB} PROPERTIES OUTPUT_NAME_DEBUG ${name_debug})
170 set_target_properties(${LIB} PROPERTIES OUTPUT_NAME ${name_release})
171
172 if(TYPE STREQUAL "STATIC_LIBRARY")
173
174 set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME_DEBUG "${name_debug}")
175 set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME "${name_release}")
176
177 endif()
178
179endfunction()
180
181function(__boost_install_update_include_directory lib incdir prop)
182
183 get_target_property(value ${lib} ${prop})
184
185 if(value STREQUAL incdir)
186
1e59de90 187 set_target_properties(${lib} PROPERTIES ${prop} "$<BUILD_INTERFACE:${incdir}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
f67539c2
TL
188
189 endif()
190
191endfunction()
192
193# Installs a single target
194# boost_install_target(TARGET target VERSION version [HEADER_DIRECTORY directory])
195
196function(boost_install_target)
197
198 cmake_parse_arguments(_ "" "TARGET;VERSION;HEADER_DIRECTORY" "" ${ARGN})
199
200 if(NOT __TARGET)
201
202 message(SEND_ERROR "boost_install_target: TARGET not given.")
203 return()
204
205 endif()
206
207 if(NOT __VERSION)
208
209 message(SEND_ERROR "boost_install_target: VERSION not given, but is required for installation.")
210 return()
211
212 endif()
213
214 set(LIB ${__TARGET})
215
216 if(NOT __HEADER_DIRECTORY)
217
218 set(__HEADER_DIRECTORY "${PROJECT_SOURCE_DIR}/include")
219
220 endif()
221
222 get_target_property(TYPE ${LIB} TYPE)
223
224 __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INTERFACE_INCLUDE_DIRECTORIES)
225
226 if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY")
227
228 __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INCLUDE_DIRECTORIES)
229
230 get_target_property(OUTPUT_NAME ${LIB} OUTPUT_NAME)
231
232 if(NOT OUTPUT_NAME)
233 __boost_install_set_output_name(${LIB} ${TYPE} ${__VERSION})
234 endif()
235
236 endif()
237
238 if(TYPE STREQUAL "SHARED_LIBRARY" OR TYPE STREQUAL "EXECUTABLE")
239
240 get_target_property(VERSION ${LIB} VERSION)
241
242 if(NOT VERSION)
243 set_target_properties(${LIB} PROPERTIES VERSION ${__VERSION})
244 endif()
245
246 endif()
247
248 if(LIB MATCHES "^boost_(.*)$")
249 set_target_properties(${LIB} PROPERTIES EXPORT_NAME ${CMAKE_MATCH_1})
250 endif()
251
1e59de90 252 if(CMAKE_SKIP_INSTALL_RULES)
f67539c2 253
1e59de90
TL
254 boost_message(DEBUG "boost_install_target: not installing target '${__TARGET}' due to CMAKE_SKIP_INSTALL_RULES=${CMAKE_SKIP_INSTALL_RULES}")
255 return()
f67539c2
TL
256
257 endif()
258
1e59de90 259 set(CONFIG_INSTALL_DIR "${BOOST_INSTALL_CMAKEDIR}/${LIB}-${__VERSION}")
f67539c2 260
1e59de90
TL
261 install(TARGETS ${LIB} EXPORT ${LIB}-targets
262 # explicit destination specification required for 3.13, 3.14 no longer needs it
263 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
264 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
265 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
266 PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
267 PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
268 )
269
270 if(MSVC)
271 if(TYPE STREQUAL "SHARED_LIBRARY")
272 install(FILES $<TARGET_PDB_FILE:${LIB}> DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
273 endif()
f67539c2 274
1e59de90
TL
275 if(TYPE STREQUAL "STATIC_LIBRARY" AND NOT CMAKE_VERSION VERSION_LESS 3.15)
276 install(FILES "$<TARGET_FILE_DIR:${LIB}>/$<TARGET_FILE_PREFIX:${LIB}>$<TARGET_FILE_BASE_NAME:${LIB}>.pdb" DESTINATION ${CMAKE_INSTALL_LIBDIR} OPTIONAL)
277 endif()
f67539c2
TL
278 endif()
279
280 install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake)
281
282 set(CONFIG_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config.cmake")
283 set(CONFIG_FILE_CONTENTS "# Generated by BoostInstall.cmake for ${LIB}-${__VERSION}\n\n")
284
285 get_target_property(INTERFACE_LINK_LIBRARIES ${LIB} INTERFACE_LINK_LIBRARIES)
286
287 set(LINK_LIBRARIES "")
288
289 if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY")
290 get_target_property(LINK_LIBRARIES ${LIB} LINK_LIBRARIES)
291 endif()
292
293 if(INTERFACE_LINK_LIBRARIES OR LINK_LIBRARIES)
294
295 string(APPEND CONFIG_FILE_CONTENTS "include(CMakeFindDependencyMacro)\n\n")
296
1e59de90
TL
297 set(link_libraries ${INTERFACE_LINK_LIBRARIES} ${LINK_LIBRARIES})
298 list(REMOVE_DUPLICATES link_libraries)
299
300 set(python_components "")
301 set(icu_components "")
302
303 foreach(dep IN LISTS link_libraries)
f67539c2 304
1e59de90 305 if(dep MATCHES "^Boost::(.*)$")
f67539c2
TL
306
307 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(boost_${CMAKE_MATCH_1} ${__VERSION} EXACT)\n")
308
1e59de90
TL
309 elseif(dep STREQUAL "Threads::Threads")
310
311 string(APPEND CONFIG_FILE_CONTENTS "set(THREADS_PREFER_PTHREAD_FLAG ON)\n")
312 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(Threads)\n")
313
314 elseif(dep STREQUAL "ZLIB::ZLIB")
315
316 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(ZLIB)\n")
317
318 elseif(dep STREQUAL "BZip2::BZip2")
319
320 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(BZip2)\n")
321
322 elseif(dep STREQUAL "LibLZMA::LibLZMA")
323
324 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(LibLZMA)\n")
325
326 elseif(dep STREQUAL "zstd::libzstd_shared" OR dep STREQUAL "zstd::libzstd_static")
327
328 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(zstd)\n")
329
330 elseif(dep STREQUAL "MPI::MPI_CXX")
331
332 # COMPONENTS requires 3.9, but the imported target also requires 3.9
333 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(MPI COMPONENTS CXX)\n")
334
335 elseif(dep STREQUAL "Iconv::Iconv")
336
337 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(Iconv)\n")
338
339 elseif(dep STREQUAL "Python::Module")
340
341 string(APPEND python_components " Development")
342
343 elseif(dep STREQUAL "Python::NumPy")
344
345 string(APPEND python_components " NumPy")
346
347 elseif(dep STREQUAL "ICU::data")
348
349 string(APPEND icu_components " data")
350
351 elseif(dep STREQUAL "ICU::i18n")
352
353 string(APPEND icu_components " i18n")
354
355 elseif(dep STREQUAL "ICU::uc")
356
357 string(APPEND icu_components " uc")
358
f67539c2
TL
359 endif()
360
361 endforeach()
362
1e59de90
TL
363 if(python_components)
364
365 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(Python COMPONENTS ${python_components})\n")
366
367 endif()
368
369 if(icu_components)
370
371 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(ICU COMPONENTS ${icu_components})\n")
372
373 endif()
374
f67539c2
TL
375 string(APPEND CONFIG_FILE_CONTENTS "\n")
376
377 endif()
378
379 string(APPEND CONFIG_FILE_CONTENTS "include(\"\${CMAKE_CURRENT_LIST_DIR}/${LIB}-targets.cmake\")\n")
380
381 file(WRITE "${CONFIG_FILE_NAME}" "${CONFIG_FILE_CONTENTS}")
382 install(FILES "${CONFIG_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}")
383
384 set(CONFIG_VERSION_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config-version.cmake")
385
386 if(TYPE STREQUAL "INTERFACE_LIBRARY")
387
388 # Header-only libraries are architecture-independent
389
390 if(NOT CMAKE_VERSION VERSION_LESS 3.14)
391
1e59de90 392 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY SameMajorVersion ARCH_INDEPENDENT)
f67539c2
TL
393
394 else()
395
396 set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
397 set(CMAKE_SIZEOF_VOID_P "")
398
1e59de90 399 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY SameMajorVersion)
f67539c2
TL
400
401 set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P})
402
403 endif()
404
405 else()
406
1e59de90 407 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY SameMajorVersion)
f67539c2
TL
408
409 endif()
410
411 install(FILES "${CONFIG_VERSION_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}")
412
413endfunction()
414
415# boost_install([VERSION version] [TARGETS targets...] [HEADER_DIRECTORY directory])
416
417function(boost_install)
418
419 cmake_parse_arguments(_ "" "VERSION;HEADER_DIRECTORY" "TARGETS" ${ARGN})
420
421 if(NOT __VERSION)
422
423 if(NOT PROJECT_VERSION)
424
425 message(AUTHOR_WARNING "boost_install: VERSION not given, PROJECT_VERSION not set, but a version is required for installation.")
426 return()
427
428 else()
429
430 boost_message(DEBUG "boost_install: VERSION not given, assuming PROJECT_VERSION ('${PROJECT_VERSION}')")
431 set(__VERSION ${PROJECT_VERSION})
432
433 endif()
434
435 endif()
436
437 if(__UNPARSED_ARGUMENTS)
438
439 message(AUTHOR_WARNING "boost_install: extra arguments ignored: ${__UNPARSED_ARGUMENTS}")
440
441 endif()
442
1e59de90 443 if(__HEADER_DIRECTORY AND NOT CMAKE_SKIP_INSTALL_RULES)
f67539c2
TL
444
445 get_filename_component(__HEADER_DIRECTORY "${__HEADER_DIRECTORY}" ABSOLUTE)
1e59de90 446 install(DIRECTORY "${__HEADER_DIRECTORY}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
f67539c2
TL
447
448 endif()
449
450 foreach(target IN LISTS __TARGETS)
451
452 boost_install_target(TARGET ${target} VERSION ${__VERSION} HEADER_DIRECTORY ${__HEADER_DIRECTORY})
453
454 endforeach()
455
456endfunction()