CMake 4.0.0-rc2 is ready for testing

I am proud to announce the second CMake 4.0 release candidate.
https://cmake.org/download/

Documentation is available at:
https://cmake.org/cmake/help/v4.0

Release notes appear below and are also published at
https://cmake.org/cmake/help/v4.0/release/4.0.html

Release milestone is available at:
release milestone

Some of the most significant changes in CMake 4.0 are:

  • Compatibility with versions of CMake older than 3.5 has been
    removed. Calls to “cmake_minimum_required()” or “cmake_policy()”
    that set the policy version to an older value now issue an error.
    Note that calls to those commands can still support older versions
    of CMake by using their “VERSION” arguments’ “<min>…<max>” syntax.
    This requires only the “<min>” version of CMake, but when running a
    newer version, sets policies up to the “<max>” version.

  • The “CMAKE_POLICY_VERSION_MINIMUM” variable was added to help
    packagers and end users try to configure existing projects that have
    not been updated to work with supported CMake versions. The
    “CMAKE_POLICY_VERSION_MINIMUM” environment variable was added to
    initialize it.

  • The “$<PATH>” generator expression gained the “NATIVE_PATH”
    operation to convert a CMake path into a native one.

  • On macOS with Ninja Generators and Makefile Generators, when a
    compiler is found in “/usr/bin”, it is now used as-is and is no
    longer mapped to the corresponding compiler inside Xcode.

  • Builds targeting macOS no longer choose any SDK or pass an
    “-isysroot” flag to the compiler by default. Instead, compilers are
    expected to choose a default macOS SDK on their own. In order to
    use a compiler that does not do this, users must now specify
    “-DCMAKE_OSX_SYSROOT=macosx” when configuring their build.

  • Precompiled SunOS “sparc” and “i386” binaries are now provided on
    cmake.org.
    CMake 4.0 Release Notes


Changes made since CMake 3.31 include the following.

New Features

File-Based API

  • The “cmake-file-api(7)” “codemodel” version 2 “version” field has
    been updated to 2.8.

  • The “cmake-file-api(7)” “codemodel” version 2 “target” object gained
    a new “debugger” field.

Command-Line

  • The “cmake --link-no-warning-as-error” option was added to suppress
    the effects of the “LINK_WARNING_AS_ERROR” target property and
    “CMAKE_LINK_WARNING_AS_ERROR” variable.

  • The “cmake --project-file” option was added to specify an alternate
    filename for “CMakeLists.txt” files. This is intended for temporary
    use by developers during an incremental transition and not for
    publication of a final product. CMake will always emit a warning
    when the project file is anything other than “CMakeLists.txt”.

Commands

  • The “target_link_libraries()” command now supports the “LINKER:”
    prefix.

Variables

  • The “AIX” and “CMAKE_HOST_AIX” variables are now set to true when
    the target or host system is AIX, respectively.

  • Linker flag variables learned to support the “LINKER:” prefix:

    • “CMAKE_EXE_LINKER_FLAGS”

    • “CMAKE_EXE_LINKER_FLAGS_<CONFIG>”

    • “CMAKE_SHARED_LINKER_FLAGS”

    • “CMAKE_SHARED_LINKER_FLAGS_<CONFIG>”

    • “CMAKE_MODULE_LINKER_FLAGS”

    • “CMAKE_MODULE_LINKER_FLAGS_<CONFIG>”

    See policy “CMP0181”.

  • The “CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL” variable was
    added to specify the “execute_process()” command’s default
    “COMMAND_ERROR_IS_FATAL” behavior.

  • The “CMAKE_<LANG>LINK_MODE" and "CMAKE<LANG>_DEVICE_LINK_MODE”
    variables were added to provide information on how the link step is
    done.

  • The “CMAKE_LINK_WARNING_AS_ERROR” variable and corresponding
    “LINK_WARNING_AS_ERROR” target property were added to link using a
    linker-specific flag to treat warnings as errors.

  • The “CMAKE_MSVC_RUNTIME_CHECKS” variable and “MSVC_RUNTIME_CHECKS”
    target property were introduced to select runtime checks for
    compilers targeting the MSVC ABI. See policy “CMP0184”.

  • The “CMAKE_POLICY_VERSION_MINIMUM” variable was added to help
    packagers and end users try to configure existing projects that have
    not been updated to work with supported CMake versions. The
    “CMAKE_POLICY_VERSION_MINIMUM” environment variable was added to
    initialize it.

  • The “CMAKE_XCODE_SCHEME_LLDB_INIT_FILE” variable and corresponding
    “XCODE_SCHEME_LLDB_INIT_FILE” target property were added to tell the
    “Xcode” generator what to put in the scheme’s “LLDB Init File”
    setting.

  • The “CMAKE_XCODE_SCHEME_TEST_CONFIGURATION” variable and
    corresponding “XCODE_SCHEME_TEST_CONFIGURATION” target property were
    added to tell the “Xcode” generator what to put in the scheme’s
    “Build Configuration” setting for the test action.

