Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Up Minimum CMake Version to 3.20 #86530

Merged
merged 15 commits into from
Jul 4, 2023
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion docs/workflow/requirements/linux-requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Minimum RAM required to build is 1GB. The build is known to fail on 512 MB VMs (

Install the following packages for the toolchain:

* CMake 3.14.5 or newer
* CMake 3.20 or newer
* llvm
* lld
* clang
Expand All @@ -40,12 +40,24 @@ Install the following packages for the toolchain:
* zlib1g-dev
* ninja-build (optional, enables building native code with ninja instead of make)

**NOTE**: If you have an Ubuntu version older than 22.04 LTS, don't install `cmake` using `apt` directly. Follow the note written down below.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for reference, it looks like Debian 11 Bullseye (oldstable) has cmake 3.18.4 and Debian 12 Bookworm (stable) has cmake 3.25.1. So it may be worth also noting that Debian older than 12 also has an outdated cmake in its package repository since the same 'use snap or Kitware APT' solution applies there too.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great thanks for pointing this out. I'll update the doc.


```bash
sudo apt install -y cmake llvm lld clang build-essential \
python-is-python3 curl git lldb libicu-dev liblttng-ust-dev \
libssl-dev libkrb5-dev zlib1g-dev ninja-build
```

**NOTE**: As of now, Ubuntu's `apt` only has until CMake version 3.16.3 if you're using Ubuntu 20.04 LTS (or less in older Ubuntu versions), which is lower than the required 3.20. For this case, we can use the `snap` package manager or the _Kitware APT feed_ to get a new enough version of CMake.

For snap:

```bash
sudo snap install cmake
```

For the _Kitware APT feed_, follow its [instructions here](https://apt.kitware.com/).

You now have all the required components.

#### Additional Requirements for Cross-Building
Expand Down
2 changes: 1 addition & 1 deletion docs/workflow/requirements/macos-requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Building _dotnet/runtime_ depends on several tools to be installed. You can down

Install the following packages:

* CMake 3.15.5 or newer
* CMake 3.20 or newer
* icu4c
* [email protected] or openssl@3
* pkg-config
Expand Down
4 changes: 3 additions & 1 deletion docs/workflow/requirements/windows-requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ These steps are required only in case the tools have not been installed as Visua
* Install [CMake](https://cmake.org/download) for Windows.
* Add its location (e.g. C:\Program Files (x86)\CMake\bin) to the PATH environment variable. The installation script has a check box to do this, but you can do it yourself after the fact following the instructions at [Adding to the Default PATH variable](#adding-to-the-default-path-variable).

The _dotnet/runtime_ repository recommends using CMake 3.16.4 or newer, but it may work with CMake 3.15.5.
The _dotnet/runtime_ repository requires using CMake 3.20 or newer.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should mention something in the section about the -msbuild flag that CMake 3.21 is required to use that flag (maybe we can add validation of that at some point?)

Copy link
Member Author

@ivdiazsa ivdiazsa May 23, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That sounds good to me. Do you mean that on Windows, if you have CMake 3.21 or later, you have to always use the -msbuild flag? As in:

.\build.cmd <args go here> -msbuild

Otherwise it will fail?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not quite. I mean if you want to use the -msbuild flag on Windows, you need at least CMake 3.21 as the VS2022 generator doesn't exist in CMake until that version.


**NOTE**: If you plan on using the `-msbuild` flag for building the repo, you will need version 3.21 at least. This is because the VS2022 generator doesn't exist in CMake until said version.

#### Ninja

Expand Down
15 changes: 4 additions & 11 deletions src/coreclr/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
cmake_minimum_required(VERSION 3.6.2)
cmake_minimum_required(VERSION 3.20)

cmake_policy(SET CMP0042 NEW) # MACOSX_RPATH is enabled by default.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need to set these policies individually after specifying minimum required version 3.20?

cmake_minimum_required(VERSION 3.20) should set these policies to NEW according to the docs: https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We plan to update the cmake_policy statements, remove redundant ones, as well as other build improvements after doing the initial minimum version upgrade. We wanted to keep the PR that is most likely to break workflows as small as possible to limit the risk of the change (and risk of having to revert it).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you want to keep this PR as minimal as possible and keep cleanup for later, this block can stay as is. The if (CMAKE_VERSION VERSION_GREATER ...) conditions are harmless.


if (CMAKE_VERSION VERSION_GREATER 3.7 OR CMAKE_VERSION VERSION_EQUAL 3.7)
cmake_policy(SET CMP0066 NEW) # Honor per-config flags in try_compile() source-file signature.
endif()
if (CMAKE_VERSION VERSION_GREATER 3.8 OR CMAKE_VERSION VERSION_EQUAL 3.8)
cmake_policy(SET CMP0067 NEW) # Honor language standard in try_compile() source-file signature
endif()
if (CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
cmake_policy(SET CMP0091 NEW) # MSVC runtime library flags are selected by an abstraction.
endif()
cmake_policy(SET CMP0066 NEW) # Honor per-config flags in try_compile() source-file signature.
cmake_policy(SET CMP0067 NEW) # Honor language standard in try_compile() source-file signature
cmake_policy(SET CMP0091 NEW) # MSVC runtime library flags are selected by an abstraction.

# Set the project name
project(CoreCLR)
Expand Down
4 changes: 2 additions & 2 deletions src/libraries/tests.proj
Original file line number Diff line number Diff line change
Expand Up @@ -722,12 +722,12 @@

<ItemGroup>
<NormalTestAppBundles Include="$(NormalTestsAppBundleRoot)*/AppBundle/CMakeLists.txt" />
<NormalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.16)" />
<NormalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.20)" />
<NormalTestCMakeEntries Include="project(NormalTestAppBundles)" />
<NormalTestCMakeEntries Include="add_subdirectory(%(NormalTestAppBundles.RootDir)%(NormalTestAppBundles.Directory) %(NormalTestAppBundles.RecursiveDir) EXCLUDE_FROM_ALL)" />

<FunctionalTestAppBundles Include="$(FunctionalTestsAppBundleRoot)*/AppBundle/CMakeLists.txt" />
<FunctionalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.16)" />
<FunctionalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.20)" />
<FunctionalTestCMakeEntries Include="project(FunctionalTestAppBundles)" />
<FunctionalTestCMakeEntries Include="add_subdirectory(%(FunctionalTestAppBundles.RootDir)%(FunctionalTestAppBundles.Directory) %(FunctionalTestAppBundles.RecursiveDir) EXCLUDE_FROM_ALL)" />
</ItemGroup>
Expand Down
7 changes: 2 additions & 5 deletions src/native/corehost/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
cmake_minimum_required(VERSION 3.6.2)

if (CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
cmake_policy(SET CMP0091 NEW)
endif()
cmake_minimum_required(VERSION 3.20)
cmake_policy(SET CMP0091 NEW)

project(corehost)

Expand Down
2 changes: 1 addition & 1 deletion src/native/external/libunwind/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
project(libunwind)

cmake_minimum_required(VERSION 3.16.1)
jkoritzinsky marked this conversation as resolved.
Show resolved Hide resolved
cmake_minimum_required(VERSION 3.20)

set(CMAKE_C_STANDARD 11)

Expand Down
2 changes: 1 addition & 1 deletion src/native/external/llvm-libunwind/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Setup Project
#===============================================================================

cmake_minimum_required(VERSION 3.13.4)
cmake_minimum_required(VERSION 3.20)

set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")

Expand Down
2 changes: 1 addition & 1 deletion src/native/external/zlib/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.4.4)
cmake_minimum_required(VERSION 3.20)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

project(zlib C)
Expand Down
11 changes: 2 additions & 9 deletions src/native/libs/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
cmake_minimum_required(VERSION 3.6.2)
include(CheckCCompilerFlag)
cmake_minimum_required(VERSION 3.17.0)

if (CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS)
# CMake 3.14.5 contains bug fixes for iOS
cmake_minimum_required(VERSION 3.14.5)
elseif (CLR_CMAKE_TARGET_MACCATALYST)
# CMake 3.18.1 properly generates MacCatalyst C compiler
cmake_minimum_required(VERSION 3.18.1)
endif ()
include(CheckCCompilerFlag)

if (WIN32)
cmake_policy(SET CMP0091 NEW)
Expand Down