]>
Commit | Line | Data |
---|---|---|
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 | ||
5 | if(NOT CMAKE_VERSION VERSION_LESS 3.10) | |
6 | include_guard() | |
7 | endif() | |
8 | ||
9 | include(BoostMessage) | |
10 | include(GNUInstallDirs) | |
11 | include(CMakePackageConfigHelpers) | |
12 | ||
13 | # Variables | |
14 | ||
15 | if(WIN32) | |
16 | set(__boost_default_layout "versioned") | |
17 | else() | |
18 | set(__boost_default_layout "system") | |
19 | endif() | |
20 | ||
1e59de90 TL |
21 | set(__boost_default_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake") |
22 | set(__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 | ||
26 | if(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 | ||
34 | else() | |
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 | ||
50 | endif() | |
f67539c2 TL |
51 | |
52 | if(BOOST_INSTALL_LAYOUT STREQUAL "versioned") | |
1e59de90 TL |
53 | string(APPEND CMAKE_INSTALL_INCLUDEDIR "${BOOST_INSTALL_INCLUDE_SUBDIR}") |
54 | endif() | |
55 | ||
56 | # | |
57 | ||
58 | if(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 |
61 | endif() |
62 | ||
63 | # | |
64 | ||
65 | function(__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 | ||
179 | endfunction() | |
180 | ||
181 | function(__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 | ||
191 | endfunction() | |
192 | ||
193 | # Installs a single target | |
194 | # boost_install_target(TARGET target VERSION version [HEADER_DIRECTORY directory]) | |
195 | ||
196 | function(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 | ||
413 | endfunction() | |
414 | ||
415 | # boost_install([VERSION version] [TARGETS targets...] [HEADER_DIRECTORY directory]) | |
416 | ||
417 | function(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 | ||
456 | endfunction() |