Properties

  • The “DEBUGGER_WORKING_DIRECTORY” target property and corresponding
    “CMAKE_DEBUGGER_WORKING_DIRECTORY” variable were added to tell
    generators what debugger working directory should be set for
    targets.

  • The “STATIC_LIBRARY_OPTIONS” target property now supports an
    “ARCHIVER:” prefix to pass options to the archiver through the
    compiler driver in a portable way.

  • The “Swift_MODULE_DIRECTORY” target property now supports “generator
    expressions”.

  • The “VS_CUSTOM_COMMAND_DISABLE_PARALLEL_BUILD” source file property
    was added to tell Visual Studio Generators not to run a custom
    command in parallel.

  • The “VS_SOLUTION_ITEMS” directory property was added to tell Visual
    Studio Generators to attach files directly to the Solution (“.sln”).

Modules

  • The “ExternalData” module gained a “ExternalData_HTTPHEADERS”
    variable to specify HTTP headers.

  • The “ExternalProject” module’s “ExternalProject_Add()” command
    gained an “INSTALL_JOB_SERVER_AWARE” option to enable integration of
    the GNU Make job server when using an explicit “INSTALL_COMMAND”
    with Makefile Generators.

  • The “FeatureSummary” module “add_feature_info()” command now
    supports full Condition Syntax. See policy “CMP0183”.

  • The “FindBISON” module “bison_target()” command gained an “OPTIONS”
    option to specify Bison command-line options.

  • The “FindCURL” module now provides a “CURL_VERSION” result variable
    to match upstream cURL’s CMake package.

  • The “FindFLEX” module “flex_target()” command gained an “OPTIONS”
    option to specify Flex command-line options.

  • The “FindPatch” module now supports running in cmake -P script mode
    by skipping the creation of the imported target.

  • The “FindProtobuf” module “protobuf_generate()” command gained a
    “PROTOC_EXE” option to specify a custom “protoc” executable.

  • The “FindPython”, “FindPython2”, and “FindPython3” modules gained
    the possibility to do multiple calls in the same directory by using,
    respectively, the variables “Python_ARTIFACTS_PREFIX”,
    “Python2_ARTIFACTS_PREFIX”, and “Python3_ARTIFACTS_PREFIX”.

  • The “FindRuby” module learned to find rbenv-provided installations.

Generator Expressions

  • The “$<PATH>” generator expression gained the “NATIVE_PATH”
    operation to convert a CMake path into a native one.

CTest

  • The “ctest --interactive-debug-mode” option on Windows now enables
    Windows Error Reporting by default in test processes, allowing them
    to creating debug popup windows and core dumps. This restores
    behavior previously removed by CMake 3.11 after updates to “libuv”
    made it possible.

CPack

  • The “CPack Archive Generator” learned to generated “.tar” packages
    without compression.

  • The “CPack Archive Generator” now honors the
    “CPACK_ARCHIVE_FILE_NAME” variable for all packages. Previously,
    this variable worked only for component-based packages.

Deprecated and Removed Features

  • Compatibility with versions of CMake older than 3.5 has been
    removed. Calls to “cmake_minimum_required()” or “cmake_policy()”
    that set the policy version to an older value now issue an error.
    Note that calls to those commands can still support older versions
    of CMake by using their “VERSION” arguments’ “<min>…<max>” syntax.
    This requires only the “<min>” version of CMake, but when running a
    newer version, sets policies up to the “<max>” version.

  • The “Visual Studio 14 2015” and “Visual Studio 15 2017” generators
    no longer support specifying a platform as part of the generator
    name. See Visual Studio Platform Selection.

  • The “CMAKE_<LANG>USING_LINKER_MODE" variable is no longer used to
    determine the type of the contents of the
    "CMAKE
    <LANG>USING_LINKER<TYPE>” variable. The
    “CMAKE_<LANG>_LINK_MODE” variable, set by CMake, is used instead.

  • The “FindGDAL” module is now deprecated in favor of upstream GDAL’s
    official CMake package configuration file. Port projects to the
    latter by calling “find_package(GDAL CONFIG)”. For further details,
    see GDAL’s documentation on CMake integration.

  • The “FindRuby” module no longer provides variables with the upper-
    case “RUBY_” prefix. See policy “CMP0185”.

  • CTest’s undocumented declarative scripting mode has been removed.
    This mode used to be triggered by a “ctest -S” script which did not
    call any CTest Commands unless “CTEST_RUN_CURRENT_SCRIPT” was
    explicitly set to “OFF”.

  • The “ctest_run_script()” command may no longer be called without any
    arguments.

