WarnError.cmake 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. set(linkWarning "${link_warning_as_error}")
  2. if (DEFINED CMAKE_LINK_WARNING_AS_ERROR)
  3. set(linkWarning "${CMAKE_LINK_WARNING_AS_ERROR}")
  4. endif()
  5. if (linkWarning STREQUAL "ON")
  6. set (linkWarning DRIVER LINKER)
  7. endif()
  8. if((linkWarning STREQUAL "DRIVER;LINKER" AND NOT CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR
  9. AND NOT CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR)
  10. OR (linkWarning STREQUAL "DRIVER" AND NOT CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR)
  11. OR (linkWarning STREQUAL "LINKER" AND NOT CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR))
  12. set(WarnErrorFlags "UNDEFINED")
  13. else()
  14. set(cfg_dir)
  15. get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
  16. if(_isMultiConfig)
  17. set(cfg_dir /Debug)
  18. endif()
  19. set(DUMP_EXE "${CMAKE_CURRENT_BINARY_DIR}${cfg_dir}/dump${CMAKE_EXECUTABLE_SUFFIX}")
  20. add_executable(dump dump.c)
  21. set_property(TARGET dump PROPERTY LINK_WARNING_AS_ERROR OFF)
  22. # ensure no temp file nor response file will be used
  23. set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
  24. string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
  25. string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
  26. add_executable(main main.c)
  27. if(CMAKE_GENERATOR MATCHES "FASTBuild")
  28. # FASTBuild needs output to exist.
  29. file(TOUCH "${CMAKE_CURRENT_BINARY_DIR}${cfg_dir}/main${CMAKE_EXECUTABLE_SUFFIX}")
  30. endif()
  31. if (NOT DEFINED CMAKE_LINK_WARNING_AS_ERROR)
  32. set_property(TARGET main PROPERTY LINK_WARNING_AS_ERROR ${link_warning_as_error})
  33. endif()
  34. # use LAUNCH facility to dump linker command
  35. set_property(TARGET main PROPERTY RULE_LAUNCH_LINK "\"${DUMP_EXE}\"")
  36. add_dependencies(main dump)
  37. # generate reference for WARNING_AS_ERROR flag
  38. unset(compiler_WarnError)
  39. unset(linker_WarnError)
  40. unset(WarnErrorFlags)
  41. ## DRIVER
  42. if (CMAKE_C_LINK_MODE STREQUAL "DRIVER")
  43. list(JOIN CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR " " compiler_WarnError)
  44. endif()
  45. ## LINKER
  46. string(REPLACE "LINKER:" "" linker_WarnError "${CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR}")
  47. if (CMAKE_C_LINKER_WRAPPER_FLAG)
  48. set(linker_flag ${CMAKE_C_LINKER_WRAPPER_FLAG})
  49. list(GET linker_flag -1 linker_space)
  50. if (linker_space STREQUAL " ")
  51. list(REMOVE_AT linker_flag -1)
  52. else()
  53. set(linker_space)
  54. endif()
  55. list(JOIN linker_flag " " linker_flag)
  56. if (CMAKE_C_LINKER_WRAPPER_FLAG_SEP)
  57. string(REPLACE "," "${CMAKE_C_LINKER_WRAPPER_FLAG_SEP}" linker_WarnError "${linker_WarnError}")
  58. set(linker_WarnError "${linker_flag}${linker_space}${linker_WarnError}")
  59. else()
  60. set(linker_prefix "${linker_flag}${linker_space}")
  61. string(REPLACE "," ";" linker_WarnError "${linker_WarnError}")
  62. list(TRANSFORM linker_WarnError PREPEND "${linker_prefix}")
  63. list(JOIN linker_WarnError " " linker_WarnError)
  64. endif()
  65. else()
  66. string(REPLACE "," " " linker_WarnError "${linker_WarnError}")
  67. endif()
  68. # Add regex [^-] to avoid matching of MSVC compiler flag -WX-
  69. if(linkWarning STREQUAL "DRIVER;LINKER")
  70. set(WarnErrorFlags "${compiler_WarnError}")
  71. if (WarnErrorFlags)
  72. string(APPEND WarnErrorFlags " ${linker_WarnError}[^-]")
  73. else()
  74. set(WarnErrorFlags "${linker_WarnError}[^-]")
  75. endif()
  76. elseif(linkWarning STREQUAL "DRIVER")
  77. set(WarnErrorFlags "${compiler_WarnError}[^-]")
  78. elseif(linkWarning STREQUAL "LINKER")
  79. set(WarnErrorFlags "${linker_WarnError}[^-]")
  80. else()
  81. # OFF value
  82. if(compiler_WarnError AND linker_WarnError)
  83. set(WarnErrorFlags "(${compiler_WarnError}[^-]|${linker_WarnError}[^-])+")
  84. elseif(compiler_WarnError)
  85. set(WarnErrorFlags "${compiler_WarnError}[^-]")
  86. elseif(linker_WarnError)
  87. set(WarnErrorFlags "${linker_WarnError}[^-]")
  88. endif()
  89. if(NOT WarnErrorFlags)
  90. set(WarnErrorFlags "UNDEFINED")
  91. endif()
  92. endif()
  93. endif()
  94. if(CMAKE_GENERATOR MATCHES "Visual Studio")
  95. # replace '-' with '/' for options
  96. string(REGEX REPLACE "-([A-Z]+)" "[-/]\\1" WarnErrorFlags "${WarnErrorFlags}")
  97. endif()
  98. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/WARNING_AS_ERROR.txt" "${WarnErrorFlags}")