# This cmake module is used to set pedantic flags for the C and C++ compiler of your system If ( __PEDANTIC_INCLUDED ) Return ( ) EndIf ( ) set ( __PEDANTIC_INCLUDED TRUE ) Include (CheckCCompilerFlag) Include (CheckCXXCompilerFlag) # Macro to replace the '-Wno' perfix of a flag with '-W' # VAR_IN - Input variable # VAR_OUT - Output variable Macro (__PEDANTIC_INVERT_WNO_FLAG VAR_IN VAR_OUT) If (${VAR_IN} MATCHES "-Wno") String (REPLACE "-Wno-" "-W" ${VAR_OUT} ${VAR_IN}) Else () Set (${VAR_OUT} ${VAR_IN}) EndIf () EndMacro () # Macro to create a unique name for the given flag. # PREFIX - Prefix to add to the name # FLAG - Flag to convert to a valid variable name # OUTPUT - Variable to store output in Macro (__PEDANTIC_MAKE_UNIQUE_NAME PREFIX FLAG OUTPUT) String (REGEX REPLACE "[^0-9a-zA-Z]" "_" TMP_NAME ${FLAG}) String (SUBSTRING ${TMP_NAME} 1 -1 TMP_NAME) String (TOUPPER ${TMP_NAME} TMP_NAME) Set (TMP_NAME "${PREFIX}_${TMP_NAME}") Set (${OUTPUT} ${TMP_NAME}) EndMacro () # Macro to check if the C compiler supports the given flag. # If so the flag is added to the PEDANTIC_C_FLAGS variable. # FLAG - Compiler flag to check Macro (__PEDANTIC_CHECK_AND_ADD_C_FLAG FLAG) __PEDANTIC_MAKE_UNIQUE_NAME("HAVE_C_FLAG" ${FLAG} FLAG_NAME) __PEDANTIC_INVERT_WNO_FLAG(${FLAG} TEST_FLAG) Set (OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) Set (CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${TEST_FLAG} -Werror") CHECK_CXX_COMPILER_FLAG(${TEST_FLAG} ${FLAG_NAME}) Set (CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) If (${FLAG_NAME}) Set (PEDANTIC_C_FLAGS "${PEDANTIC_C_FLAGS} ${FLAG}") EndIf ( ) EndMacro () # Macro to check if the C++ compiler supports the given flag. # If so the flag is added to the PEDANTIC_C_FLAGS variable. # FLAG - Compiler flag to check Macro (__PEDANTIC_CHECK_AND_ADD_CXX_FLAG FLAG) __PEDANTIC_MAKE_UNIQUE_NAME("HAVE_CXX_FLAG" ${FLAG} FLAG_NAME) __PEDANTIC_INVERT_WNO_FLAG(${FLAG} TEST_FLAG) Set (OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) Set (CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${TEST_FLAG} -Werror") CHECK_CXX_COMPILER_FLAG(${TEST_FLAG} ${FLAG_NAME}) Set (CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) If (${FLAG_NAME}) Set (PEDANTIC_CXX_FLAGS "${PEDANTIC_CXX_FLAGS} ${FLAG}") EndIf ( ) EndMacro ( ) Set (PEDANTIC_C_FLAGS "") Set (PEDANTIC_CXX_FLAGS "") # Function to apply all pedantic flags to the compiler flags # C - only add C compiler flags # CXX - only add C++ compiler flags # ALL - add all compiler flags Function ( Pedantic_Apply_Flags ) Set ( OPTIONS C CXX ALL ) Set ( ONE_VALUE_ARGS ) Set ( MULTI_VALUE_ARGS ) CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} ) If ( ARG_C OR ARG_ALL ) Set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PEDANTIC_C_FLAGS}" PARENT_SCOPE ) EndIf ( ) If ( ARG_CXX OR ARG_ALL ) Set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PEDANTIC_CXX_FLAGS}" PARENT_SCOPE ) EndIf ( ) EndFunction ( ) Enable_Language ( C ) Enable_Language ( CXX ) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-g) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wall) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wextra) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wconversion) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Werror) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-unused-parameter) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wbad-function-cast) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wcast-align) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wcast-qual) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wconversion) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wdouble-promotion) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wfloat-equal) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wnested-externs) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-attributes) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-builtin-macro-redefined) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-vla) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-pragmas) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wno-unknown-pragmas) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wold-style-definition) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Woverlength-strings) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wshadow) __PEDANTIC_CHECK_AND_ADD_C_FLAG(-Wwrite-strings) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-ftemplate-depth=2000) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-g) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wall) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wextra) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wconversion) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Werror) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-reorder) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-unused-parameter) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wcast-align) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wcast-qual) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wconversion) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wdouble-promotion) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wfloat-equal) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-attributes) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-builtin-macro-redefined) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-vla) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-pragmas) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wno-unknown-pragmas) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Woverlength-strings) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wshadow) __PEDANTIC_CHECK_AND_ADD_CXX_FLAG(-Wwrite-strings)