diff --git a/CMakeLists.txt b/CMakeLists.txt index 2030910..9acdc26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,67 @@ set(VERSION_MAJOR 1) set(VERSION_MINOR 0) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}") -set(CMAKE_CXX_FLAGS_RELEASE "-std=c++0x -Wall -DNDEBUG") -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -std=c++0x -Wall -Wextra -DDEBUG") +# try_compile does not remove the temporary build directory, so put it in CMakeFiles... +# Also: use absolute paths; cmake chokes on relative paths :-( +try_compile(CXX_C0X_SUPPORTED "${CMAKE_HOME_DIRECTORY}/CMakeFiles/CMakeTmp/c0x-test" "${CMAKE_HOME_DIRECTORY}/empty.cpp" CMAKE_FLAGS "-std=c++0x") +if(CXX_C0X_SUPPORTED) + # Yes, I *know* c++0x is *not* an official C++ standard... + message(STATUS "Compiler: C++ standard version 'c++0x' is supported") +elseif(CXX_C0X_SUPPORTED) + message(FATAL_ERROR "Compiler: C++ standard version c++0x is not supported") +endif(CXX_C0X_SUPPORTED) +try_compile(CXX_C11_SUPPORTED "${CMAKE_HOME_DIRECTORY}/CMakeFiles/CMakeTmp/c11-test" "${CMAKE_HOME_DIRECTORY}/empty.cpp" CMAKE_FLAGS "-std=c++11") +if(CXX_C11_SUPPORTED) + message(STATUS "Compiler: C++ standard version 'c++11' is supported") +else(CXX_C11_SUPPORTED) + message(STATUS "Compiler: C++ standard version 'c++11' is not supported") +endif(CXX_C11_SUPPORTED) + +# Determine C++ standard to use +# If CXX_CXX_STANDARD is empty, use autodetected c++ standard version +set(CXX_CXX_STANDARD "" CACHE STRING "C++ standard version to use. Leave empty, or set to c++11 or c++0x") +string(COMPARE NOTEQUAL "${CXX_CXX_STANDARD}" "" CXX_CXX_STANDARD_OVERRIDE) +if(CXX_CXX_STANDARD_OVERRIDE) + string(COMPARE EQUAL "${CXX_CXX_STANDARD}" "c++11" CXX_C11_REQUESTED) + string(COMPARE EQUAL "${CXX_CXX_STANDARD}" "c++0x" CXX_C0X_REQUESTED) + if(CXX_C11_REQUESTED AND CXX_C11_SUPPORTED) + message(STATUS "Compiler: C++ standard version 'c++11' selected (as requested)") + set(CXX_USE_CXX_STANDARD "c++11") + elseif(CXX_C11_REQUESTED AND NOT CXX_C11_SUPPORTED) + message(FATAL_ERROR "Compiler: requested standard version '${CXX_CXX_STANDARD}' is not supported") + elseif(CXX_C0X_REQUESTED) + message(STATUS "Compiler: C++ standard version 'c++0x' selected (as requested)") + set(CXX_USE_CXX_STANDARD "c++0x") + else(CXX_C11_REQUESTED AND CXX_C11_SUPPORTED) + message(FATAL_ERROR "Unrecognised c++ standard version requested: ${CXX_CXX_STANDARD}") + endif(CXX_C11_REQUESTED AND CXX_C11_SUPPORTED) +else(CXX_CXX_STANDARD_OVERRIDE) + if(CXX_C11_SUPPORTED) + message(STATUS "Compiler: C++ standard version 'c++11' selected") + set(CXX_USE_CXX_STANDARD "c++11") + else(CXX_C11_SUPPORTED) + message(STATUS "Compiler: C++ standard version 'c++0x' selected (c++11 not supported)") + set(CXX_USE_CXX_STANDARD "c++0x") + endif(CXX_C11_SUPPORTED) +endif(CXX_CXX_STANDARD_OVERRIDE) + +# Clean targets after change in c++ standard, and remember current standard +string(COMPARE EQUAL "${CXX_CXX_STANDARD_LAST}" "" FIRST_CXX_STANDARD) +string(COMPARE NOTEQUAL "${CXX_CXX_STANDARD_LAST}" "${CXX_USE_CXX_STANDARD}" DIFFERENT_CXX_STANDARD) +set(CXX_CXX_STANDARD_LAST_TEMP "${CXX_CXX_STANDARD_LAST}") +set(CXX_CXX_STANDARD_LAST "${CXX_USE_CXX_STANDARD}" CACHE INTERNAL "Internal use - do not modify") +if(DIFFERENT_CXX_STANDARD AND NOT FIRST_CXX_STANDARD) + execute_process(COMMAND "${CMAKE_BUILD_TOOL}" clean RESULT_VARIABLE CLEANING_RESULT OUTPUT_QUIET ERROR_QUIET) + if(CLEANING_RESULT) + message(STATUS "Clean previous build because of standard change (was: '${CXX_CXX_STANDARD_LAST_TEMP}') (exit: ${CLEANING_RESULT})") + else(CLEANING_RESULT) + message(STATUS "Clean previous build because of standard change (was: '${CXX_CXX_STANDARD_LAST_TEMP}')") + endif(CLEANING_RESULT) +endif(DIFFERENT_CXX_STANDARD AND NOT FIRST_CXX_STANDARD) + +set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_USE_CXX_STANDARD} -Wall -DNDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -std=${CXX_USE_CXX_STANDARD} -Wall -Wextra -DDEBUG") + # Find libgd find_library(LIBGD_LIBRARY gd) diff --git a/empty.cpp b/empty.cpp new file mode 100644 index 0000000..c13d533 --- /dev/null +++ b/empty.cpp @@ -0,0 +1,6 @@ +// File used by cmake to check for c++11 support +// See: CmakeLists.txt + +// Just a symbol named 'main' is required for compilation to succeed. +// It does not have to be a function :-) +int main;