From de71ffcc474cc74336a4f2ec155aa80640ceca8d Mon Sep 17 00:00:00 2001 From: SpaceIm <30052553+SpaceIm@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:19:26 +0100 Subject: [PATCH 1/3] force CMP0091 policy to NEW in CMakeToolchain if msvc Even with CMake >= 3.15, if the toolchain is used with a CMakeLists whose cmake_minimum_required() is lower than 3.15, CMP0091 is set to OLD by default, breaking the conan logic of vc runtime injection through CMakeToolchain. Therefore the toolchain must ensures that CMP0091 is set to NEW. --- conan/tools/cmake/toolchain.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conan/tools/cmake/toolchain.py b/conan/tools/cmake/toolchain.py index 1abb8ff48b1..b91a41b70b0 100644 --- a/conan/tools/cmake/toolchain.py +++ b/conan/tools/cmake/toolchain.py @@ -99,6 +99,9 @@ class VSRuntimeBlock(Block): {% set genexpr.str = genexpr.str + '$<$:' + value|string + '>' %} {% endfor %} + if(POLICY CMP0091) + cmake_policy(SET CMP0091 NEW) + endif() set(CMAKE_MSVC_RUNTIME_LIBRARY "{{ genexpr.str }}") """) From 57632b60485c644fe2487fda59b2987dfbcb270c Mon Sep 17 00:00:00 2001 From: SpaceIm <30052553+SpaceIm@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:21:06 +0100 Subject: [PATCH 2/3] CMakeToolchain requires at least CMake >= 3.15 Several features in CMakeToolchain need CMake >= 3.15 to properly work. So prefer to hardfail if CMake < 3.15. --- conan/tools/cmake/toolchain.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conan/tools/cmake/toolchain.py b/conan/tools/cmake/toolchain.py index b91a41b70b0..2c7a28bfb8d 100644 --- a/conan/tools/cmake/toolchain.py +++ b/conan/tools/cmake/toolchain.py @@ -801,6 +801,10 @@ class CMakeToolchain(object): message("Using Conan toolchain: ${CMAKE_TOOLCHAIN_FILE}.") endif() + if(${CMAKE_VERSION} VERSION_LESS "3.15") + message(FATAL_ERROR "The 'CMakeToolchain' generator only works with CMake >= 3.15") + endif() + {% for conan_block in conan_blocks %} {{ conan_block }} {% endfor %} From c77f110c8f4ae686c4e7d9dc367527012ca1a94c Mon Sep 17 00:00:00 2001 From: SpaceIm <30052553+SpaceIm@users.noreply.github.com> Date: Thu, 20 Jan 2022 19:13:22 +0100 Subject: [PATCH 3/3] external injection of policy must use CMAKE_POLICY_DEFAULT_CMPNNNN see https://cmake.org/cmake/help/latest/variable/CMAKE_POLICY_DEFAULT_CMPNNNN.html --- conan/tools/cmake/toolchain.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conan/tools/cmake/toolchain.py b/conan/tools/cmake/toolchain.py index 2c7a28bfb8d..d3167f2a019 100644 --- a/conan/tools/cmake/toolchain.py +++ b/conan/tools/cmake/toolchain.py @@ -99,9 +99,7 @@ class VSRuntimeBlock(Block): {% set genexpr.str = genexpr.str + '$<$:' + value|string + '>' %} {% endfor %} - if(POLICY CMP0091) - cmake_policy(SET CMP0091 NEW) - endif() + set(CMAKE_POLICY_DEFAULT_CMP0091 NEW) set(CMAKE_MSVC_RUNTIME_LIBRARY "{{ genexpr.str }}") """)