| |
| 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}") |