From 92320466ddea701375b70c904d2ed9db00956047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Germain?= Date: Sat, 22 Aug 2026 17:25:19 -0700 Subject: [PATCH] try_compile: Restore platform-default link flags in pre-CMP0210 projects The CMP0210 compatibility shims in the Darwin, AIX, HP-UX and ARMClang modules read the policy with cmake_policy(GET CMP0210 ...) during enable_language(), which runs inside project(). cmCoreTryCompile emitted cmake_policy(SET CMP0210 ...) after project() in the generated test project, so those shims always observed NEW regardless of the calling project's setting. On affected platforms this dropped the platform default link flags from every try_compile, and left a toolchain-file value of CMAKE__LINK_FLAGS unclobbered so that it reached the OLD code path. For projects that are also not using CMP0181 NEW, that path uses the variable as is and does not expand the LINKER: prefix. Move the emission into the existing pre-project() policy block alongside CMP0126, CMP0128 and CMP0197, which exist for exactly this reason. Fixes: #28102 --- Source/cmCoreTryCompile.cxx | 16 +++++++--------- .../ToolchainFile/CMP0210-NEW-stderr.txt | 1 + .../ToolchainFile/CMP0210-NEW-toolchain.cmake | 1 + Tests/RunCMake/ToolchainFile/CMP0210-NEW.cmake | 2 ++ .../ToolchainFile/CMP0210-OLD-stderr.txt | 1 + .../ToolchainFile/CMP0210-OLD-toolchain.cmake | 1 + Tests/RunCMake/ToolchainFile/CMP0210-OLD.cmake | 2 ++ .../ToolchainFile/CMP0210-WARN-stderr.txt | 1 + .../ToolchainFile/CMP0210-WARN-toolchain.cmake | 1 + Tests/RunCMake/ToolchainFile/CMP0210-WARN.cmake | 2 ++ .../ToolchainFile/CMP0210-toolchain.cmake | 5 +++++ Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake | 3 +++ 12 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-NEW-stderr.txt create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-NEW-toolchain.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-NEW.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-OLD-stderr.txt create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-OLD-toolchain.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-OLD.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-WARN-stderr.txt create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-WARN-toolchain.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-WARN.cmake create mode 100644 Tests/RunCMake/ToolchainFile/CMP0210-toolchain.cmake diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 6befcbf890..8570fa29f4 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -692,6 +692,13 @@ cm::optional cmCoreTryCompile::TryCompileCode( *cmp0197 == "NEW"_s ? "NEW" : "OLD"); } + /* Set per-language link flags policy to match outer project. + It affects platform modules. */ + if (this->Makefile->GetPolicyStatus(cmPolicies::CMP0210) != + cmPolicies::NEW) { + fprintf(fout, "cmake_policy(SET CMP0210 OLD)\n"); + } + std::string projectLangs; for (std::string const& li : testLangs) { projectLangs += cmStrCat(' ', li); @@ -912,15 +919,6 @@ cm::optional cmCoreTryCompile::TryCompileCode( ? "NEW" : "OLD"); - /* Set the appropriate policy information for passing - * CMAKE__LINK_FLAGS - */ - fprintf(fout, "cmake_policy(SET CMP0210 %s)\n", - this->Makefile->GetPolicyStatus(cmPolicies::CMP0210) == - cmPolicies::NEW - ? "NEW" - : "OLD"); - // Workaround for -Wl,-headerpad_max_install_names issue until we can // avoid adding that flag in the platform and compiler language files fprintf(fout, diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-NEW-stderr.txt b/Tests/RunCMake/ToolchainFile/CMP0210-NEW-stderr.txt new file mode 100644 index 0000000000..36ad41b68a --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-NEW-stderr.txt @@ -0,0 +1 @@ +^try_compile CMP0210='NEW' diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-NEW-toolchain.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-NEW-toolchain.cmake new file mode 100644 index 0000000000..5474508bf9 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-NEW-toolchain.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/CMP0210-toolchain.cmake") diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-NEW.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-NEW.cmake new file mode 100644 index 0000000000..644f78510b --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-NEW.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0210 NEW) +enable_language(C) diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-OLD-stderr.txt b/Tests/RunCMake/ToolchainFile/CMP0210-OLD-stderr.txt new file mode 100644 index 0000000000..c308ca2967 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-OLD-stderr.txt @@ -0,0 +1 @@ +^try_compile CMP0210='OLD' diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-OLD-toolchain.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-OLD-toolchain.cmake new file mode 100644 index 0000000000..5474508bf9 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-OLD-toolchain.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/CMP0210-toolchain.cmake") diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-OLD.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-OLD.cmake new file mode 100644 index 0000000000..b6eda62914 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-OLD.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0210 OLD) +enable_language(C) diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-WARN-stderr.txt b/Tests/RunCMake/ToolchainFile/CMP0210-WARN-stderr.txt new file mode 100644 index 0000000000..c308ca2967 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-WARN-stderr.txt @@ -0,0 +1 @@ +^try_compile CMP0210='OLD' diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-WARN-toolchain.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-WARN-toolchain.cmake new file mode 100644 index 0000000000..5474508bf9 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-WARN-toolchain.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/CMP0210-toolchain.cmake") diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-WARN.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-WARN.cmake new file mode 100644 index 0000000000..af6fb7e1ee --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-WARN.cmake @@ -0,0 +1,2 @@ +# leave CMP0210 unset +enable_language(C) diff --git a/Tests/RunCMake/ToolchainFile/CMP0210-toolchain.cmake b/Tests/RunCMake/ToolchainFile/CMP0210-toolchain.cmake new file mode 100644 index 0000000000..f19e0efa77 --- /dev/null +++ b/Tests/RunCMake/ToolchainFile/CMP0210-toolchain.cmake @@ -0,0 +1,5 @@ +get_property(_IN_TC GLOBAL PROPERTY IN_TRY_COMPILE) +if(_IN_TC) + cmake_policy(GET CMP0210 cmp0210) + message("try_compile CMP0210='${cmp0210}'") +endif() diff --git a/Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake b/Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake index b588ce03d1..0820041b17 100644 --- a/Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake +++ b/Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake @@ -14,6 +14,9 @@ run_cmake_toolchain(LinkFlagsInit) run_cmake_toolchain(CMP0126-NEW) run_cmake_toolchain(CMP0126-OLD) run_cmake_toolchain(CMP0126-WARN) +run_cmake_toolchain(CMP0210-NEW) +run_cmake_toolchain(CMP0210-OLD) +run_cmake_toolchain(CMP0210-WARN) run_cmake_toolchain(SetCrossCompiling) function(run_IncludeDirectories)