unix-conf/.emacs.d/elpa/irony-20160203.1207/server/cmake/utils.cmake
2016-02-18 14:53:30 +01:00

140 lines
4.2 KiB
CMake

include(CheckCXXCompilerFlag)
include(CheckCXXSourceCompiles)
#
# check_for_in_source_build()
#
function(check_for_in_source_build)
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
message(FATAL_ERROR "In-source builds are not allowed.
Please create a build/ directory and run cmake from there, passing
the path to this source directory as the last argument. This process
created the file `CMakeCache.txt' and the directory `CMakeFiles'.
Please delete them.
")
endif()
endfunction()
#
# release_as_default_build_type()
#
function(release_as_default_build_type)
# Set a default build type if none was specified for build systems with a
# unique configuration type (i.e: Make/Ninja builds)
if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
message(STATUS "Setting build type to 'Release' as none was specified")
set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
endfunction()
#
# add_compile_options_(<opts...>)
#
# Adds options to the compiler command line for sources in the current directory
# and below.
#
# note: add_compile_options() backport, which first appeared in CMake 2.8.12
function(add_compile_options_)
# possible to check with:
# if (${CMAKE_VERSION} VERSION_LESS "2.8.12")
if (COMMAND add_compile_options)
add_compile_options(${ARGN})
else()
add_definitions(${ARGN})
endif()
endfunction()
#
# enable_colored_diagnotics()
#
# Setup the flag to enable colored diagnostics if any.
#
# For now this option is enforced only for Ninja builds, where compiler output
# is redirected to pipes.
#
# Clang has '-fcolor-diagnostics' for a long time now. Since GCC 4.9, a similar
# flag has been added '-fdiagnostics-color' (somehow they managed to use another
# syntax than Clang's one...). Recent version of Clang will support both as they
# added support for GCC's -fdiagnostics-color.
#
function(enable_colored_diagnotics)
if (${CMAKE_GENERATOR} MATCHES "Ninja")
# Clang
check_cxx_compiler_flag("-fcolor-diagnostics" HAS_FCOLOR_DIAGNOSTICS_FLAG)
if (HAS_FCOLOR_DIAGNOSTICS_FLAG)
add_compile_options_(-fcolor-diagnostics)
else() # GCC (and Clang for compatibility with GCC)
check_cxx_compiler_flag("-fdiagnostics-color" HAS_DIAGNOSTICS_FCOLOR_FLAG)
if (HAS_DIAGNOSTICS_FCOLOR_FLAG)
add_compile_options_(-fdiagnostics-color)
endif()
endif()
endif()
endfunction()
#
# check_cxx11_options()
#
# Throws a FATAL_ERROR if C++11 isn't available otherwise sets:
# - CXX11_COMPILE_OPTIONS
# - CXX11_LINK_OPTIONS
#
function(check_cxx11_options)
if (CXX11_COMPILE_OPTIONS)
return() # already in cache
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
check_cxx_compiler_flag("-std=c++11" HAS_STDCXX11)
if (HAS_STDCXX11)
set(compile_options -std=c++11)
else()
check_cxx_compiler_flag("-std=c++0x" HAS_STDCXX0X)
if (HAS_STDCXX0X)
set(compile_options -std=c++0x)
endif()
endif()
# Check whether or not the system library provides proper C++11 support, if
# not we try to link specifically against libc++.
#
# This seems useful for Mac OS X builds, see:
# http://cplusplusmusings.wordpress.com/2012/07/05/clang-and-standard-libraries-on-mac-os-x/
set(CMAKE_REQUIRED_FLAGS ${compile_options})
check_cxx_source_compiles("#include <random>
int main() {
std::random_device rd;
std::default_random_engine e(rd());
std::uniform_int_distribution<int> dist(0, 15);
return dist(e);
}
"
HAS_CXX11_STDLIB)
if (NOT HAS_CXX11_STDLIB)
check_cxx_compiler_flag("-stdlib=libc++" HAS_LIBCXX)
if (HAS_LIBCXX)
list(APPEND compile_options -stdlib=libc++)
list(APPEND link_options -stdlib=libc++)
else()
message(FATAL_ERROR "Standard library doesn't support C++11!")
endif()
endif()
endif()
if (compile_options)
message(STATUS "C++11 compiler option(s): ${compile_options}")
endif()
set(CXX11_COMPILE_OPTIONS ${compile_options} CACHE INTERNAL
"C++11 compile options, if any")
set(CXX11_LINK_OPTIONS ${link_options} CACHE INTERNAL
"C++11 link options, if any")
endfunction()