| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- set(linkWarning "${link_warning_as_error}")
- if (DEFINED CMAKE_LINK_WARNING_AS_ERROR)
- set(linkWarning "${CMAKE_LINK_WARNING_AS_ERROR}")
- endif()
- if (linkWarning STREQUAL "ON")
- set (linkWarning DRIVER LINKER)
- endif()
- if((linkWarning STREQUAL "DRIVER;LINKER" AND NOT CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR
- AND NOT CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR)
- OR (linkWarning STREQUAL "DRIVER" AND NOT CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR)
- OR (linkWarning STREQUAL "LINKER" AND NOT CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR))
- set(WarnErrorFlags "UNDEFINED")
- else()
- set(cfg_dir)
- get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
- if(_isMultiConfig)
- set(cfg_dir /Debug)
- endif()
- set(DUMP_EXE "${CMAKE_CURRENT_BINARY_DIR}${cfg_dir}/dump${CMAKE_EXECUTABLE_SUFFIX}")
- add_executable(dump dump.c)
- set_property(TARGET dump PROPERTY LINK_WARNING_AS_ERROR OFF)
- # ensure no temp file nor response file will be used
- set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
- string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
- string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
- add_executable(main main.c)
- if(CMAKE_GENERATOR MATCHES "FASTBuild")
- # FASTBuild needs output to exist.
- file(TOUCH "${CMAKE_CURRENT_BINARY_DIR}${cfg_dir}/main${CMAKE_EXECUTABLE_SUFFIX}")
- endif()
- if (NOT DEFINED CMAKE_LINK_WARNING_AS_ERROR)
- set_property(TARGET main PROPERTY LINK_WARNING_AS_ERROR ${link_warning_as_error})
- endif()
- # use LAUNCH facility to dump linker command
- set_property(TARGET main PROPERTY RULE_LAUNCH_LINK "\"${DUMP_EXE}\"")
- add_dependencies(main dump)
- # generate reference for WARNING_AS_ERROR flag
- unset(compiler_WarnError)
- unset(linker_WarnError)
- unset(WarnErrorFlags)
- ## DRIVER
- if (CMAKE_C_LINK_MODE STREQUAL "DRIVER")
- list(JOIN CMAKE_C_COMPILE_OPTIONS_WARNING_AS_ERROR " " compiler_WarnError)
- endif()
- ## LINKER
- string(REPLACE "LINKER:" "" linker_WarnError "${CMAKE_C_LINK_OPTIONS_WARNING_AS_ERROR}")
- if (CMAKE_C_LINKER_WRAPPER_FLAG)
- set(linker_flag ${CMAKE_C_LINKER_WRAPPER_FLAG})
- list(GET linker_flag -1 linker_space)
- if (linker_space STREQUAL " ")
- list(REMOVE_AT linker_flag -1)
- else()
- set(linker_space)
- endif()
- list(JOIN linker_flag " " linker_flag)
- if (CMAKE_C_LINKER_WRAPPER_FLAG_SEP)
- string(REPLACE "," "${CMAKE_C_LINKER_WRAPPER_FLAG_SEP}" linker_WarnError "${linker_WarnError}")
- set(linker_WarnError "${linker_flag}${linker_space}${linker_WarnError}")
- else()
- set(linker_prefix "${linker_flag}${linker_space}")
- string(REPLACE "," ";" linker_WarnError "${linker_WarnError}")
- list(TRANSFORM linker_WarnError PREPEND "${linker_prefix}")
- list(JOIN linker_WarnError " " linker_WarnError)
- endif()
- else()
- string(REPLACE "," " " linker_WarnError "${linker_WarnError}")
- endif()
- # Add regex [^-] to avoid matching of MSVC compiler flag -WX-
- if(linkWarning STREQUAL "DRIVER;LINKER")
- set(WarnErrorFlags "${compiler_WarnError}")
- if (WarnErrorFlags)
- string(APPEND WarnErrorFlags " ${linker_WarnError}[^-]")
- else()
- set(WarnErrorFlags "${linker_WarnError}[^-]")
- endif()
- elseif(linkWarning STREQUAL "DRIVER")
- set(WarnErrorFlags "${compiler_WarnError}[^-]")
- elseif(linkWarning STREQUAL "LINKER")
- set(WarnErrorFlags "${linker_WarnError}[^-]")
- else()
- # OFF value
- if(compiler_WarnError AND linker_WarnError)
- set(WarnErrorFlags "(${compiler_WarnError}[^-]|${linker_WarnError}[^-])+")
- elseif(compiler_WarnError)
- set(WarnErrorFlags "${compiler_WarnError}[^-]")
- elseif(linker_WarnError)
- set(WarnErrorFlags "${linker_WarnError}[^-]")
- endif()
- if(NOT WarnErrorFlags)
- set(WarnErrorFlags "UNDEFINED")
- endif()
- endif()
- endif()
- if(CMAKE_GENERATOR MATCHES "Visual Studio")
- # replace '-' with '/' for options
- string(REGEX REPLACE "-([A-Z]+)" "[-/]\\1" WarnErrorFlags "${WarnErrorFlags}")
- endif()
- file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/WARNING_AS_ERROR.txt" "${WarnErrorFlags}")
|