--- CMakeLists.txt.orig +++ CMakeLists.txt @@ -131,9 +131,16 @@ MESSAGE(status "Skipping compiler version check.") ENDIF() -# Configure C++ standard if not externally specified (will actually be -# set after CppUnit check below). Use the variable CMAKE_CXX_STANDARD -# since it will actually be used for this purposes starting in CMake 3.1. +######################################################################## +# Configure C++ standard if not externally specified. Use the variable +# CMAKE_CXX_STANDARD since it will actually be used for this purposes +# starting in CMake 3.1. +######################################################################## + +# save current setting, if provided +IF(CMAKE_CXX_STANDARD) + SET(CMAKE_CXX_STANDARD_EXT ${CMAKE_CXX_STANDARD}) +ENDIF() IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") SET(CMAKE_CXX_STANDARD 98) @@ -142,19 +149,129 @@ ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") SET(CMAKE_CXX_STANDARD 98) ELSE() - message(warning "C++ standard could not be set because compiler is not GNU, Clang or MSVC.") + MESSAGE(WARNING "C++ standard could not be set because compiler is not GNU, Clang, or MSVC.") +ENDIF() + +# if the CXX standard was provided externally, make sure it meets GR's minimum +IF(CMAKE_CXX_STANDARD_EXT) + # verify that the provided C++ standard is one CMake + # accepts. options are 90, 99, and 11 as of CMake 3.11.4 (with 20 + # coming in 3.12). + IF(NOT ${CMAKE_CXX_STANDARD_EXT} VERSION_EQUAL "98" AND + NOT ${CMAKE_CXX_STANDARD_EXT} VERSION_EQUAL "11" AND + NOT ${CMAKE_CXX_STANDARD_EXT} VERSION_EQUAL "14" AND + NOT ${CMAKE_CXX_STANDARD_EXT} VERSION_EQUAL "17") + MESSAGE(WARNING "Requested C++ standard (${CMAKE_CXX_STANDARD_EXT}) isn't recognized by CMake; expecting one of 98, 11, 14, or 17. Ignoring and using the GNU Radio default C++ standard (${CMAKE_CXX_STANDARD}).") + SET(CMAKE_CXX_STANDARD_EXT ${CMAKE_CXX_STANDARD}) + ENDIF() + # fix settings to be comparables. It will be -many- years until we + # have to worry about this value getting large enough to wrap + # around (to 90), so just add 100 to any value not in the 90's, + # for comparison sake. + IF(${CMAKE_CXX_STANDARD} VERSION_EQUAL "98") + # just copy the value + SET(CMAKE_CXX_STANDARD_CMP ${CMAKE_CXX_STANDARD}) + ELSE() + # add 100 to the value + MATH(EXPR CMAKE_CXX_STANDARD_CMP "${CMAKE_CXX_STANDARD} + 100") + ENDIF() + IF(${CMAKE_CXX_STANDARD_EXT} VERSION_EQUAL "98") + # just copy the value + SET(CMAKE_CXX_STANDARD_EXT_CMP ${CMAKE_CXX_STANDARD_EXT}) + ELSE() + # add 100 to the value + MATH(EXPR CMAKE_CXX_STANDARD_EXT_CMP "${CMAKE_CXX_STANDARD_EXT} + 100") + ENDIF() + # compare values + IF(${CMAKE_CXX_STANDARD_EXT_CMP} VERSION_LESS ${CMAKE_CXX_STANDARD_CMP}) + MESSAGE(WARNING "Requested C++ standard (${CMAKE_CXX_STANDARD_EXT}) isn't modern enough to build GNU Radio; using minimum required C++ standard (${CMAKE_CXX_STANDARD}) instead and hoping for the best!") + ELSEIF(${CMAKE_CXX_STANDARD_EXT_CMP} VERSION_GREATER ${CMAKE_CXX_STANDARD_CMP}) + MESSAGE(WARNING "Requested C++ standard (${CMAKE_CXX_STANDARD_EXT}) is more recent than the minimum required C++ standard (${CMAKE_CXX_STANDARD}). GNU Radio might have issues building using this C++ standard; go with it and hope for the best!") + SET(CMAKE_CXX_STANDARD ${CMAKE_CXX_STANDARD_EXT}) + ENDIF() +ENDIF() + +######################################################################## +# Configure C standard if not externally specified. Use the variable +# CMAKE_C_STANDARD since it will actually be used for this purposes +# starting in CMake 3.1. +######################################################################## + +# save current setting, if provided +IF(CMAKE_C_STANDARD) + SET(CMAKE_C_STANDARD_EXT ${CMAKE_C_STANDARD}) ENDIF() +# set GR preferred setting IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + SET(CMAKE_C_STANDARD 99) ELSEIF(CMAKE_C_COMPILER_ID MATCHES "Clang") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + SET(CMAKE_C_STANDARD 99) ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") + SET(CMAKE_C_STANDARD 11) ELSE() - message(warning "C standard could not be set because compiler is not GNU, Clang or MSVC.") + MESSAGE(WARNING "C standard could not be set because compiler is not GNU, Clang, or MSVC.") ENDIF() +# if the C standard was provided externally, make sure it meets GR's minimum +IF(CMAKE_C_STANDARD_EXT) + # verify that the provided C standard is one CMake + # accepts. options are 90, 99, and 11 as of CMake 3.11.4. + IF(NOT ${CMAKE_C_STANDARD_EXT} VERSION_EQUAL "90" AND + NOT ${CMAKE_C_STANDARD_EXT} VERSION_EQUAL "99" AND + NOT ${CMAKE_C_STANDARD_EXT} VERSION_EQUAL "11") + MESSAGE(WARNING "Requested C standard (${CMAKE_C_STANDARD_EXT}) isn't recognized by CMake; expecting one of 90, 99, or 11. Ignoring and using the GNU Radio default C standard (${CMAKE_C_STANDARD}).") + SET(CMAKE_C_STANDARD_EXT ${CMAKE_C_STANDARD}) + ENDIF() + # fix settings to be comparable. It will be -many- years until we + # have to worry about this value getting large enough to wrap + # around (to 90), so just add 100 to any value not in the 90's, + # for comparison sake. + IF(${CMAKE_C_STANDARD} VERSION_EQUAL "90" OR + ${CMAKE_C_STANDARD} VERSION_EQUAL "99") + # just copy the value + SET(CMAKE_C_STANDARD_CMP ${CMAKE_C_STANDARD}) + ELSE() + # add 100 to the value + MATH(EXPR CMAKE_C_STANDARD_CMP "${CMAKE_C_STANDARD} + 100") + ENDIF() + IF(${CMAKE_C_STANDARD_EXT} VERSION_EQUAL "90" OR + ${CMAKE_C_STANDARD_EXT} VERSION_EQUAL "99") + # just copy the value + SET(CMAKE_C_STANDARD_EXT_CMP ${CMAKE_C_STANDARD_EXT}) + ELSE() + # add 100 to the value + MATH(EXPR CMAKE_C_STANDARD_EXT_CMP "${CMAKE_C_STANDARD_EXT} + 100") + ENDIF() + # compare values + IF(${CMAKE_C_STANDARD_EXT_CMP} VERSION_LESS ${CMAKE_C_STANDARD_CMP}) + MESSAGE(WARNING "Requested C standard (${CMAKE_C_STANDARD_EXT}) isn't modern enough to build GNU Radio; using minimum required C standard (${CMAKE_C_STANDARD}) instead and hoping for the best!") + ELSEIF(${CMAKE_C_STANDARD_EXT_CMP} VERSION_GREATER ${CMAKE_C_STANDARD_CMP}) + MESSAGE(WARNING "Requested C standard (${CMAKE_C_STANDARD_EXT}) is more recent than the minimum required C standard (${CMAKE_C_STANDARD}). GNU Radio might have issues building using this C standard; go with it and hope for the best!") + SET(CMAKE_C_STANDARD ${CMAKE_C_STANDARD_EXT}) + ENDIF() +ENDIF() + +######################################################################## +# If C/CXX EXTENSIONS are defined, don't change them. GNU Radio itself +# does not require them. If not defined, then disable them as a safe +# default. + +IF(NOT CMAKE_C_EXTENSIONS) + SET(CMAKE_C_EXTENSIONS OFF) +ENDIF() +IF(NOT CMAKE_CXX_EXTENSIONS) + SET(CMAKE_CXX_EXTENSIONS OFF) +ENDIF() + +######################################################################## +# If cmake version is < 3.1, explicitly set C/C++ standard to use; +# this CMake doesn't internally use CMAKE_C*_STANDARD variables. + +IF(${CMAKE_VERSION} VERSION_LESS "3.1") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c${CMAKE_C_STANDARD}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${CMAKE_CXX_STANDARD}") +ENDIF() ######################################################################## # Environment setup