From 6b1a6958c4b4a7a2824b3cc0c125758e26bd380f Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Fri, 1 Aug 2014 14:24:56 +0100 Subject: [PATCH] CMake function for adding compiler flags --- CMakeLists.txt | 34 ++++++++--------------------- cmake/AddCXXCompilerFlag.cmake | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 cmake/AddCXXCompilerFlag.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c1ad616f..ade38436 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,10 +20,8 @@ include_directories(${source_dir}/include) ExternalProject_Get_Property(googletest binary_dir) link_directories(${binary_dir}) -# Set up the compiler flags -include(CheckCXXCompilerFlag) - # Enable the latest C++ standard possible +include(CheckCXXCompilerFlag) check_cxx_compiler_flag(--std=c++14 HAVE_FLAG_CXX_14) check_cxx_compiler_flag(--std=c++11 HAVE_FLAG_CXX_11) check_cxx_compiler_flag(--std=c++0x HAVE_FLAG_CXX_0X) @@ -36,32 +34,18 @@ elseif (HAVE_FLAG_CXX_0X) endif() # Turn compiler warnings up to 11 -check_cxx_compiler_flag(-Wall HAVE_FLAG_WALL) -if (HAVE_FLAG_WALL) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -endif() -check_cxx_compiler_flag(-Wshadow HAVE_FLAG_WSHADOW) -if (HAVE_FLAG_WSHADOW) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wshadow") -endif() -check_cxx_compiler_flag(-Werror HAVE_FLAG_WERROR) -if (HAVE_FLAG_WERROR) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") -endif() -check_cxx_compiler_flag(-pedantic-errors HAVE_FLAG_PEDANTIC_ERRORS) -if (HAVE_FLAG_PEDANTIC_ERRORS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors") -endif() +include(AddCXXCompilerFlag) +add_cxx_compiler_flag(-Wall) +add_cxx_compiler_flag(-Wshadow) +add_cxx_compiler_flag(-Werror) +add_cxx_compiler_flag(-pedantic-errors) + +# Release flags +add_cxx_compiler_flag(-fno-strict-aliasing RELEASE) # Add a debug definition so we can make decisions in the compilation set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") -# We relax the aliasing in release -check_cxx_compiler_flag(-fno-strict-aliasing HAVE_FLAG_NO_STRICT_ALIASING) -if (HAVE_FLAG_NO_STRICT_ALIASING) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-strict-aliasing") -endif() - # Set OS if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") add_definitions(-DOS_MACOSX) diff --git a/cmake/AddCXXCompilerFlag.cmake b/cmake/AddCXXCompilerFlag.cmake new file mode 100644 index 00000000..d4a2de05 --- /dev/null +++ b/cmake/AddCXXCompilerFlag.cmake @@ -0,0 +1,39 @@ +# - Adds a compiler FLAG if it is supported by the compiler +# +# This function checks that the supplied compiler FLAG is supported and then +# adds it to the corresponding compiler FLAGs +# +# add_cxx_compiler_FLAG( []) +# +# - Example +# +# include(AddCXXCompilerFlag) +# add_cxx_compiler_FLAG(-Wall) +# add_cxx_compiler_FLAG(-no-strict-aliasing RELEASE) +# Requires CMake 2.6+ + +if(__add_cxx_compiler_FLAG) + return() +endif() +set(__add_cxx_compiler_FLAG INCLUDED) + +include(CheckCXXCompilerFlag) + +function(add_cxx_compiler_flag FLAG) + if(ARGV1) + set(VARIANT ${ARGV1}) + string(TOLOWER ${VARIANT} VARIANT) + set(VARIANT " ${VARIANT}") + endif() + message("-- Check compiler${VARIANT} flag ${FLAG}") + string(TOUPPER ${FLAG} SANITIZED_FLAG) + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" ${SANITIZED_FLAG} SANITIZED_FLAG) + check_cxx_compiler_flag(${FLAG} ${SANITIZED_FLAG}) + if(${SANITIZED_FLAG}) + message("-- Check compiler${VARIANT} flag ${FLAG} -- works") + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" "${VARIANT}" VARIANT) + string(TOUPPER "${VARIANT}" VARIANT) + set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS}${VARIANT} ${FLAG}" PARENT_SCOPE) + endif() +endfunction() +