Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/cmake/FindBoost.cmake @ 1776

Last change on this file since 1776 was 1776, checked in by landauf, 16 years ago

Many changes in almost all FindXYZ.cmake files. They now throw errors if something wasn't found.

  • Property svn:eol-style set to native
File size: 11.7 KB
Line 
1# THIS FILE HAS BEEN MODIFIED TO WORK ON THE TARDIS INFRASTURUCTURE of THE ETH.
2# use with cation
3# Nicolas Schlumberger <nico AT orxonx DOT net> (C) 2007
4#
5# Several changes and additions by Fabian 'x3n' Landau
6#                 > www.orxonox.net <
7#
8# - Find the Boost includes and libraries.
9# The following variables are set if Boost is found.  If Boost is not
10# found, Boost_FOUND is set to false.
11#  Boost_FOUND                  - True when the Boost include directory is found.
12#  Boost_INCLUDE_DIRS           - the path to where the boost include files are.
13#  Boost_LIBRARY_DIRS           - The path to where the boost library files are.
14#  Boost_LIB_DIAGNOSTIC_DEFINITIONS - Only set if using Windows.
15#  Boost_<library>_FOUND        - True if the Boost <library> is found.
16#  Boost_<library>_INCLUDE_DIRS - The include path for Boost <library>.
17#  Boost_<library>_LIBRARIES    - The libraries to link to to use Boost <library>.
18#  Boost_LIBRARIES              - The libraries to link to to use all Boost libraries.
19#
20# The following variables can be set to configure how Boost is found:
21#  Boost_LIB_PREFIX             - Look for Boost libraries prefixed with this, e.g. "lib"
22#  Boost_LIB_SUFFIX             - Look for Boost libraries ending with this, e.g. "vc80-mt"
23#  Boost_LIB_SUFFIX_DEBUG       - As for Boost_LIB_SUFFIX but for debug builds, e.g. "vs80-mt-gd"
24
25# ----------------------------------------------------------------------------
26# If you have installed Boost in a non-standard location or you have
27# just staged the boost files using bjam then you have three
28# options. In the following comments, it is assumed that <Your Path>
29# points to the root directory of the include directory of Boost. e.g
30# If you have put boost in C:\development\Boost then <Your Path> is
31# "C:/development/Boost" and in this directory there will be two
32# directories called "include" and "lib".
33# 1) After CMake runs, set Boost_INCLUDE_DIR to <Your Path>/include/boost<-version>
34# 2) Use CMAKE_INCLUDE_PATH to set a path to <Your Path>/include. This will allow FIND_PATH()
35#    to locate Boost_INCLUDE_DIR by utilizing the PATH_SUFFIXES option. e.g.
36#    SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "<Your Path>/include")
37# 3) Set an environment variable called ${BOOST_ROOT} that points to the root of where you have
38#    installed Boost, e.g. <Your Path>. It is assumed that there is at least a subdirectory called
39#    include in this path.
40#
41# Note:
42#  1) If you are just using the boost headers, then you do not need to use
43#     Boost_LIBRARY_DIRS in your CMakeLists.txt file.
44#  2) If Boost has not been installed, then when setting Boost_LIBRARY_DIRS
45#     the script will look for /lib first and, if this fails, then for /stage/lib.
46#
47# Usage:
48# In your CMakeLists.txt file do something like this:
49# ...
50# # Boost
51# FIND_PACKAGE(Boost)
52# ...
53# INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
54# LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
55
56#
57# TODO:
58#
59# 1) Automatically find the Boost library files and eliminate the need
60#    to use Link Directories.
61#
62
63IF (Boost_INCLUDE_DIR)
64  SET (Boost_INCLUDE_FIND_QUIETLY TRUE)
65ENDIF (Boost_INCLUDE_DIR)
66
67IF(WIN32)
68# In windows, automatic linking is performed, so you do not have to specify the libraries.
69# If you are linking to a dynamic runtime, then you can choose to link to either a static or a
70# dynamic Boost library, the default is to do a static link.  You can alter this for a specific
71# library "whatever" by defining BOOST_WHATEVER_DYN_LINK to force Boost library "whatever" to
72# be linked dynamically.  Alternatively you can force all Boost libraries to dynamic link by
73# defining BOOST_ALL_DYN_LINK.
74
75# This feature can be disabled for Boost library "whatever" by defining BOOST_WHATEVER_NO_LIB,
76# or for all of Boost by defining BOOST_ALL_NO_LIB.
77
78# If you want to observe which libraries are being linked against then defining
79# BOOST_LIB_DIAGNOSTIC will cause the auto-linking code to emit a #pragma message each time
80# a library is selected for linking.
81#  SET(Boost_LIB_DIAGNOSTIC_DEFINITIONS "-DBOOST_LIB_DIAGNOSTIC")
82#  SET(Boost_LIB_PREFIX "lib")
83#  SET(Boost_LIB_SUFFIX "gcc-mt-1_33_1.lib")
84ENDIF(WIN32)
85
86
87SET(BOOST_INCLUDE_PATH_DESCRIPTION "directory containing the boost include files.")
88
89SET(BOOST_DIR_MESSAGE "Set the Boost_INCLUDE_DIR cmake cache entry to the ${BOOST_INCLUDE_PATH_DESCRIPTION}")
90
91SET(BOOST_DIR_SEARCH $ENV{BOOST_ROOT})
92IF(BOOST_DIR_SEARCH)
93  FILE(TO_CMAKE_PATH ${BOOST_DIR_SEARCH} BOOST_DIR_SEARCH)
94  SET(BOOST_DIR_SEARCH ${BOOST_DIR_SEARCH}/include)
95ENDIF(BOOST_DIR_SEARCH)
96
97# Add in some path suffixes. These will have to be updated whenever a new Boost version comes out.
98SET(SUFFIX_FOR_PATH
99 boost
100 boost-1_35_0
101 boost-1_35
102 boost-1_34_1
103 boost-1_34_0
104 boost-1_34
105 boost-1_33_1
106 boost-1_33_0
107)
108
109#
110# Look for an installation.
111#
112FIND_PATH(Boost_INCLUDE_DIR NAMES boost/config.hpp PATH_SUFFIXES ${SUFFIX_FOR_PATH} PATHS
113
114# Look in other places.
115  ${BOOST_DIR_SEARCH}
116
117#    ../libs/boost_1_33_1
118    ../libs/boost_1_34_1
119#    ../libs/boost-1_35_0
120
121# Help the user find it if we cannot.
122  DOC "The ${BOOST_INCLUDE_PATH_DESCRIPTION}"
123)
124
125# Assume we didn't find it.
126SET(Boost_FOUND 0)
127
128# Now try to get the include and library path.
129IF(Boost_INCLUDE_DIR)
130
131# Look for the boost library path.
132# Note that the user may not have installed any libraries
133# so it is quite possible the Boost_LIBRARY_PATH may not exist.
134  SET(Boost_LIBRARY_DIR ${Boost_INCLUDE_DIR})
135
136  IF("${Boost_LIBRARY_DIR}" MATCHES "boost-[0-9]+")
137    GET_FILENAME_COMPONENT(Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR} PATH)
138  ENDIF ("${Boost_LIBRARY_DIR}" MATCHES "boost-[0-9]+")
139
140  IF("${Boost_LIBRARY_DIR}" MATCHES "/include$")
141# Strip off the trailing "/include" in the path.
142    GET_FILENAME_COMPONENT(Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR} PATH)
143  ENDIF("${Boost_LIBRARY_DIR}" MATCHES "/include$")
144
145  IF(EXISTS "${Boost_LIBRARY_DIR}/lib")
146    SET (Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR}/lib)
147  ELSEIF(EXISTS "${Boost_LIBRARY_DIR}/bin/boost/libs/thread/build/boost_thread.dll/gcc/release/threading-multi")
148    SET (Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR}/bin/boost/libs/thread/build/boost_thread.dll/gcc/release/threading-multi)
149  ELSE(EXISTS "${Boost_LIBRARY_DIR}/lib")
150    IF(EXISTS "${Boost_LIBRARY_DIR}/stage/lib")
151      SET(Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR}/stage/lib)
152    ELSE(EXISTS "${Boost_LIBRARY_DIR}/stage/lib")
153      IF(EXISTS "${Boost_LIBRARY_DIR}/../../lib")
154        SET(Boost_LIBRARY_DIR "${Boost_LIBRARY_DIR}/../../lib")
155      ELSE(EXISTS "${Boost_LIBRARY_DIR}/../../lib")
156        SET(Boost_LIBRARY_DIR "")
157      ENDIF(EXISTS "${Boost_LIBRARY_DIR}/../../lib")
158    ENDIF(EXISTS "${Boost_LIBRARY_DIR}/stage/lib")
159  ENDIF(EXISTS "${Boost_LIBRARY_DIR}/lib")
160
161
162  IF(EXISTS "${Boost_INCLUDE_DIR}")
163    SET(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR})
164# We have found boost. It is possible that the user has not
165# compiled any libraries so we set Boost_FOUND to be true here.
166    SET(Boost_FOUND 1)
167    MARK_AS_ADVANCED(Boost_INCLUDE_DIR)
168  ENDIF(EXISTS "${Boost_INCLUDE_DIR}")
169  IF(Boost_LIBRARY_DIR AND EXISTS "${Boost_LIBRARY_DIR}")
170    SET(Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR})
171  ENDIF(Boost_LIBRARY_DIR AND EXISTS "${Boost_LIBRARY_DIR}")
172ENDIF(Boost_INCLUDE_DIR)
173
174
175#
176# Find boost libraries
177#
178
179# List of library suffixes to search, e.g. libboost_date_time-gcc
180SET(BOOST_SUFFIX_SEARCH
181  mt
182  gcc41-mt
183  gcc
184  il
185  gcc-1_33_1
186  gcc-mt-1_33_1
187  mgw34-mt-1_34_1
188  mgw34-mt-1_35
189)
190
191# List of all boost libraries
192SET(BOOST_ALL_LIBRARIES
193  date_time
194  filesystem
195  graph
196  iostreams
197  program_options
198  regex
199  serialization
200  signals
201  unit_test_framework
202  thread
203  wave
204)
205
206# Macro to find boost library called name
207MACRO(BOOST_FIND_LIBRARY name)
208
209# User can specify a particular build variant via the variables:
210#   Boost_LIB_PREFIX, Boost_LIB_SUFFIX, Boost_LIB_SUFFIX_DEBUG
211# otherwise we'll search the BOOST_SUFFIX_SEARCH list
212
213  SET(BOOST_LIB_NAMES ${Boost_LIB_PREFIX}boost_${name}-${Boost_LIB_SUFFIX})
214  IF(NOT Boost_LIB_SUFFIX)
215    FOREACH(suffix ${BOOST_SUFFIX_SEARCH})
216      SET(BOOST_LIB_NAMES ${BOOST_LIB_NAMES} ${Boost_LIB_PREFIX}boost_${name}-${suffix})
217    ENDFOREACH(suffix)
218  ENDIF(NOT Boost_LIB_SUFFIX)
219
220# Find the library in the Boost_LIBRARY_DIRS
221  FIND_LIBRARY(Boost_${name}_LIBRARY
222    NAMES ${BOOST_LIB_NAMES}
223    PATHS ${Boost_LIBRARY_DIRS})
224
225# For MSVC builds find debug library
226  IF(WIN32 AND MSVC AND Boost_${name}_LIBRARY)
227    FIND_LIBRARY(Boost_${name}_LIBRARY_DEBUG ${Boost_LIB_PREFIX}boost_${name}-${Boost_LIB_SUFFIX_DEBUG})
228
229    IF(MSVC_IDE)
230      IF(Boost_${name}_LIBRARY AND Boost_${name}_LIBRARY_DEBUG)
231        SET(Boost_${name}_LIBRARIES debug ${Boost_${name}_LIBRARY_DEBUG} optimized ${Boost_${name}_LIBRARY})
232      ELSE(Boost_${name}_LIBRARY AND Boost_${name}_LIBRARY_DEBUG)
233        MESSAGE(FATAL_ERROR "Could not find the debug and release version of Boost ${name} library.")
234      ENDIF(Boost_${name}_LIBRARY AND Boost_${name}_LIBRARY_DEBUG)
235    ELSE(MSVC_IDE)
236      STRING(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER)
237      IF(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
238        SET(Boost_${name}_LIBRARIES ${Boost_${name}_LIBRARY_DEBUG})
239      ELSE(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
240        SET(Boost_${name}_LIBRARIES ${Boost_${name}_LIBRARY})
241      ENDIF(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
242    ENDIF(MSVC_IDE)
243  ELSE(WIN32 AND MSVC AND Boost_${name}_LIBRARY)
244    SET(Boost_${name}_LIBRARIES ${Boost_${name}_LIBRARY})
245  ENDIF(WIN32 AND MSVC AND Boost_${name}_LIBRARY)
246
247# If we've got it setup appropriate variables or issue error message
248  IF(Boost_${name}_LIBRARY)
249    SET(Boost_${name}_FOUND 1)
250    SET(Boost_${name}_INCLUDE_DIRS ${Boost_INCLUDE_DIR})
251    MARK_AS_ADVANCED(Boost_${name}_LIBRARY Boost_${name}_LIBRARY_DEBUG)
252  ELSE(Boost_${name}_LIBRARY)
253    IF(NOT Boost_FIND_QUIETLY)
254      MESSAGE(SEND_ERROR "Boost ${name} library was not found.")
255    ELSE(NOT Boost_FIND_QUIETLY)
256      IF(Boost_FIND_REQUIRED_${name})
257        MESSAGE(FATAL_ERROR "Could NOT find required Boost ${name} library.")
258      ENDIF(Boost_FIND_REQUIRED_${name})
259    ENDIF(NOT Boost_FIND_QUIETLY)
260  ENDIF(Boost_${name}_LIBRARY)
261ENDMACRO(BOOST_FIND_LIBRARY)
262
263IF(Boost_LIBRARY_DIRS)
264
265# If the user specified required components e.g. via
266# FIND_PACKAGE(Boost REQUIRED date_time regex)
267# find (just) those libraries. Otherwise find all libraries.
268  IF(Boost_FIND_COMPONENTS)
269    SET(Boost_FIND_LIBRARIES ${Boost_FIND_COMPONENTS})
270  ELSE(Boost_FIND_COMPONENTS)
271    SET(Boost_FIND_LIBRARIES ${BOOST_ALL_LIBRARIES})
272  ENDIF(Boost_FIND_COMPONENTS)
273
274  SET(Boost_LIBRARIES)
275  FOREACH(library ${Boost_FIND_LIBRARIES})
276    IF (Boost_${library}_LIBRARY)
277      SET (Boost_${name}_LIBRARY_FIND_QUIETLY TRUE)
278    ENDIF (Boost_${library}_LIBRARY)
279
280    BOOST_FIND_LIBRARY(${library})
281    IF(Boost_${library}_FOUND)
282      SET(Boost_LIBRARIES ${Boost_LIBRARIES} ${Boost_${library}_LIBRARIES})
283      IF (NOT Boost_${name}_LIBRARY_FIND_QUIETLY)
284        MESSAGE(STATUS "Found BoostLibrary: ${library}")
285        IF (VERBOSE_FIND)
286          MESSAGE (STATUS "  library path: ${Boost_${library}_LIBRARIES}")
287        ENDIF (VERBOSE_FIND)
288      ENDIF (NOT Boost_${name}_LIBRARY_FIND_QUIETLY)
289    ENDIF(Boost_${library}_FOUND)
290  ENDFOREACH(library)
291ELSE(Boost_LIBRARY_DIRS)
292  MESSAGE(SEND_ERROR "Boost libraries not found: ${Boost_FIND_COMPONENTS}")
293ENDIF(Boost_LIBRARY_DIRS)
294
295IF(NOT Boost_FOUND)
296  IF(NOT Boost_FIND_QUIETLY)
297    MESSAGE(SEND_ERROR "Boost was not found. ${BOOST_DIR_MESSAGE}")
298  ELSE(NOT Boost_FIND_QUIETLY)
299    IF(Boost_FIND_REQUIRED)
300      MESSAGE(SEND_ERROR "Boost was not found. ${BOOST_DIR_MESSAGE}")
301    ENDIF(Boost_FIND_REQUIRED)
302  ENDIF(NOT Boost_FIND_QUIETLY)
303ELSE(NOT Boost_FOUND)
304  IF (NOT Boost_INCLUDE_FIND_QUIETLY)
305    MESSAGE(STATUS "Boost include path was found.")
306    IF (VERBOSE_FIND)
307      MESSAGE (STATUS "  include path: ${Boost_INCLUDE_DIR}")
308    ENDIF (VERBOSE_FIND)
309  ENDIF (NOT Boost_INCLUDE_FIND_QUIETLY)
310ENDIF(NOT Boost_FOUND)
311
Note: See TracBrowser for help on using the repository browser.