#--------------------------------------------------------------------------------------------------- # CheckCompiler.cmake #--------------------------------------------------------------------------------------------------- #---Enable FORTRAN (unfortunatelly is not not possible in all cases)------------------------------- if(fortran AND NOT WIN32 AND NOT CMAKE_GENERATOR STREQUAL Xcode AND NOT CMAKE_GENERATOR STREQUAL Ninja) #--Work-around for CMake issue 0009220 if(DEFINED CMAKE_Fortran_COMPILER AND CMAKE_Fortran_COMPILER MATCHES "^$") set(CMAKE_Fortran_COMPILER CMAKE_Fortran_COMPILER-NOTFOUND) endif() enable_language(Fortran OPTIONAL) endif() #----Get the compiler file name (to ensure re-location)--------------------------------------------- get_filename_component(_compiler_name ${CMAKE_CXX_COMPILER} NAME) get_filename_component(_compiler_path ${CMAKE_CXX_COMPILER} PATH) if("$ENV{PATH}" MATCHES ${_compiler_path}) set(CXX ${_compiler_name}) else() set(CXX ${CMAKE_CXX_COMPILER}) endif() string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) #----Test if clang setup works---------------------------------------------------------------------- if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") exec_program(${CMAKE_CXX_COMPILER} ARGS "--version 2>&1 | grep version" OUTPUT_VARIABLE _clang_version_info) string(REGEX REPLACE "^.*[ ]version[ ]([0-9]+)\\.[0-9]+.*" "\\1" CLANG_MAJOR "${_clang_version_info}") string(REGEX REPLACE "^.*[ ]version[ ][0-9]+\\.([0-9]+).*" "\\1" CLANG_MINOR "${_clang_version_info}") message(STATUS "Found Clang. Major version ${CLANG_MAJOR}, minor version ${CLANG_MINOR}") set(COMPILER_VERSION clang${CLANG_MAJOR}${CLANG_MINOR}) else() set(CLANG_MAJOR 0) set(CLANG_MINOR 0) endif() #---Obtain the major and minor version of the GNU compiler------------------------------------------- if (CMAKE_COMPILER_IS_GNUCXX) exec_program(${CMAKE_C_COMPILER} ARGS "-dumpversion" OUTPUT_VARIABLE _gcc_version_info) string(REGEX REPLACE "^([0-9]+).*$" "\\1" GCC_MAJOR ${_gcc_version_info}) string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*$" "\\1" GCC_MINOR ${_gcc_version_info}) string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" GCC_PATCH ${_gcc_version_info}) if(GCC_PATCH MATCHES "\\.+") set(GCC_PATCH "") endif() if(GCC_MINOR MATCHES "\\.+") set(GCC_MINOR "") endif() if(GCC_MAJOR MATCHES "\\.+") set(GCC_MAJOR "") endif() message(STATUS "Found GCC. Major version ${GCC_MAJOR}, minor version ${GCC_MINOR}") set(COMPILER_VERSION gcc${GCC_MAJOR}${GCC_MINOR}${GCC_PATCH}) else() set(GCC_MAJOR 0) set(GCC_MINOR 0) endif() #---Set a default build type for single-configuration CMake generators if no build type is set------ set(CMAKE_CONFIGURATION_TYPES Release MinSizeRel Debug RelWithDebInfo) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: Release, MinSizeRel, Debug, RelWithDebInfo." FORCE) endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) #---Check for cxx11 option------------------------------------------------------------ if(cxx11) CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CXX11) if(NOT HAS_CXX11) message(STATUS "Current compiler does not suppport -std=c++11 option. Switching OFF cxx11 option") set(cxx11 OFF CACHE BOOL "" FORCE) endif() endif() #---Check for other compiler flags------------------------------------------------------------------- CHECK_CXX_COMPILER_FLAG("-Wno-array-bounds" CXX_HAS_Wno-array-bounds) #---Need to locate thead libraries and options to set properly some compilation flags---------------- find_package(Threads) if(CMAKE_USE_PTHREADS_INIT) set(CMAKE_THREAD_FLAG -pthread) else() set(CMAKE_THREAD_FLAG) endif() #---Setup details depending opn the major platform type---------------------------------------------- if(CMAKE_SYSTEM_NAME MATCHES Linux) include(SetUpLinux) elseif(APPLE) include(SetUpMacOS) elseif(WIN32) include(SetupWindows) endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_FLAG}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_THREAD_FLAG}") if(cxx11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") endif() endif() if(libcxx) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() if(gcctoolchain) CHECK_CXX_COMPILER_FLAG("--gcc-toolchain=${gcctoolchain}" HAS_GCCTOOLCHAIN) if(HAS_GCCTOOLCHAIN) set(CMAKE_CXX_FLAGS "--gcc-toolchain=${gcctoolchain} ${CMAKE_CXX_FLAGS}") endif() endif() if(gnuinstall) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DR__HAVE_CONFIG") endif() #---Check whether libc++ is used or not--------------------------------------------------------------- file(WRITE ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/empty.cxx "") set(_command ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -v -x c++ -E ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/empty.cxx) separate_arguments(_command) execute_process(COMMAND ${_command} OUTPUT_QUIET ERROR_VARIABLE _output) if(_output MATCHES "-stdlib=libc[+][+]") set(USING_LIBCXX 1) endif() #---Print the final compiler flags-------------------------------------------------------------------- message(STATUS "ROOT Platform: ${ROOT_PLATFORM}") message(STATUS "ROOT Architecture: ${ROOT_ARCHITECTURE}") message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS "Compiler Flags: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}")