#!/usr/bin/env bash## This script installs an up-to-date version of CMake.## For MacOS use Homebrew to install the latest version.## For Ubuntu use the official KitWare Apt repository with backports.# See: https://apt.kitware.com/## For other systems (RHEL 8.x, 9.x, AmazonLinux, SUSE, Fedora, Arch, etc)# use the official CMake installer script from KitWare.## Note this is similar to how GitHub Actions runners install cmake:# https://github.com/actions/runner-images/blob/main/images/ubuntu/scripts/build/install-cmake.sh## Upstream: 3.30.4 (2024-09-27) set -euo pipefail if [[ "$(uname -s)" == "darwin" ]]; then brew --version >/dev/null \ || echo "Error: Homebrew is required to install cmake on MacOS." && exit 1 echo "Installing cmake via Homebrew (can't pin to old versions)." brew install cmake exit 0elif [ "$(uname -s)" != "Linux" ]; then echo "Error: This script is intended for MacOS/Linux systems only." exit 1elif [ -z "${1:-}" ]; then echo "Usage: $0 [3.30.4]" exit 1fiCMAKE_VERSION="${CMAKE_VERSION:-${1:-3.30.4}}" if [ "$(whoami)" = root ]; then SUDO=; else SUDO="$(command -v sudo || command -v doas || true)"; fi if cmake --version 2>/dev/null | grep -q "$CMAKE_VERSION"; then echo "CMake $CMAKE_VERSION is already installed." exit 0elif [ -e /usr/local/bin/cmake ]; then echo "Warning: existing cmake found at /usr/local/bin/cmake. Skipping installation." exit 0elif [ -e /etc/apt/sources.list.d/kitware.list ]; then echo "Warning: existing KitWare repository found. Skipping installation." exit 0elif [ -e /etc/lsb-release ] && grep -qP 'DISTRIB_ID=Ubuntu' /etc/lsb-release; then curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc \ | $SUDO gpg --dearmor - \ | $SUDO tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" \ | $SUDO tee /etc/apt/sources.list.d/kitware.list >/dev/null $SUDO apt-get update $SUDO apt-get install -y kitware-archive-keyring cmakeelse arch="$(uname -m)" if [ "$arch" != "x86_64" ] && [ "$arch" != "aarch64" ]; then echo "Error. Only x86_64 and aarch64 are supported." exit 1 fi tempdir=$(mktemp -d) pushd "$tempdir" CMAKE_REPO="https://github.com/Kitware/CMake" CMAKE_INSTALLER="cmake-$CMAKE_VERSION-linux-$arch.sh" curl -fsSL --output cmake-$CMAKE_VERSION-SHA-256.txt \ "$CMAKE_REPO/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-SHA-256.txt" curl -fsSL --output $CMAKE_INSTALLER \ "$CMAKE_REPO/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-linux-$arch.sh" # workaround for old versions of sha256sum not having --ignore-missing grep -F "cmake-$CMAKE_VERSION-linux-$arch.sh" "cmake-$CMAKE_VERSION-SHA-256.txt" \ | sha256sum -c \ | grep -qP "^${CMAKE_INSTALLER}: OK" chmod +x cmake-$CMAKE_VERSION-linux-$arch.sh $SUDO ./cmake-$CMAKE_VERSION-linux-$arch.sh --prefix=/usr/local --skip-license popd rm -rf "$tempdir"fi
#!/usr/bin/env bash
#
# This script installs an up-to-date version of CMake.
#
# For MacOS use Homebrew to install the latest version.
#
# For Ubuntu use the official KitWare Apt repository with backports.
# See: https://apt.kitware.com/
#
# For other systems (RHEL 8.x, 9.x, AmazonLinux, SUSE, Fedora, Arch, etc)
# use the official CMake installer script from KitWare.
#
# Note this is similar to how GitHub Actions runners install cmake:
# https://github.com/actions/runner-images/blob/main/images/ubuntu/scripts/build/install-cmake.sh
#
# Upstream: 3.30.4 (2024-09-27)
set -euo pipefail
if [[ "$(uname -s)" == "darwin" ]]; then
brew --version >/dev/null \
|| echo "Error: Homebrew is required to install cmake on MacOS." && exit 1
echo "Installing cmake via Homebrew (can't pin to old versions)."
brew install cmake
exit 0
elif [ "$(uname -s)" != "Linux" ]; then
echo "Error: This script is intended for MacOS/Linux systems only."
exit 1
elif [ -z "${1:-}" ]; then
echo "Usage: $0 [3.30.4]"
exit 1
fi
CMAKE_VERSION="${CMAKE_VERSION:-${1:-3.30.4}}"
if [ "$(whoami)" = root ]; then SUDO=; else SUDO="$(command -v sudo || command -v doas || true)"; fi
if cmake --version 2>/dev/null | grep -q "$CMAKE_VERSION"; then
echo "CMake $CMAKE_VERSION is already installed."
exit 0
elif [ -e /usr/local/bin/cmake ]; then
echo "Warning: existing cmake found at /usr/local/bin/cmake. Skipping installation."
exit 0
elif [ -e /etc/apt/sources.list.d/kitware.list ]; then
echo "Warning: existing KitWare repository found. Skipping installation."
exit 0
elif [ -e /etc/lsb-release ] && grep -qP 'DISTRIB_ID=Ubuntu' /etc/lsb-release; then
curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc \
| $SUDO gpg --dearmor - \
| $SUDO tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" \
| $SUDO tee /etc/apt/sources.list.d/kitware.list >/dev/null
$SUDO apt-get update
$SUDO apt-get install -y kitware-archive-keyring cmake
else
arch="$(uname -m)"
if [ "$arch" != "x86_64" ] && [ "$arch" != "aarch64" ]; then
echo "Error. Only x86_64 and aarch64 are supported."
exit 1
fi
tempdir=$(mktemp -d)
pushd "$tempdir"
CMAKE_REPO="https://github.com/Kitware/CMake"
CMAKE_INSTALLER="cmake-$CMAKE_VERSION-linux-$arch.sh"
curl -fsSL --output cmake-$CMAKE_VERSION-SHA-256.txt \
"$CMAKE_REPO/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-SHA-256.txt"
curl -fsSL --output $CMAKE_INSTALLER \
"$CMAKE_REPO/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-linux-$arch.sh"
# workaround for old versions of sha256sum not having --ignore-missing
grep -F "cmake-$CMAKE_VERSION-linux-$arch.sh" "cmake-$CMAKE_VERSION-SHA-256.txt" \
| sha256sum -c \
| grep -qP "^${CMAKE_INSTALLER}: OK"
chmod +x cmake-$CMAKE_VERSION-linux-$arch.sh
$SUDO ./cmake-$CMAKE_VERSION-linux-$arch.sh --prefix=/usr/local --skip-license
popd
rm -rf "$tempdir"
fi