- # 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 LIST 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} )
- List ( APPEND "${LIST}" "${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 LIST 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} )
- List ( APPEND "${LIST}" "${FLAG}" )
- EndIf ( )
- EndMacro ( )
-
- Set ( PEDANTIC_C_FLAGS )
- Set ( PEDANTIC_CXX_FLAGS )
-
- # Function to get flags for the given compiler
- Function ( __PEDANTIC_GET_FLAGS COMPILER OUT )
-
- Set ( OPTIONS )
- Set ( ONE_VALUE_ARGS )
- Set ( MULTI_VALUE_ARGS IGNORE ADDITIONAL )
-
- CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
-
- # remove ignored
- Set ( TMP_PEDANTIC_FLAGS ${PEDANTIC_${COMPILER}_FLAGS} )
- If ( ARG_IGNORE )
- ForEach ( I IN LISTS ARG_IGNORE )
- List ( REMOVE_ITEM TMP_PEDANTIC_FLAGS ${I} )
- EndForEach ( )
- EndIf ( )
-
- # add additional
- If ( ARG_ADDITIONAL )
- ForEach ( I IN LISTS ARG_ADDITIONAL )
- If ( "${COMPILER}" STREQUAL "C" )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( TMP_PEDANTIC_FLAGS ${I} )
- ElseIf ( "${COMPILER}" STREQUAL "CXX" )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( TMP_PEDANTIC_FLAGS ${I} )
- EndIf ( )
- EndForEach ( )
- EndIf ( )
-
- # output
- Set ( ${OUT} ${TMP_PEDANTIC_FLAGS} PARENT_SCOPE )
-
- EndFunction ( )
-
- # 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 IGNORE IGNORE_C IGNORE_CXX ADDITIONAL ADDITIONAL_C ADDITIONAL_CXX )
-
- CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
-
- # apply C flags
- If ( ARG_C OR ARG_ALL )
- __PEDANTIC_GET_FLAGS ( C TMP
- IGNORE ${ARG_IGNORE};${ARG_IGNORE_C}
- ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_C} )
- Set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TMP}" PARENT_SCOPE )
- EndIf ( )
-
- # apply CXX flags
- If ( ARG_CXX OR ARG_ALL )
- __PEDANTIC_GET_FLAGS ( CXX TMP
- IGNORE ${ARG_IGNORE};${ARG_IGNORE_CXX}
- ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_CXX} )
- Set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TMP}" PARENT_SCOPE )
- EndIf ( )
- EndFunction ( )
-
- # Function to apply all pedantic flags to the given target
- # C - only add C compiler flags
- # CXX - only add C++ compiler flags
- # ALL - add all compiler flags
- Function ( Pedantic_Apply_Flags_Target TARGET )
-
- Set ( OPTIONS C CXX ALL )
- Set ( ONE_VALUE_ARGS VISIBILITY )
- Set ( MULTI_VALUE_ARGS IGNORE IGNORE_C IGNORE_CXX ADDITIONAL ADDITIONAL_C ADDITIONAL_CXX )
-
- CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
-
- # visibility
- If ( NOT ARG_VISIBILITY )
- Set ( ARG_VISIBILITY PRIVATE )
- EndIf ( )
-
- # apply C flags
- If ( ARG_C OR ARG_ALL )
- __PEDANTIC_GET_FLAGS ( C TMP
- IGNORE ${ARG_IGNORE};${ARG_IGNORE_C}
- ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_C} )
- ForEach ( I IN LISTS TMP )
- Target_Compile_Options ( ${TARGET}
- ${ARG_VISIBILITY}
- ${I} )
- EndForEach ( )
- EndIf ( )
-
- # apply CXX flags
- If ( ARG_CXX OR ARG_ALL )
- __PEDANTIC_GET_FLAGS ( CXX TMP
- IGNORE ${ARG_IGNORE};${ARG_IGNORE_CXX}
- ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_CXX} )
- ForEach ( I IN LISTS TMP )
- Target_Compile_Options ( ${TARGET}
- ${ARG_VISIBILITY}
- ${I} )
- EndForEach ( )
- EndIf ( )
-
- EndFunction ( )
-
- # Function to check the passed C flags
- Function ( Pedantic_Test_Flags COMPILER OUT )
-
- Set ( TMP_FLAGS )
- ForEach ( I IN LISTS ARGN )
- If ( "${COMPILER}" STREQUAL "C" )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( TMP_FLAGS ${I} )
- ElseIf ( "${COMPILER}" STREQUAL "CXX" )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( TMP_FLAGS ${I} )
- EndIf ( )
- EndForEach ( )
- Set ( ${OUT} ${TMP_FLAGS} PARENT_SCOPE )
-
- EndFunction ( )
-
- Enable_Language ( C )
- Enable_Language ( CXX )
-
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -g )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wall )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wextra )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wconversion )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Werror )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-unused-parameter )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wbad-function-cast )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wcast-align )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wcast-qual )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wconversion )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wdouble-promotion )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wfloat-equal )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wnested-externs )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-attributes )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-builtin-macro-redefined )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-vla )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-pragmas )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-unknown-pragmas )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wold-style-definition )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Woverlength-strings )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wshadow )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wwrite-strings )
- __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wdocumentation )
-
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -ftemplate-depth=2000 )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -g )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wall )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wextra )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wconversion )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Werror )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-reorder )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-unused-parameter )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wcast-align )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wcast-qual )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wconversion )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wdouble-promotion )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wfloat-equal )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-attributes )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-builtin-macro-redefined )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-vla )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-pragmas )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-unknown-pragmas )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Woverlength-strings )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wshadow )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wwrite-strings )
- __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wdocumentation )
|