• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2019, 2020 Peter Dimov
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
21set(BOOST_INSTALL_LAYOUT ${__boost_default_layout} CACHE STRING "Installation layout (versioned, tagged, or system)")
22set_property(CACHE BOOST_INSTALL_LAYOUT PROPERTY STRINGS versioned tagged system)
23
24set(BOOST_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}" CACHE STRING "Installation directory for library files")
25set(BOOST_INSTALL_CMAKEDIR "${BOOST_INSTALL_LIBDIR}/cmake" CACHE STRING "Installation directory for CMake configuration files")
26set(BOOST_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}" CACHE STRING "Installation directory for header files")
27
28if(BOOST_INSTALL_LAYOUT STREQUAL "versioned")
29  set(BOOST_INSTALL_INCLUDEDIR "$CACHE{BOOST_INSTALL_INCLUDEDIR}/boost-${PROJECT_VERSION_MAJOR}_${PROJECT_VERSION_MINOR}")
30endif()
31
32#
33
34function(__boost_install_set_output_name LIB TYPE VERSION)
35
36  set(name_debug ${LIB})
37  set(name_release ${LIB})
38
39  # prefix
40  if(WIN32 AND TYPE STREQUAL "STATIC_LIBRARY")
41    set_target_properties(${LIB} PROPERTIES PREFIX "lib")
42  endif()
43
44  # toolset
45  if(BOOST_INSTALL_LAYOUT STREQUAL versioned)
46
47    string(TOLOWER ${CMAKE_CXX_COMPILER_ID} toolset)
48
49    if(toolset STREQUAL "msvc")
50
51      set(toolset "vc")
52
53      if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]([0-9]+)")
54
55        if(CMAKE_MATCH_1 GREATER 18)
56          math(EXPR major ${CMAKE_MATCH_1}-5)
57        else()
58          math(EXPR major ${CMAKE_MATCH_1}-6)
59        endif()
60
61        math(EXPR minor ${CMAKE_MATCH_2}/10)
62
63        string(APPEND toolset ${major}${minor})
64
65      endif()
66
67    else()
68
69      if(toolset STREQUAL "gnu")
70
71        set(toolset "gcc")
72
73      elseif(toolset STREQUAL "clang")
74
75        if(MSVC)
76          set(toolset "clangw")
77        endif()
78
79      endif()
80
81      if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]")
82        string(APPEND toolset ${CMAKE_MATCH_1})
83      endif()
84
85    endif()
86
87    string(APPEND name_debug "-${toolset}")
88    string(APPEND name_release "-${toolset}")
89
90  endif()
91
92  if(BOOST_INSTALL_LAYOUT STREQUAL versioned OR BOOST_INSTALL_LAYOUT STREQUAL tagged)
93
94    # threading
95    string(APPEND name_debug "-mt")
96    string(APPEND name_release "-mt")
97
98    # ABI tag
99
100    if(MSVC)
101
102      get_target_property(MSVC_RUNTIME_LIBRARY ${LIB} MSVC_RUNTIME_LIBRARY)
103
104      if(MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreaded$<$<CONFIG:Debug>:Debug>")
105
106        string(APPEND name_debug "-sgd")
107        string(APPEND name_release "-s")
108
109      else()
110
111        string(APPEND name_debug "-gd")
112
113      endif()
114
115    else()
116
117      string(APPEND name_debug "-d")
118
119    endif()
120
121    # Arch and model
122    math(EXPR bits ${CMAKE_SIZEOF_VOID_P}*8)
123
124    string(APPEND name_debug "-x${bits}") # x86 only for now
125    string(APPEND name_release "-x${bits}")
126
127  endif()
128
129  if(BOOST_INSTALL_LAYOUT STREQUAL versioned)
130
131    string(REGEX REPLACE "^([0-9]+)[.]([0-9]+).*" "\\1_\\2" __ver ${VERSION})
132
133    string(APPEND name_debug "-${__ver}")
134    string(APPEND name_release "-${__ver}")
135
136  endif()
137
138  set_target_properties(${LIB} PROPERTIES OUTPUT_NAME_DEBUG ${name_debug})
139  set_target_properties(${LIB} PROPERTIES OUTPUT_NAME ${name_release})
140
141  if(TYPE STREQUAL "STATIC_LIBRARY")
142
143    set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME_DEBUG "${name_debug}")
144    set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME "${name_release}")
145
146  endif()
147
148endfunction()
149
150function(__boost_install_update_include_directory lib incdir prop)
151
152  get_target_property(value ${lib} ${prop})
153
154  if(value STREQUAL incdir)
155
156    set_target_properties(${lib} PROPERTIES ${prop} "$<BUILD_INTERFACE:${incdir}>;$<INSTALL_INTERFACE:${BOOST_INSTALL_INCLUDEDIR}>")
157
158  endif()
159
160endfunction()
161
162# Installs a single target
163# boost_install_target(TARGET target VERSION version [HEADER_DIRECTORY directory])
164
165function(boost_install_target)
166
167  cmake_parse_arguments(_ "" "TARGET;VERSION;HEADER_DIRECTORY" "" ${ARGN})
168
169  if(NOT __TARGET)
170
171    message(SEND_ERROR "boost_install_target: TARGET not given.")
172    return()
173
174  endif()
175
176  if(NOT __VERSION)
177
178    message(SEND_ERROR "boost_install_target: VERSION not given, but is required for installation.")
179    return()
180
181  endif()
182
183  set(LIB ${__TARGET})
184
185  if(NOT __HEADER_DIRECTORY)
186
187    set(__HEADER_DIRECTORY "${PROJECT_SOURCE_DIR}/include")
188
189  endif()
190
191  get_target_property(TYPE ${LIB} TYPE)
192
193  __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INTERFACE_INCLUDE_DIRECTORIES)
194
195  if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY")
196
197    __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INCLUDE_DIRECTORIES)
198
199    get_target_property(OUTPUT_NAME ${LIB} OUTPUT_NAME)
200
201    if(NOT OUTPUT_NAME)
202      __boost_install_set_output_name(${LIB} ${TYPE} ${__VERSION})
203    endif()
204
205  endif()
206
207  if(TYPE STREQUAL "SHARED_LIBRARY" OR TYPE STREQUAL "EXECUTABLE")
208
209    get_target_property(VERSION ${LIB} VERSION)
210
211    if(NOT VERSION)
212      set_target_properties(${LIB} PROPERTIES VERSION ${__VERSION})
213    endif()
214
215  endif()
216
217  if(LIB MATCHES "^boost_(.*)$")
218    set_target_properties(${LIB} PROPERTIES EXPORT_NAME ${CMAKE_MATCH_1})
219  endif()
220
221  set(CONFIG_INSTALL_DIR "${BOOST_INSTALL_CMAKEDIR}/${LIB}-${__VERSION}")
222
223  install(TARGETS ${LIB} EXPORT ${LIB}-targets DESTINATION ${BOOST_INSTALL_LIBDIR})
224
225  if(WIN32 AND TYPE STREQUAL "SHARED_LIBRARY")
226
227    install(FILES $<TARGET_PDB_FILE:${LIB}> DESTINATION ${BOOST_INSTALL_LIBDIR} OPTIONAL)
228
229  endif()
230
231  if(WIN32 AND TYPE STREQUAL "STATIC_LIBRARY" AND NOT CMAKE_VERSION VERSION_LESS 3.15)
232
233    install(FILES "$<TARGET_FILE_DIR:${LIB}>/$<TARGET_FILE_PREFIX:${LIB}>$<TARGET_FILE_BASE_NAME:${LIB}>.pdb" DESTINATION ${BOOST_INSTALL_LIBDIR} OPTIONAL)
234
235  endif()
236
237  install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake)
238
239  set(CONFIG_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config.cmake")
240  set(CONFIG_FILE_CONTENTS "# Generated by BoostInstall.cmake for ${LIB}-${__VERSION}\n\n")
241
242  get_target_property(INTERFACE_LINK_LIBRARIES ${LIB} INTERFACE_LINK_LIBRARIES)
243
244  set(LINK_LIBRARIES "")
245
246  if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY")
247    get_target_property(LINK_LIBRARIES ${LIB} LINK_LIBRARIES)
248  endif()
249
250  if(INTERFACE_LINK_LIBRARIES OR LINK_LIBRARIES)
251
252    string(APPEND CONFIG_FILE_CONTENTS "include(CMakeFindDependencyMacro)\n\n")
253
254    foreach(dep IN LISTS INTERFACE_LINK_LIBRARIES LINK_LIBRARIES)
255
256      if(${dep} MATCHES "^Boost::(.*)$")
257
258        string(APPEND CONFIG_FILE_CONTENTS "find_dependency(boost_${CMAKE_MATCH_1} ${__VERSION} EXACT)\n")
259
260      endif()
261
262    endforeach()
263
264    string(APPEND CONFIG_FILE_CONTENTS "\n")
265
266  endif()
267
268  string(APPEND CONFIG_FILE_CONTENTS "include(\"\${CMAKE_CURRENT_LIST_DIR}/${LIB}-targets.cmake\")\n")
269
270  file(WRITE "${CONFIG_FILE_NAME}" "${CONFIG_FILE_CONTENTS}")
271  install(FILES "${CONFIG_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}")
272
273  set(CONFIG_VERSION_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config-version.cmake")
274
275  if(TYPE STREQUAL "INTERFACE_LIBRARY")
276
277    # Header-only libraries are architecture-independent
278
279    if(NOT CMAKE_VERSION VERSION_LESS 3.14)
280
281      write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT)
282
283    else()
284
285      set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
286      set(CMAKE_SIZEOF_VOID_P "")
287
288      write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion)
289
290      set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P})
291
292    endif()
293
294  else()
295
296    write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion)
297
298  endif()
299
300  install(FILES "${CONFIG_VERSION_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}")
301
302endfunction()
303
304# boost_install([VERSION version] [TARGETS targets...] [HEADER_DIRECTORY directory])
305
306function(boost_install)
307
308  cmake_parse_arguments(_ "" "VERSION;HEADER_DIRECTORY" "TARGETS" ${ARGN})
309
310  if(NOT __VERSION)
311
312    if(NOT PROJECT_VERSION)
313
314      message(AUTHOR_WARNING "boost_install: VERSION not given, PROJECT_VERSION not set, but a version is required for installation.")
315      return()
316
317    else()
318
319      boost_message(DEBUG "boost_install: VERSION not given, assuming PROJECT_VERSION ('${PROJECT_VERSION}')")
320      set(__VERSION ${PROJECT_VERSION})
321
322    endif()
323
324  endif()
325
326  if(__UNPARSED_ARGUMENTS)
327
328    message(AUTHOR_WARNING "boost_install: extra arguments ignored: ${__UNPARSED_ARGUMENTS}")
329
330  endif()
331
332  if(__HEADER_DIRECTORY)
333
334    get_filename_component(__HEADER_DIRECTORY "${__HEADER_DIRECTORY}" ABSOLUTE)
335    install(DIRECTORY "${__HEADER_DIRECTORY}/" DESTINATION "${BOOST_INSTALL_INCLUDEDIR}")
336
337  endif()
338
339  foreach(target IN LISTS __TARGETS)
340
341    boost_install_target(TARGET ${target} VERSION ${__VERSION} HEADER_DIRECTORY ${__HEADER_DIRECTORY})
342
343  endforeach()
344
345endfunction()
346