Why remove CMAKE_CXX_COMPILER_IMPORT_STD with CMake v4.5.0?

I know, CMAKE_CXX_COMPILER_IMPORT_STD was experimental, but usefully and well documented.
Now many projects (i.e. boost, beman, magic_enum, …) has to change there code like this:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 511c0f1..d449ad8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
-# CMake 3.30 is required for C++23 `import std` support;
-cmake_minimum_required(VERSION 3.31...4.4)
+# Starting with CMake 3.30 is was required for C++23 `import std` support;
+cmake_minimum_required(VERSION 3.31...4.5)
 
 option(
     CMAKE_CXX_SCAN_FOR_MODULES
@@ -73,10 +73,14 @@ if(CMAKE_GENERATOR STREQUAL "Ninja" AND FMT_MODULE)
     if(FMT_MODULE)
         # Tell CMake that we explicitly want `import std`.
         # This will initialize the property on all targets declared after this to 1
-        if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
+        if(CMAKE_CXX_STDLIB_MODULES_JSON AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.5.0")
             set(CMAKE_CXX_MODULE_STD ON)
         else()
-            set(CMAKE_CXX_MODULE_STD OFF)
+            if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
+                set(CMAKE_CXX_MODULE_STD ON)
+            else()
+                set(CMAKE_CXX_MODULE_STD OFF)
+            endif()
         endif()
 
         if(CMAKE_CXX_MODULE_STD)

or

bash-5.3$ git diff CMakeLists.txt 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a4baedc..e5f2d0f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.30...4.5)
+cmake_minimum_required(VERSION 3.31...4.5)
 
 include(cmake/prelude.cmake)
 
@@ -46,8 +46,13 @@ if(PROJECT_IS_TOP_LEVEL)
     option(BOOST_USE_MODULES "Do build with CXX_MODULES if possible" OFF)
     if(BOOST_USE_MODULES)
         set(CMAKE_CXX_SCAN_FOR_MODULES ON)
-        if(NOT CMAKE_CXX_STANDARD GREATER_EQUAL 23)
-            set(CMAKE_CXX_MODULE_STD OFF)
+        if(CMAKE_CXX_STDLIB_MODULES_JSON AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.5.0")
+            set(CMAKE_CXX_MODULE_STD ON)
+            list(APPEND CMAKE_CXX_COMPILER_IMPORT_STD ${CMAKE_CXX_STANDARD})
+        else()
+            if(NOT CMAKE_CXX_STANDARD GREATER_EQUAL 23)
+                set(CMAKE_CXX_MODULE_STD OFF)
+            endif()
         endif()
     else()
         set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
bash-5.3$ 

@anarthal FYI

see import-std-support

Because its described purpose no longer exists. The information it contained no longer corresponds to anything CMake does.

The code above checks if the global C++ standard is in the list CMAKE_CXX_COMPILER_IMPORT_STD provides. But there is no such list anymore, the source the list pulled from is gone entirely. The mechanism which made the variable relevant, and restricted import std to certain standards, is gone.

NOTE: The widely used CMAKE_CXX_MODULE_STD Variable and the corresponding target property CXX_MODULE_STD are removed too!

The only way I know to disable the use of import std; is now:

set(CMAKE_CXX_STDLIB_MODULES_JSON) # empty value!
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 22345038a..904f0fbb7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.30...4.4)
+cmake_minimum_required(VERSION 3.30...4.5)
 
 include(cmake/enable_import_std.cmake)
 
@@ -88,16 +89,20 @@ target_sources(
         FILE_SET HEADERS BASE_DIRS include module FILES ${_public_headers} module/asio-gmf.h
 )
 target_compile_features(asio PRIVATE cxx_std_${CMAKE_CXX_STANDARD})
-set_target_properties(asio PROPERTIES VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL})
+set_target_properties(asio PROPERTIES VERIFY_INTERFACE_HEADER_SETS OFF)
 target_link_libraries(asio PUBLIC asio_header)
 
 option(ASIO_IMPORT_STD "Enable 'import std;' support for ASIO module" OFF)
 if(ASIO_IMPORT_STD)
-    message(STATUS "Build asio with target PROPERTY CXX_MODULE_STD ON")
-    # Tell CMake that we explicitly want `import std`.
-    # This initializes the property CXX_MODULE_STD of asio targets to 1 (requires CMake 3.30+)
-    set_target_properties(asio PROPERTIES CXX_MODULE_STD ON)
-    target_compile_definitions(asio PUBLIC ASIO_HAS_IMPORT_STD)
+    if(CMAKE_CXX_STDLIB_MODULES_JSON AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.5.0")
+        target_compile_definitions(asio PUBLIC ASIO_HAS_IMPORT_STD)
+    else()
+        message(STATUS "Build asio with target PROPERTY CXX_MODULE_STD ON")
+        # Tell CMake that we explicitly want `import std`.
+        # This initializes the property CXX_MODULE_STD of asio targets to 1 (requires CMake 3.30+)
+        set_target_properties(asio PROPERTIES CXX_MODULE_STD ON)
+        target_compile_definitions(asio PUBLIC ASIO_HAS_IMPORT_STD)
+    endif()
 endif()
 
 if(ASIO_ENABLE_SSL)

Turning off scanning also disables import std.

You can’t directly disable #include <cstdlib> via a dedicated CMake variable either.