From 67031c1712eae091dd8c1ffaab43b7d9508bd446 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 19 Nov 2012 08:51:35 +0000 Subject: [PATCH] Fix when statically linking with distro's boost: in this case, we most likely also need to statically link against icu, as most boost packages are built with it. Without that, you get a bunch of errors at link time (when using boost_locale, or, in freestyle branch, boost_regex). So when you enable Boost_USE_STATIC_LIBS, you should also set Boost_USE_ICU to True. Will add a note about that in build doc too. --- CMakeLists.txt | 3 + build_files/cmake/Modules/FindIcuLinux.cmake | 146 +++++++++++++++++++ build_files/cmake/macros.cmake | 3 + 3 files changed, 152 insertions(+) create mode 100644 build_files/cmake/Modules/FindIcuLinux.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index fe1a6d03335..634ada0eecc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -644,6 +644,9 @@ if(UNIX AND NOT APPLE) list(APPEND __boost_packages locale) endif() find_package(Boost 1.34 COMPONENTS ${__boost_packages}) + if(Boost_USE_STATIC_LIBS AND Boost_USE_ICU) + find_package(IcuLinux) + endif() mark_as_advanced(Boost_DIR) # why doesnt boost do this? endif() diff --git a/build_files/cmake/Modules/FindIcuLinux.cmake b/build_files/cmake/Modules/FindIcuLinux.cmake new file mode 100644 index 00000000000..e0e5873a4eb --- /dev/null +++ b/build_files/cmake/Modules/FindIcuLinux.cmake @@ -0,0 +1,146 @@ +# - Find static icu libraries +# Find the native static icu libraries (needed for static boost_locale :/ ). +# This module defines +# ICU_LIBRARIES, libraries to link against to use icu. +# ICU_ROOT_DIR, The base directory to search for icu. +# This can also be an environment variable. +# ICU_FOUND, If false, do not try to use icu. +# +# also defined, but not for general use are +# ICU_LIBRARY_xxx, where to find the icu libraries. + +#============================================================================= +# Copyright 2012 Blender Foundation. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= + +# If ICU_ROOT_DIR was defined in the environment, use it. +IF(NOT ICU_ROOT_DIR AND NOT $ENV{ICU_ROOT_DIR} STREQUAL "") + SET(ICU_ROOT_DIR $ENV{ICU_ROOT_DIR}) +ENDIF() + +if(Boost_USE_STATIC_LIBS) + set(_icu_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) +endif() + +SET(_icu_SEARCH_DIRS + ${ICU_ROOT_DIR} + /usr/local + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave +) + +# We don't need includes, only libs to link against... +#FIND_PATH(ICU_INCLUDE_DIR +# NAMES +# utf.h +# HINTS +# ${_icu_SEARCH_DIRS} +# PATH_SUFFIXES +# include/unicode +#) + +FIND_LIBRARY(ICU_LIBRARY_DATA + NAMES + icudata + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_I18N + NAMES + icui18n + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_IO + NAMES + icuio + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_LE + NAMES + icule + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_LX + NAMES + iculx + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_TU + NAMES + icutu + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +FIND_LIBRARY(ICU_LIBRARY_UC + NAMES + icuuc + HINTS + ${_icu_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +# Restore the original find library ordering +if(Boost_USE_STATIC_LIBS) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_icu_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) +endif() + +# handle the QUIETLY and REQUIRED arguments and set ICU_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Icu DEFAULT_MSG + ICU_LIBRARY_DATA + ICU_LIBRARY_I18N + ICU_LIBRARY_IO + ICU_LIBRARY_LE + ICU_LIBRARY_LX + ICU_LIBRARY_TU + ICU_LIBRARY_UC +) + +IF(ICU_FOUND) + SET(ICU_LIBRARIES ${ICU_LIBRARY_DATA} ${ICU_LIBRARY_I18N} ${ICU_LIBRARY_IO} ${ICU_LIBRARY_LE} ${ICU_LIBRARY_LX} ${ICU_LIBRARY_TU} ${ICU_LIBRARY_UC}) + SET(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR}) +ENDIF(ICU_FOUND) + +MARK_AS_ADVANCED( + ICU_INCLUDE_DIR + ICU_LIBRARY_DATA + ICU_LIBRARY_I18N + ICU_LIBRARY_IO + ICU_LIBRARY_LE + ICU_LIBRARY_LX + ICU_LIBRARY_TU + ICU_LIBRARY_UC +) diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 4f1d34f993c..efa258aa9dc 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -312,6 +312,9 @@ macro(setup_liblinks endif() if(WITH_BOOST) target_link_libraries(${target} ${BOOST_LIBRARIES}) + if(Boost_USE_STATIC_LIBS AND Boost_USE_ICU) + target_link_libraries(${target} ${ICU_LIBRARIES}) + endif() endif() target_link_libraries(${target} ${JPEG_LIBRARIES}) if(WITH_IMAGE_OPENEXR)