diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f92ab1..c0345d9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,95 +10,100 @@ option(ENABLE_API21 "Build for 2.1 API." OFF) option(FORCE_32BIT_BIN "Create a 32-bit executable binary if the compiler defaults to 64-bit." OFF) # This option should only be available in certain conditions if(WIN32 AND MINGW) - option(COPY_DEPENDENCIES "Copy deppendent DLLs into the deps folder." OFF) + option(COPY_DEPENDENCIES "Copy deppendent DLLs into the deps folder." OFF) endif() +# C++14 is mandatory +set(CPP_STD_NUMBER 14) + include(CheckCXXCompilerFlag) # C++ standard availability check -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - check_cxx_compiler_flag(-std=c++20 HAVE_FLAG_STD_CXX20) - check_cxx_compiler_flag(-std=c++2a HAVE_FLAG_STD_CXX2A) - if(HAVE_FLAG_STD_CXX20 OR HAVE_FLAG_STD_CXX2A) - # We can use C++20 - set(CPP_STD_NUMBER 20) - # Specific flags - if (HAVE_FLAG_STD_CXX2A AND NOT HAVE_FLAG_STD_CXX20) - set(CPP_STD_COMPILER_FLAG "-std=c++20") - else() - set(CPP_STD_COMPILER_FLAG "-std=c++2a") - endif() - # Need these workarounds for older CMake - if(${CMAKE_VERSION} VERSION_LESS "3.8.0") - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) - set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20") - set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20") - elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) - set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a") - set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a") - endif() - endif() - else() - check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) - check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) - if(HAVE_FLAG_STD_CXX17 OR HAVE_FLAG_STD_CXX1Z) - # We can use C++17 - set(CPP_STD_NUMBER 17) - # Specific flags - if (HAVE_FLAG_STD_CXX17 AND NOT HAVE_FLAG_STD_CXX1Z) - set(CPP_STD_COMPILER_FLAG "-std=c++17") - else() - set(CPP_STD_COMPILER_FLAG "-std=c++1z") - endif() - # Need these workarounds for older CMake - if(${CMAKE_VERSION} VERSION_LESS "3.8.0") - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) - set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17") - set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17") - elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) - set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z") - set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z") - endif() - endif() - else() - # C++14 is mandatory - set(CPP_STD_NUMBER 14) - # Specific flags - set(CPP_STD_COMPILER_FLAG "-std=c++14") - endif() - endif() +if(${CMAKE_CXX_COMPILER_ID} MATCHES "(GNU)+") + # Specific flags + set(CPP_STD_COMPILER_FLAG "-std=c++14") + # Don't even bother with previous version + if(CPP_STD_NUMBER LESS 20 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + check_cxx_compiler_flag(-std=c++20 HAVE_FLAG_STD_CXX20) + check_cxx_compiler_flag(-std=c++2a HAVE_FLAG_STD_CXX2A) + if(HAVE_FLAG_STD_CXX20 OR HAVE_FLAG_STD_CXX2A) + # We can use C++20 + set(CPP_STD_NUMBER 20) + # Specific flags + if (HAVE_FLAG_STD_CXX2A AND NOT HAVE_FLAG_STD_CXX20) + set(CPP_STD_COMPILER_FLAG "-std=c++2a") + else() + set(CPP_STD_COMPILER_FLAG "-std=c++20") + endif() + # Need these workarounds for older CMake + if(${CMAKE_VERSION} VERSION_LESS "3.8.0") + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) + set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20") + set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20") + elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a") + set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a") + endif() + endif() + endif() + endif() + # Don't even bother with previous version + if(CPP_STD_NUMBER LESS 17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) + check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) + check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) + if(HAVE_FLAG_STD_CXX17 OR HAVE_FLAG_STD_CXX1Z) + # We can use C++17 + set(CPP_STD_NUMBER 17) + # Specific flags + if (HAVE_FLAG_STD_CXX1Z AND NOT HAVE_FLAG_STD_CXX17) + set(CPP_STD_COMPILER_FLAG "-std=c++1z") + else() + set(CPP_STD_COMPILER_FLAG "-std=c++17") + endif() + # Need these workarounds for older CMake + if(${CMAKE_VERSION} VERSION_LESS "3.8.0") + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17") + set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17") + elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) + set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z") + set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z") + endif() + endif() + endif() + endif() else() - # C++14 is mandatory - set(CPP_STD_NUMBER 14) + # C++14 is mandatory + set(CPP_STD_NUMBER 14) endif() message(STATUS "SqMod: Using C++${CPP_STD_NUMBER} standard.") # Default to the identified standard if(CMAKE_VERSION VERSION_LESS "3.1") - if(${CMAKE_CXX_COMPILER_ID} MATCHES "(GNU)+") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPP_STD_COMPILER_FLAG}") - endif() + if(${CMAKE_CXX_COMPILER_ID} MATCHES "(GNU)+") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPP_STD_COMPILER_FLAG}") + endif() else() - # Apparently the above does not work with cmake from on debian 8 - if(${CMAKE_CXX_COMPILER_ID} MATCHES "(GNU)+") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPP_STD_COMPILER_FLAG}") - endif() - # F* you too Debian. What can I say. - if(CMAKE_VERSION VERSION_LESS "3.8.0" AND CPP_STD_NUMBER LESS 17) - # Try the standard method as well - set(CMAKE_CXX_STANDARD ${CPP_STD_NUMBER}) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - endif() + # Apparently the above does not work with cmake from on debian 8 + if(${CMAKE_CXX_COMPILER_ID} MATCHES "(GNU)+") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CPP_STD_COMPILER_FLAG}") + endif() + # F* you too Debian. What can I say. + if(CMAKE_VERSION VERSION_LESS "3.8.0" AND CPP_STD_NUMBER LESS 17) + # Try the standard method as well + set(CMAKE_CXX_STANDARD ${CPP_STD_NUMBER}) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + endif() endif() # Determine if build mode if(${CMAKE_BUILD_TYPE} MATCHES "(Debug)+") - add_compile_options(-g) + add_compile_options(-g) endif() # Enable position independent code if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() # Include vendor libraries