Browse Source

CheckLinkerFlag: Catch linker warning when the checked flag is ignored

Prior to commit 219dde4ea8 (CheckPIESupported: now uses any SYSROOT settings,
2022-01-16, v3.23.0-rc1~110^2), the checks for `-pie` and `-no_pie` on macOS
failed due to executing the compiler directly without any `-isysroot`,
producing `ld: library not found for -lc++`.  See issues #23053 and #19180.
The failing check for `-pie` was a bug because it is supported on macOS,
both for `x86_64` and `arm64`, and the commit fixed that check.

However, `-no_pie` is not supported on macOS `arm64`.  The above commit was
only able to detect that due to commit f745e0497e (CheckCompilerFlags: Catch
linker warning about ignored flags, 2022-01-03, v3.23.0-rc1~174^2), which we
need to revert due to issue #23432.  Instead, catch only the linker warning
about the exact flag being checked.
Brad King 3 years ago
parent
commit
c2341ece47
1 changed files with 9 additions and 0 deletions
  1. 9 0
      Modules/Internal/CheckLinkerFlag.cmake

+ 9 - 0
Modules/Internal/CheckLinkerFlag.cmake

@@ -25,6 +25,15 @@ function(CMAKE_CHECK_LINKER_FLAG _lang _flag _var)
   set(CMAKE_REQUIRED_LINK_OPTIONS "${_flag}")
 
   check_compiler_flag_common_patterns(_common_patterns)
+
+  # Match linker warnings if the exact flag is ignored.
+  foreach(flag IN LISTS _flag)
+    string(REGEX REPLACE "([][+.*?()^$])" [[\\\1]] _flag_regex "${flag}")
+    list(APPEND _common_patterns
+      FAIL_REGEX "warning: .*${_flag_regex}.* ignored"
+      )
+  endforeach()
+
   cmake_check_source_compiles(${_lang}
     "${_lang_src}"
     ${_var}