Changeset View
Changeset View
Standalone View
Standalone View
build_files/cmake/macros.cmake
| Show First 20 Lines • Show All 853 Lines • ▼ Show 20 Lines | |||||
| # Only print message if running CMake first time | # Only print message if running CMake first time | ||||
| macro(message_first_run) | macro(message_first_run) | ||||
| if(FIRST_RUN) | if(FIRST_RUN) | ||||
| message(${ARGV}) | message(${ARGV}) | ||||
| endif() | endif() | ||||
| endmacro() | endmacro() | ||||
| macro(TEST_UNORDERED_MAP_SUPPORT) | |||||
| # - Detect unordered_map availability | |||||
| # Test if a valid implementation of unordered_map exists | |||||
| # and define the include path | |||||
| # This module defines | |||||
| # HAVE_UNORDERED_MAP, whether unordered_map implementation was found | |||||
| # | |||||
| # HAVE_STD_UNORDERED_MAP_HEADER, <unordered_map.h> was found | |||||
| # HAVE_UNORDERED_MAP_IN_STD_NAMESPACE, unordered_map is in namespace std | |||||
| # HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE, unordered_map is in namespace std::tr1 | |||||
| # | |||||
| # UNORDERED_MAP_INCLUDE_PREFIX, include path prefix for unordered_map, if found | |||||
| # UNORDERED_MAP_NAMESPACE, namespace for unordered_map, if found | |||||
| include(CheckIncludeFileCXX) | |||||
| # Workaround for newer GCC (6.x+) where C++11 was enabled by default, which lead us | |||||
| # to a situation when there is <unordered_map> include but which can't be used uless | |||||
| # C++11 is enabled. | |||||
| if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "6.0") AND (NOT WITH_CXX11)) | |||||
| set(HAVE_STD_UNORDERED_MAP_HEADER False) | |||||
| else() | |||||
| CHECK_INCLUDE_FILE_CXX("unordered_map" HAVE_STD_UNORDERED_MAP_HEADER) | |||||
| endif() | |||||
| if(HAVE_STD_UNORDERED_MAP_HEADER) | |||||
| # Even so we've found unordered_map header file it doesn't | |||||
| # mean unordered_map and unordered_set will be declared in | |||||
| # std namespace. | |||||
| # | |||||
| # Namely, MSVC 2008 have unordered_map header which declares | |||||
| # unordered_map class in std::tr1 namespace. In order to support | |||||
| # this, we do extra check to see which exactly namespace is | |||||
| # to be used. | |||||
| include(CheckCXXSourceCompiles) | |||||
| CHECK_CXX_SOURCE_COMPILES("#include <unordered_map> | |||||
| int main() { | |||||
| std::unordered_map<int, int> map; | |||||
| return 0; | |||||
| }" | |||||
| HAVE_UNORDERED_MAP_IN_STD_NAMESPACE) | |||||
| if(HAVE_UNORDERED_MAP_IN_STD_NAMESPACE) | |||||
| message_first_run(STATUS "Found unordered_map/set in std namespace.") | |||||
| set(HAVE_UNORDERED_MAP "TRUE") | |||||
| set(UNORDERED_MAP_INCLUDE_PREFIX "") | |||||
| set(UNORDERED_MAP_NAMESPACE "std") | |||||
| else() | |||||
| CHECK_CXX_SOURCE_COMPILES("#include <unordered_map> | |||||
| int main() { | |||||
| std::tr1::unordered_map<int, int> map; | |||||
| return 0; | |||||
| }" | |||||
| HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) | |||||
| if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) | |||||
| message_first_run(STATUS "Found unordered_map/set in std::tr1 namespace.") | |||||
| set(HAVE_UNORDERED_MAP "TRUE") | |||||
| set(UNORDERED_MAP_INCLUDE_PREFIX "") | |||||
| set(UNORDERED_MAP_NAMESPACE "std::tr1") | |||||
| else() | |||||
| message_first_run(STATUS "Found <unordered_map> but cannot find either std::unordered_map " | |||||
| "or std::tr1::unordered_map.") | |||||
| endif() | |||||
| endif() | |||||
| else() | |||||
| CHECK_INCLUDE_FILE_CXX("tr1/unordered_map" HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) | |||||
| if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) | |||||
| message_first_run(STATUS "Found unordered_map/set in std::tr1 namespace.") | |||||
| set(HAVE_UNORDERED_MAP "TRUE") | |||||
| set(UNORDERED_MAP_INCLUDE_PREFIX "tr1") | |||||
| set(UNORDERED_MAP_NAMESPACE "std::tr1") | |||||
| else() | |||||
| message_first_run(STATUS "Unable to find <unordered_map> or <tr1/unordered_map>. ") | |||||
| endif() | |||||
| endif() | |||||
| endmacro() | |||||
| macro(TEST_SHARED_PTR_SUPPORT) | |||||
| # This check are coming from Ceres library. | |||||
| # | |||||
| # Find shared pointer header and namespace. | |||||
| # | |||||
| # This module defines the following variables: | |||||
| # | |||||
| # SHARED_PTR_FOUND: TRUE if shared_ptr found. | |||||
| # SHARED_PTR_TR1_MEMORY_HEADER: True if <tr1/memory> header is to be used | |||||
| # for the shared_ptr object, otherwise use <memory>. | |||||
| # SHARED_PTR_TR1_NAMESPACE: TRUE if shared_ptr is defined in std::tr1 namespace, | |||||
| # otherwise it's assumed to be defined in std namespace. | |||||
| include(CheckIncludeFileCXX) | |||||
| include(CheckCXXSourceCompiles) | |||||
| set(SHARED_PTR_FOUND FALSE) | |||||
| # Workaround for newer GCC (6.x+) where C++11 was enabled by default, which lead us | |||||
| # to a situation when there is <unordered_map> include but which can't be used uless | |||||
| # C++11 is enabled. | |||||
| if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "6.0") AND (NOT WITH_CXX11)) | |||||
| set(HAVE_STD_MEMORY_HEADER False) | |||||
| else() | |||||
| CHECK_INCLUDE_FILE_CXX(memory HAVE_STD_MEMORY_HEADER) | |||||
| endif() | |||||
| if(HAVE_STD_MEMORY_HEADER) | |||||
| # Finding the memory header doesn't mean that shared_ptr is in std | |||||
| # namespace. | |||||
| # | |||||
| # In particular, MSVC 2008 has shared_ptr declared in std::tr1. In | |||||
| # order to support this, we do an extra check to see which namespace | |||||
| # should be used. | |||||
| CHECK_CXX_SOURCE_COMPILES("#include <memory> | |||||
| int main() { | |||||
| std::shared_ptr<int> int_ptr; | |||||
| return 0; | |||||
| }" | |||||
| HAVE_SHARED_PTR_IN_STD_NAMESPACE) | |||||
| if(HAVE_SHARED_PTR_IN_STD_NAMESPACE) | |||||
| message_first_run("-- Found shared_ptr in std namespace using <memory> header.") | |||||
| set(SHARED_PTR_FOUND TRUE) | |||||
| else() | |||||
| CHECK_CXX_SOURCE_COMPILES("#include <memory> | |||||
| int main() { | |||||
| std::tr1::shared_ptr<int> int_ptr; | |||||
| return 0; | |||||
| }" | |||||
| HAVE_SHARED_PTR_IN_TR1_NAMESPACE) | |||||
| if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE) | |||||
| message_first_run("-- Found shared_ptr in std::tr1 namespace using <memory> header.") | |||||
| set(SHARED_PTR_TR1_NAMESPACE TRUE) | |||||
| set(SHARED_PTR_FOUND TRUE) | |||||
| endif() | |||||
| endif() | |||||
| endif() | |||||
| if(NOT SHARED_PTR_FOUND) | |||||
| # Further, gcc defines shared_ptr in std::tr1 namespace and | |||||
| # <tr1/memory> is to be included for this. And what makes things | |||||
| # even more tricky is that gcc does have <memory> header, so | |||||
| # all the checks above wouldn't find shared_ptr. | |||||
| CHECK_INCLUDE_FILE_CXX("tr1/memory" HAVE_TR1_MEMORY_HEADER) | |||||
| if(HAVE_TR1_MEMORY_HEADER) | |||||
| CHECK_CXX_SOURCE_COMPILES("#include <tr1/memory> | |||||
| int main() { | |||||
| std::tr1::shared_ptr<int> int_ptr; | |||||
| return 0; | |||||
| }" | |||||
| HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER) | |||||
| if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER) | |||||
| message_first_run("-- Found shared_ptr in std::tr1 namespace using <tr1/memory> header.") | |||||
| set(SHARED_PTR_TR1_MEMORY_HEADER TRUE) | |||||
| set(SHARED_PTR_TR1_NAMESPACE TRUE) | |||||
| set(SHARED_PTR_FOUND TRUE) | |||||
| endif() | |||||
| endif() | |||||
| endif() | |||||
| endmacro() | |||||
| # when we have warnings as errors applied globally this | # when we have warnings as errors applied globally this | ||||
| # needs to be removed for some external libs which we dont maintain. | # needs to be removed for some external libs which we dont maintain. | ||||
| # utility macro | # utility macro | ||||
| macro(remove_cc_flag | macro(remove_cc_flag | ||||
| _flag) | _flag) | ||||
| foreach(flag ${ARGV}) | foreach(flag ${ARGV}) | ||||
| ▲ Show 20 Lines • Show All 586 Lines • Show Last 20 Lines | |||||