summaryrefslogtreecommitdiffstats
path: root/src/ceph/cmake/modules/BuildBoost.cmake
diff options
context:
space:
mode:
authorQiaowei Ren <qiaowei.ren@intel.com>2018-01-04 13:43:33 +0800
committerQiaowei Ren <qiaowei.ren@intel.com>2018-01-05 11:59:39 +0800
commit812ff6ca9fcd3e629e49d4328905f33eee8ca3f5 (patch)
tree04ece7b4da00d9d2f98093774594f4057ae561d4 /src/ceph/cmake/modules/BuildBoost.cmake
parent15280273faafb77777eab341909a3f495cf248d9 (diff)
initial code repo
This patch creates initial code repo. For ceph, luminous stable release will be used for base code, and next changes and optimization for ceph will be added to it. For opensds, currently any changes can be upstreamed into original opensds repo (https://github.com/opensds/opensds), and so stor4nfv will directly clone opensds code to deploy stor4nfv environment. And the scripts for deployment based on ceph and opensds will be put into 'ci' directory. Change-Id: I46a32218884c75dda2936337604ff03c554648e4 Signed-off-by: Qiaowei Ren <qiaowei.ren@intel.com>
Diffstat (limited to 'src/ceph/cmake/modules/BuildBoost.cmake')
-rw-r--r--src/ceph/cmake/modules/BuildBoost.cmake193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/ceph/cmake/modules/BuildBoost.cmake b/src/ceph/cmake/modules/BuildBoost.cmake
new file mode 100644
index 0000000..1e5bcd5
--- /dev/null
+++ b/src/ceph/cmake/modules/BuildBoost.cmake
@@ -0,0 +1,193 @@
+# This module builds Boost
+# executables are. It sets the following variables:
+#
+# Boost_FOUND : boolean - system has Boost
+# Boost_LIBRARIES : list(filepath) - the libraries needed to use Boost
+# Boost_INCLUDE_DIRS : list(path) - the Boost include directories
+#
+# Following hints are respected
+#
+# Boost_USE_STATIC_LIBS : boolean (default: OFF)
+# Boost_USE_MULTITHREADED : boolean (default: OFF)
+# BOOST_J: integer (defanult 1)
+
+function(do_build_boost version)
+ cmake_parse_arguments(Boost_BUILD "" "" COMPONENTS ${ARGN})
+ set(boost_features "variant=release")
+ if(Boost_USE_MULTITHREADED)
+ list(APPEND boost_features "threading=multi")
+ else()
+ list(APPEND boost_features "threading=single")
+ endif()
+ if(Boost_USE_STATIC_LIBS)
+ list(APPEND boost_features "link=static")
+ else()
+ list(APPEND boost_features "link=shared")
+ endif()
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ list(APPEND boost_features "address-model=64")
+ else()
+ list(APPEND boost_features "address-model=32")
+ endif()
+ set(BOOST_CXXFLAGS "-fPIC -w") # check on arm, etc <---XXX
+ list(APPEND boost_features "cxxflags=${BOOST_CXXFLAGS}")
+
+ string(REPLACE ";" "," boost_with_libs "${Boost_BUILD_COMPONENTS}")
+ # build b2 and prepare the project-config.jam for boost
+ set(configure_command
+ ./bootstrap.sh --prefix=<INSTALL_DIR>
+ --with-libraries=${boost_with_libs})
+
+ set(b2 ./b2)
+ if(BOOST_J)
+ message(STATUS "BUILDING Boost Libraries at j ${BOOST_J}")
+ list(APPEND b2 -j${BOOST_J})
+ endif()
+ if(CMAKE_VERBOSE_MAKEFILE)
+ list(APPEND b2 -d1)
+ else()
+ list(APPEND b2 -d0)
+ endif()
+
+ if(NOT CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL CMAKE_SYSTEM_PROCESSOR)
+ # we are crosscompiling
+ if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
+ set(b2_cc gcc)
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ set(b2_cc clang)
+ else()
+ message(SEND_ERROR "unknown compiler: ${CMAKE_CXX_COMPILER_ID}")
+ endif()
+ # edit the config.jam so, b2 will be able to use the specified toolset
+ execute_process(
+ COMMAND
+ sed -i
+ "s|using ${b2_cc} ;|using ${b2_cc} : ${CMAKE_SYSTEM_PROCESSOR} : ${CMAKE_CXX_COMPILER} ;|"
+ ${PROJECT_SOURCE_DIR}/src/boost/project-config.jam)
+ # use ${CMAKE_SYSTEM_PROCESSOR} as the version identifier of compiler
+ list(APPEND b2 toolset=${b2_cc}-${CMAKE_SYSTEM_PROCESSOR})
+ endif()
+
+ set(build_command
+ ${b2} headers stage
+ #"--buildid=ceph" # changes lib names--can omit for static
+ ${boost_features})
+ set(install_command
+ ${b2} install)
+ set(boost_root_dir "${CMAKE_BINARY_DIR}/boost")
+ if(EXISTS "${PROJECT_SOURCE_DIR}/src/boost/libs/config/include/boost/config.hpp")
+ message(STATUS "boost already in src")
+ set(source_dir
+ SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/boost")
+ elseif(version VERSION_GREATER 1.63)
+ message(FATAL_ERROR "Unknown BOOST_REQUESTED_VERSION: ${version}")
+ else()
+ message(STATUS "boost will be downloaded...")
+ # NOTE: If you change this version number make sure the package is available
+ # at the three URLs below (may involve uploading to download.ceph.com)
+ set(boost_version 1.63.0)
+ set(boost_md5 1c837ecd990bb022d07e7aab32b09847)
+ string(REPLACE "." "_" boost_version_underscore ${boost_version} )
+ set(boost_url
+ https://dl.bintray.com/boostorg/release/${boost_version}/source/boost_${boost_version_underscore}.tar.bz2)
+ if(CMAKE_VERSION VERSION_GREATER 3.7)
+ set(boost_url
+ "${boost_url} http://downloads.sourceforge.net/project/boost/boost/${boost_version}/boost_${boost_version_underscore}.tar.bz2")
+ set(boost_url
+ "${boost_url} https://download.ceph.com/qa/boost_${boost_version_underscore}.tar.bz2")
+ endif()
+ set(source_dir
+ URL ${boost_url}
+ URL_MD5 ${boost_md5})
+ if(CMAKE_VERSION VERSION_GREATER 3.0)
+ list(APPEND source_dir DOWNLOAD_NO_PROGRESS 1)
+ endif()
+ endif()
+ # build all components in a single shot
+ include(ExternalProject)
+ ExternalProject_Add(Boost
+ ${source_dir}
+ CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} ${configure_command}
+ BUILD_COMMAND CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} ${build_command}
+ BUILD_IN_SOURCE 1
+ INSTALL_COMMAND ${install_command}
+ PREFIX "${boost_root_dir}")
+endfunction()
+
+macro(build_boost version)
+ do_build_boost(version ${ARGN})
+ ExternalProject_Get_Property(Boost install_dir)
+ set(Boost_INCLUDE_DIRS ${install_dir}/include)
+ set(Boost_INCLUDE_DIR ${install_dir}/include)
+ # create the directory so cmake won't complain when looking at the imported
+ # target
+ file(MAKE_DIRECTORY ${Boost_INCLUDE_DIRS})
+ cmake_parse_arguments(Boost_BUILD "" "" COMPONENTS ${ARGN})
+ foreach(c ${Boost_BUILD_COMPONENTS})
+ string(TOUPPER ${c} upper_c)
+ if(Boost_USE_STATIC_LIBS)
+ add_library(Boost::${c} STATIC IMPORTED)
+ else()
+ add_library(Boost::${c} SHARED IMPORTED)
+ endif()
+ add_dependencies(Boost::${c} Boost)
+ if(Boost_USE_STATIC_LIBS)
+ set(Boost_${upper_c}_LIBRARY
+ ${install_dir}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}boost_${c}${CMAKE_STATIC_LIBRARY_SUFFIX})
+ else()
+ set(Boost_${upper_c}_LIBRARY
+ ${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}boost_${c}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ endif()
+ set_target_properties(Boost::${c} PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
+ IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
+ IMPORTED_LOCATION "${Boost_${upper_c}_LIBRARY}")
+ list(APPEND Boost_LIBRARIES ${Boost_${upper_c}_LIBRARY})
+ endforeach()
+
+ # for header-only libraries
+ if(CMAKE_VERSION VERSION_LESS 3.3)
+ # only ALIAS and INTERFACE target names allow ":" in it, but
+ # INTERFACE library is not allowed until cmake 3.1
+ add_custom_target(Boost.boost DEPENDS Boost)
+ else()
+ add_library(Boost.boost INTERFACE IMPORTED)
+ set_target_properties(Boost.boost PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}")
+ add_dependencies(Boost.boost Boost)
+ endif()
+ find_package_handle_standard_args(Boost DEFAULT_MSG
+ Boost_INCLUDE_DIRS Boost_LIBRARIES)
+ mark_as_advanced(Boost_LIBRARIES BOOST_INCLUDE_DIRS)
+endmacro()
+
+function(maybe_add_boost_dep target)
+ get_target_property(imported ${target} IMPORTED)
+ if(imported)
+ return()
+ endif()
+ get_target_property(type ${target} TYPE)
+ if(NOT type MATCHES "OBJECT_LIBRARY|STATIC_LIBRARY|SHARED_LIBRARY|EXECUTABLE")
+ return()
+ endif()
+ get_target_property(sources ${target} SOURCES)
+ foreach(src ${sources})
+ get_filename_component(ext ${src} EXT)
+ # assuming all cxx source files include boost header(s)
+ if(ext MATCHES ".cc|.cpp|.cxx")
+ add_dependencies(${target} Boost.boost)
+ return()
+ endif()
+ endforeach()
+endfunction()
+
+# override add_library() to add Boost headers dependency
+function(add_library target)
+ _add_library(${target} ${ARGN})
+ maybe_add_boost_dep(${target})
+endfunction()
+
+function(add_executable target)
+ _add_executable(${target} ${ARGN})
+ maybe_add_boost_dep(${target})
+endfunction()