Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 

237 Zeilen
9.5 KiB

  1. # This cmake module is used to set pedantic flags for the C and C++ compiler of your system
  2. If ( __PEDANTIC_INCLUDED )
  3. Return ( )
  4. EndIf ( )
  5. set ( __PEDANTIC_INCLUDED TRUE )
  6. Include ( CheckCCompilerFlag )
  7. Include ( CheckCXXCompilerFlag )
  8. # Macro to replace the '-Wno' perfix of a flag with '-W'
  9. # VAR_IN - Input variable
  10. # VAR_OUT - Output variable
  11. Macro ( __PEDANTIC_INVERT_WNO_FLAG VAR_IN VAR_OUT )
  12. If ( ${VAR_IN} MATCHES "-Wno" )
  13. String ( REPLACE "-Wno-" "-W" ${VAR_OUT} ${VAR_IN} )
  14. Else ( )
  15. Set ( ${VAR_OUT} ${VAR_IN} )
  16. EndIf ( )
  17. EndMacro ( )
  18. # Macro to create a unique name for the given flag.
  19. # PREFIX - Prefix to add to the name
  20. # FLAG - Flag to convert to a valid variable name
  21. # OUTPUT - Variable to store output in
  22. Macro ( __PEDANTIC_MAKE_UNIQUE_NAME PREFIX FLAG OUTPUT )
  23. String ( REGEX REPLACE "[^0-9a-zA-Z]" "_" TMP_NAME ${FLAG} )
  24. String ( SUBSTRING ${TMP_NAME} 1 -1 TMP_NAME )
  25. String ( TOUPPER ${TMP_NAME} TMP_NAME )
  26. Set ( TMP_NAME "${PREFIX}_${TMP_NAME}" )
  27. Set ( ${OUTPUT} ${TMP_NAME} )
  28. EndMacro ( )
  29. # Macro to check if the C compiler supports the given flag.
  30. # If so the flag is added to the PEDANTIC_C_FLAGS variable.
  31. # FLAG - Compiler flag to check
  32. Macro ( __PEDANTIC_CHECK_AND_ADD_C_FLAG LIST FLAG )
  33. __PEDANTIC_MAKE_UNIQUE_NAME ( "HAVE_C_FLAG" ${FLAG} FLAG_NAME )
  34. __PEDANTIC_INVERT_WNO_FLAG ( ${FLAG} TEST_FLAG )
  35. Set ( OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
  36. Set ( CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${TEST_FLAG} -Werror" )
  37. CHECK_CXX_COMPILER_FLAG ( ${TEST_FLAG} ${FLAG_NAME} )
  38. Set ( CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS} )
  39. If ( ${FLAG_NAME} )
  40. List ( APPEND "${LIST}" "${FLAG}" )
  41. EndIf ( )
  42. EndMacro ( )
  43. # Macro to check if the C++ compiler supports the given flag.
  44. # If so the flag is added to the PEDANTIC_C_FLAGS variable.
  45. # FLAG - Compiler flag to check
  46. Macro ( __PEDANTIC_CHECK_AND_ADD_CXX_FLAG LIST FLAG )
  47. __PEDANTIC_MAKE_UNIQUE_NAME ( "HAVE_CXX_FLAG" ${FLAG} FLAG_NAME )
  48. __PEDANTIC_INVERT_WNO_FLAG ( ${FLAG} TEST_FLAG )
  49. Set ( OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
  50. Set ( CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${TEST_FLAG} -Werror" )
  51. CHECK_CXX_COMPILER_FLAG ( ${TEST_FLAG} ${FLAG_NAME} )
  52. Set ( CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS} )
  53. If ( ${FLAG_NAME} )
  54. List ( APPEND "${LIST}" "${FLAG}" )
  55. EndIf ( )
  56. EndMacro ( )
  57. Set ( PEDANTIC_C_FLAGS )
  58. Set ( PEDANTIC_CXX_FLAGS )
  59. # Function to get flags for the given compiler
  60. Function ( __PEDANTIC_GET_FLAGS COMPILER OUT )
  61. Set ( OPTIONS )
  62. Set ( ONE_VALUE_ARGS )
  63. Set ( MULTI_VALUE_ARGS IGNORE ADDITIONAL )
  64. CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
  65. # remove ignored
  66. Set ( TMP_PEDANTIC_FLAGS ${PEDANTIC_${COMPILER}_FLAGS} )
  67. If ( ARG_IGNORE )
  68. ForEach ( I IN LISTS ARG_IGNORE )
  69. List ( REMOVE_ITEM TMP_PEDANTIC_FLAGS ${I} )
  70. EndForEach ( )
  71. EndIf ( )
  72. # add additional
  73. If ( ARG_ADDITIONAL )
  74. ForEach ( I IN LISTS ARG_ADDITIONAL )
  75. If ( "${COMPILER}" STREQUAL "C" )
  76. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( TMP_PEDANTIC_FLAGS ${I} )
  77. ElseIf ( "${COMPILER}" STREQUAL "CXX" )
  78. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( TMP_PEDANTIC_FLAGS ${I} )
  79. EndIf ( )
  80. EndForEach ( )
  81. EndIf ( )
  82. # output
  83. Set ( ${OUT} ${TMP_PEDANTIC_FLAGS} PARENT_SCOPE )
  84. EndFunction ( )
  85. # Function to apply all pedantic flags to the compiler flags
  86. # C - only add C compiler flags
  87. # CXX - only add C++ compiler flags
  88. # ALL - add all compiler flags
  89. Function ( Pedantic_Apply_Flags )
  90. Set ( OPTIONS C CXX ALL )
  91. Set ( ONE_VALUE_ARGS )
  92. Set ( MULTI_VALUE_ARGS IGNORE IGNORE_C IGNORE_CXX ADDITIONAL ADDITIONAL_C ADDITIONAL_CXX )
  93. CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
  94. # apply C flags
  95. If ( ARG_C OR ARG_ALL )
  96. __PEDANTIC_GET_FLAGS ( C TMP
  97. IGNORE ${ARG_IGNORE};${ARG_IGNORE_C}
  98. ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_C} )
  99. Set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TMP}" PARENT_SCOPE )
  100. EndIf ( )
  101. # apply CXX flags
  102. If ( ARG_CXX OR ARG_ALL )
  103. __PEDANTIC_GET_FLAGS ( CXX TMP
  104. IGNORE ${ARG_IGNORE};${ARG_IGNORE_CXX}
  105. ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_CXX} )
  106. Set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TMP}" PARENT_SCOPE )
  107. EndIf ( )
  108. EndFunction ( )
  109. # Function to apply all pedantic flags to the given target
  110. # C - only add C compiler flags
  111. # CXX - only add C++ compiler flags
  112. # ALL - add all compiler flags
  113. Function ( Pedantic_Apply_Flags_Target TARGET )
  114. Set ( OPTIONS C CXX ALL )
  115. Set ( ONE_VALUE_ARGS VISIBILITY )
  116. Set ( MULTI_VALUE_ARGS IGNORE IGNORE_C IGNORE_CXX ADDITIONAL ADDITIONAL_C ADDITIONAL_CXX )
  117. CMake_Parse_Arguments ( ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN} )
  118. # visibility
  119. If ( NOT ARG_VISIBILITY )
  120. Set ( ARG_VISIBILITY PRIVATE )
  121. EndIf ( )
  122. # apply C flags
  123. If ( ARG_C OR ARG_ALL )
  124. __PEDANTIC_GET_FLAGS ( C TMP
  125. IGNORE ${ARG_IGNORE};${ARG_IGNORE_C}
  126. ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_C} )
  127. ForEach ( I IN LISTS TMP )
  128. Target_Compile_Options ( ${TARGET}
  129. ${ARG_VISIBILITY}
  130. ${I} )
  131. EndForEach ( )
  132. EndIf ( )
  133. # apply CXX flags
  134. If ( ARG_CXX OR ARG_ALL )
  135. __PEDANTIC_GET_FLAGS ( CXX TMP
  136. IGNORE ${ARG_IGNORE};${ARG_IGNORE_CXX}
  137. ADDITIONAL ${ARG_ADDITIONAL};${ARG_ADDITIONAL_CXX} )
  138. ForEach ( I IN LISTS TMP )
  139. Target_Compile_Options ( ${TARGET}
  140. ${ARG_VISIBILITY}
  141. ${I} )
  142. EndForEach ( )
  143. EndIf ( )
  144. EndFunction ( )
  145. # Function to check the passed C flags
  146. Function ( Pedantic_Test_Flags COMPILER OUT )
  147. Set ( TMP_FLAGS )
  148. ForEach ( I IN LISTS ARGN )
  149. If ( "${COMPILER}" STREQUAL "C" )
  150. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( TMP_FLAGS ${I} )
  151. ElseIf ( "${COMPILER}" STREQUAL "CXX" )
  152. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( TMP_FLAGS ${I} )
  153. EndIf ( )
  154. EndForEach ( )
  155. Set ( ${OUT} ${TMP_FLAGS} PARENT_SCOPE )
  156. EndFunction ( )
  157. Enable_Language ( C )
  158. Enable_Language ( CXX )
  159. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -g )
  160. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wall )
  161. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wextra )
  162. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wconversion )
  163. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Werror )
  164. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-unused-parameter )
  165. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wbad-function-cast )
  166. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wcast-align )
  167. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wcast-qual )
  168. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wconversion )
  169. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wdouble-promotion )
  170. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wfloat-equal )
  171. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wnested-externs )
  172. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-attributes )
  173. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-builtin-macro-redefined )
  174. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-vla )
  175. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-pragmas )
  176. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wno-unknown-pragmas )
  177. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wold-style-definition )
  178. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Woverlength-strings )
  179. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wshadow )
  180. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wwrite-strings )
  181. __PEDANTIC_CHECK_AND_ADD_C_FLAG ( PEDANTIC_C_FLAGS -Wdocumentation )
  182. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -ftemplate-depth=2000 )
  183. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -g )
  184. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wall )
  185. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wextra )
  186. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wconversion )
  187. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Werror )
  188. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-reorder )
  189. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-unused-parameter )
  190. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wcast-align )
  191. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wcast-qual )
  192. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wconversion )
  193. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wdouble-promotion )
  194. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wfloat-equal )
  195. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-attributes )
  196. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-builtin-macro-redefined )
  197. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-vla )
  198. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-pragmas )
  199. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wno-unknown-pragmas )
  200. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Woverlength-strings )
  201. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wshadow )
  202. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wwrite-strings )
  203. __PEDANTIC_CHECK_AND_ADD_CXX_FLAG ( PEDANTIC_CXX_FLAGS -Wdocumentation )