diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8a00ccd..5e8be0a 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.27.0 +current_version = 3.28.1 [bumpversion:file:.gitlab-ci.yml] search = cmake-{current_version}-linux diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c79c73b..27ff88c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,7 +5,7 @@ test_code: - apt-get update && apt-get install -y make cmake libboost-dev git # We will install latest CMake, even though Ubuntu has a recent one - mkdir -p $HOME/.local - - curl -s "https://cmake.org/files/v3.27/cmake-3.27.0-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C $HOME/.local + - curl -s "https://cmake.org/files/v3.28/cmake-3.28.1-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C $HOME/.local - export PATH=$HOME/.local/bin:$PATH script: - cmake -S examples -B build diff --git a/README.md b/README.md index 397045c..823ea2a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Certainly there are no shortage of problems when building. But I think that, in 2023, we have a very good solution to quite a few of those problems. It's CMake. Not CMake 2.8 though; that was released before C++11 even existed! Nor the horrible examples out there for CMake (even those posted on KitWare's own tutorials list). -I'm talking about Modern CMake. CMake 3.5+, maybe even CMake 3.27+! +I'm talking about Modern CMake. CMake 3.5+, maybe even CMake 3.28+! It's clean, powerful, and elegant, so you can spend most of your time coding, not adding lines to an unreadable, unmaintainable Make (Or CMake 2) file. And CMake 3.11+ is supposed to be significantly faster, as well! diff --git a/chapters/basics.md b/chapters/basics.md index e7aefae..0a1ab58 100644 --- a/chapters/basics.md +++ b/chapters/basics.md @@ -34,7 +34,7 @@ Windows users, who also usually have a very recent version of CMake. This is what new projects should do: ```cmake -cmake_minimum_required(VERSION 3.7...3.27) +cmake_minimum_required(VERSION 3.7...3.28) if(${CMAKE_VERSION} VERSION_LESS 3.12) cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) @@ -54,10 +54,10 @@ you will want to do this instead: ```cmake cmake_minimum_required(VERSION 3.7) -if(${CMAKE_VERSION} VERSION_LESS 3.27) +if(${CMAKE_VERSION} VERSION_LESS 3.28) cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) else() - cmake_policy(VERSION 3.27) + cmake_policy(VERSION 3.28) endif() ``` diff --git a/chapters/intro/installing.md b/chapters/intro/installing.md index 336bc9a..5427169 100644 --- a/chapters/intro/installing.md +++ b/chapters/intro/installing.md @@ -4,7 +4,7 @@ Your CMake version should be newer than your compiler. It should be newer than the libraries you are using (especially Boost). New versions work better for everyone. {% endhint %} -If you have a built in copy of CMake, it isn't special or customized for your system. You can easily install a new one instead, either on the system level or the user level. Feel free to instruct your users here if they complain about a CMake requirement being set too high. Especially if they want 3.1+ support. Maybe even if they want 3.27+ support... +If you have a built in copy of CMake, it isn't special or customized for your system. You can easily install a new one instead, either on the system level or the user level. Feel free to instruct your users here if they complain about a CMake requirement being set too high. Especially if they want 3.1+ support. Maybe even if they want 3.28+ support... #### Quick list (more info on each method below) @@ -35,14 +35,14 @@ You can [download CMake from KitWare][download]. This is how you will probably g On Linux, there are several options. Kitware provides a [Debian/Ubuntu apt repository][apt], as well as [snap packages][snap]. There are universal Linux binaries provided, but you'll need to pick an install location. If you already use `~/.local` for user-space packages, the following single line command[^1] will get CMake for you [^2]: {% term %} -~ $ wget -qO- "https://cmake.org/files/v3.27/cmake-3.27.0-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C ~/.local +~ $ wget -qO- "https://cmake.org/files/v3.28/cmake-3.28.1-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C ~/.local {% endterm %} The names changed in 3.20; older releases had names like `cmake-3.19.7-Linux-x86_64.tar.gz`. If you just want a local folder with CMake only: {% term %} -~ $ mkdir -p cmake-3.27 && wget -qO- "https://cmake.org/files/v3.27/cmake-3.27.0-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C cmake-3.27 -~ $ export PATH=`pwd`/cmake-3.27/bin:$PATH +~ $ mkdir -p cmake-3.28 && wget -qO- "https://cmake.org/files/v3.28/cmake-3.28.1-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C cmake-3.28 +~ $ export PATH=`pwd`/cmake-3.28/bin:$PATH {% endterm %} You'll obviously want to append to the PATH every time you start a new terminal, or add it to your `.bashrc` or to an [LMod][] system. @@ -50,7 +50,7 @@ You'll obviously want to append to the PATH every time you start a new terminal, And, if you want a system install, install to `/usr/local`; this is an excellent choice in a Docker container, for example on GitLab CI. Do not try it on a non-containerized system. {% term %} -docker $ wget -qO- "https://cmake.org/files/v3.27/cmake-3.27.0-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C /usr/local +docker $ wget -qO- "https://cmake.org/files/v3.28/cmake-3.28.1-linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C /usr/local {% endterm %} If you are on a system without wget, replace `wget -qO-` with `curl -s`. @@ -132,8 +132,8 @@ Just `pip install cmake` on many systems. Add `--user` if you have to (modern pi | ------------------------------------------------------------------------------------------------------------------------------------ | ------------- | ------------------------------------------------------------ | | [TravisCI Xenial](https://docs.travis-ci.com/user/reference/xenial/#compilers-and-build-toolchain) | 3.12.4 | Mid November 2018 this image became ready for widescale use. | | [TravisCI Bionic](https://docs.travis-ci.com/user/reference/bionic/#compilers-and-build-toolchain) | 3.12.4 | Same as Xenial at the moment. | -| [Azure DevOps](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#use-a-microsoft-hosted-agent) | 3.27.0 | kept up to date | -| [GitHub Actions 20.04](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md) | 3.27.0 | Same runners as Azure DevOps | +| [Azure DevOps](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#use-a-microsoft-hosted-agent) | 3.28.0 | kept up to date | +| [GitHub Actions 20.04](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md) | 3.28.0 | Same runners as Azure DevOps | If you are using GitHub Actions, also see the [jwlawson/actions-setup-cmake](https://github.com/marketplace/actions/actions-setup-cmake) action, which can install your selection of CMake, even in a docker action run. diff --git a/chapters/intro/newcmake.md b/chapters/intro/newcmake.md index 724e887..2b08daf 100644 --- a/chapters/intro/newcmake.md +++ b/chapters/intro/newcmake.md @@ -4,8 +4,29 @@ This is an abbreviated version of the CMake changelog with just the highlights f ## [CMake in development][cmake master]: WIP -* `CMAKE_CROSSCOMPILING_EMULATOR` environment variable added. +* Linker selection option +* CMake test launcher +* If commands to check file permissions +* You can now make tests depend on `all` with `CMAKE_SKIP_TEST_ALL_DEPENDENCY` set to `FALSE`! + + +## [CMake 3.28][]: C++20 modules + +This release adds [C++ module](https://cmake.org/cmake/help/latest/manual/cmake-cxxmodules.7.html) +support. This does not include C++23's `import std`, but is exciting step +forward for this landmark C++20 feature. These will be scanned by default if +using C++20+ and a new enough compiler and valid generator and if you have a +CMake minimum or maximum that includes CMake 3.28. + +* Initially released [December 6, 2023](https://www.kitware.com/cmake-3-28-0-available-for-download/) +* C++20 named modules supported by Ninja 1.11+ and MSVC 17.4+. +* `HIP` supported for NVIDIA. * Apple's VisionOS added. +* `CMAKE_CROSSCOMPILING_EMULATOR` environment variable added. +* Get/set properties TEST supports other DIRECTORY's +* Some support for job servers added +* Support for passing variables to pkg-config +* Generator expressions now support short-circuting ## [CMake 3.27][]: Debugger @@ -497,5 +518,6 @@ There were a ton of additions to this version of CMake, primarily to fill out th [cmake 3.25]: https://cmake.org/cmake/help/latest/release/3.25.html [cmake 3.26]: https://cmake.org/cmake/help/latest/release/3.26.html [cmake 3.27]: https://cmake.org/cmake/help/latest/release/3.27.html +[cmake 3.28]: https://cmake.org/cmake/help/latest/release/3.28.html [cmake master]: https://cmake.org/cmake/help/git-master/release/index.html [fastercmake]: https://blog.kitware.com/improving-cmakes-runtime-performance/ diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 8197abd..3e48f65 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.11...3.27) +cmake_minimum_required(VERSION 3.11...3.28) project(ModernCMakeExamples) set(MODERN_CMAKE_BUILD_TESTING ON) diff --git a/examples/extended-project/CMakeLists.txt b/examples/extended-project/CMakeLists.txt index d49dac6..8ed4417 100644 --- a/examples/extended-project/CMakeLists.txt +++ b/examples/extended-project/CMakeLists.txt @@ -1,5 +1,5 @@ -# Works with 3.14 and tested through 3.27 -cmake_minimum_required(VERSION 3.14...3.27) +# Works with 3.14 and tested through 3.28 +cmake_minimum_required(VERSION 3.14...3.28) # Project name and a few useful settings. Other commands can pick up the results project( diff --git a/examples/fetch/CMakeLists.txt b/examples/fetch/CMakeLists.txt index f85779c..f165617 100644 --- a/examples/fetch/CMakeLists.txt +++ b/examples/fetch/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.14...3.27) +cmake_minimum_required(VERSION 3.14...3.28) project(FetchExample LANGUAGES CXX) diff --git a/examples/root-dict/CMakeLists.txt b/examples/root-dict/CMakeLists.txt index bd31ca0..68cd98b 100644 --- a/examples/root-dict/CMakeLists.txt +++ b/examples/root-dict/CMakeLists.txt @@ -2,7 +2,7 @@ ## [main] -cmake_minimum_required(VERSION 3.4...3.27) +cmake_minimum_required(VERSION 3.4...3.28) project(RootDictExample LANGUAGES CXX) diff --git a/examples/root-simple/CMakeLists.txt b/examples/root-simple/CMakeLists.txt index 32e1018..b435016 100644 --- a/examples/root-simple/CMakeLists.txt +++ b/examples/root-simple/CMakeLists.txt @@ -1,7 +1,7 @@ # CMake ROOT simple example ## [main] -cmake_minimum_required(VERSION 3.1...3.27) +cmake_minimum_required(VERSION 3.1...3.28) project(RootSimpleExample LANGUAGES CXX) diff --git a/examples/root-usefile/CMakeLists.txt b/examples/root-usefile/CMakeLists.txt index dc255cd..7f9674d 100644 --- a/examples/root-usefile/CMakeLists.txt +++ b/examples/root-usefile/CMakeLists.txt @@ -1,7 +1,7 @@ # CMake ROOT usefile example ## [main] -cmake_minimum_required(VERSION 3.1...3.27) +cmake_minimum_required(VERSION 3.1...3.28) project(RootUseFileExample LANGUAGES CXX) diff --git a/examples/simple-project/CMakeLists.txt b/examples/simple-project/CMakeLists.txt index 1fe3ba3..c2e8c74 100644 --- a/examples/simple-project/CMakeLists.txt +++ b/examples/simple-project/CMakeLists.txt @@ -6,7 +6,7 @@ # You should always specify a range with the newest # and oldest tested versions of CMake. This will ensure # you pick up the best policies. -cmake_minimum_required(VERSION 3.1...3.27) +cmake_minimum_required(VERSION 3.1...3.28) # This is your project statement. You should always list languages; # Listing the version is nice here since it sets lots of useful variables