Other Changes

  • On macOS with Ninja Generators and Makefile Generators, when a
    compiler is found in “/usr/bin”, it is now used as-is and is no
    longer mapped to the corresponding compiler inside Xcode. The
    mapping was introduced by CMake 3.2 to allow build trees to continue
    to work with their original compiler even when “xcode-select”
    switches to a different Xcode installation. However, the compilers
    inside Xcode cannot be used without explicit “-isysroot” flags and
    are therefore not suitable for passing to arbitrary third-party
    build systems. Furthermore, the mapping behavior can override user-
    specified compiler paths. Therefore, this behavior has been
    reverted.

  • Builds targeting macOS no longer choose any SDK or pass an
    “-isysroot” flag to the compiler by default. Instead, compilers are
    expected to choose a default macOS SDK on their own. In order to
    use a compiler that does not do this, users must now specify
    “-DCMAKE_OSX_SYSROOT=macosx” when configuring their build.

  • On AIX, “SHARED” library targets now produce a shared library
    archive by default. See policy “CMP0182”.

  • The “cmake --preset” command no longer outputs a summary of the
    preset’s CMake cache and environment variables by default. That
    summary is now only shown when the message log level is set to
    “VERBOSE”, “DEBUG”, or “TRACE” via the “cmake --log-level” option
    or the “CMAKE_MESSAGE_LOG_LEVEL” cache variable.

  • Precompiled SunOS “sparc” and “i386” binaries are now provided on
    cmake.org.


Changes made since CMake 4.0.0-rc1:

Brad King (18):

  • Help: add_dependencies requires at least two arguments
  • gitattributes: Do not export pre-commit config file in source archives
  • clang-tidy: Do not require config file if not running clang-tidy
  • Tests: Cover CMAKE_POLICY_VERSION_MINIMUM as cache entry
  • Tests: Cover CMAKE_POLICY_VERSION_MINIMUM in script mode
  • Tests: Cover CMAKE_POLICY_VERSION_MINIMUM in initial cache script
  • Add CMAKE_POLICY_VERSION_MINIMUM environment variable
  • Tests: Fix typos in RunCMake.ParseImplicitLinkInfo sample data
  • Tests: Make RunCMake.ParseImplicitLinkInfo robust to on-disk libstdc++.a
  • cmGeneratorExpressionDAGChecker: Construct with initializer list syntax
  • cmGeneratorExpressionDAGChecker: De-duplicate constructor signature
  • cmGeneratorExpressionDAGChecker: Construct with initializer list syntax
  • Tests: Split CustomTransitiveProperties argument checks into helper
  • Tests: Extend CustomTransitiveProperties with non-transitive LINK_LIBRARIES
  • Tests: Extend CustomTransitiveProperties with custom transitive LINK_LIBRARIES
  • GenEx: Restore evaluation context for conditional transitive properties
  • GenEx: Fix evaluation of LINK_LIBRARIES as custom transitive property
  • CMake 4.0.0-rc2

Martin Duffy (2):

  • CTest: Fix startTime in test snippets when using instrumentation
  • instrumentation: Quote command arguments to preserve separation

Matthew Woehlke (1):

  • CPS: Fix importing from the prefix root

Roger Leigh (1):

  • libuv: Remove kvm dependency for all BSDs except NetBSD

I have a strange problem with this version:

bash-5.2$ make
cmake --workflow --preset Release --fresh
Executing workflow step 1 of 5: configure preset "Release"

-- The CXX compiler identification is Clang 19.1.7
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/local/opt/llvm/bin/clang++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMAKE_UNITY_BUILD
-- Fetching Boost
CMake Error: Problem with archive_read_next_header(): Pathname cannot be converted from UTF-16LE to current locale.
CMake Error: Problem extracting tar: /Users/clausklein/Workspace/cpp/cxx20/boost-cmake/build/Release/_deps/boost-tmp/boost-1.87.0-cmake.7z
CMake Error at build/Release/CMakeFiles/fc-stamp/boost/extract-boost.cmake:40 (message):
  Extract of
  '/Users/clausklein/Workspace/cpp/cxx20/boost-cmake/build/Release/_deps/boost-tmp/boost-1.87.0-cmake.7z'
  failed
Call Stack (most recent call first):
  build/Release/CMakeFiles/fc-tmp/boost/download.cmake:9 (include)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:1753 (include)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:1706 (__FetchContent_doStepDirect)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:1607 (__FetchContent_populateDirect)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:2145:EVAL:2 (__FetchContent_doPopulation)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:2145 (cmake_language)
  /Users/clausklein/.local/share/cmake-4.0/Modules/FetchContent.cmake:2384 (__FetchContent_Populate)
  CMakeLists.txt:143 (FetchContent_MakeAvailable)


-- Configuring incomplete, errors occurred!
make: *** [fresh] Error 1
bash-5.2$ 

with export LANG=en_us.UTF-8 instead of export LANG=C it works