c-capnproto/dk
Jonah Beckford f07596dbb5 Add CMake and tests
- Port tests to GitLab
- Add GitLab CI test matrix
- Remove gtest submodule
2023-08-07 20:28:42 -07:00

701 lines
No EOL
24 KiB
Bash
Executable file

#!/bin/sh
# Recommendation: Place this file in source control.
# Auto-generated by `./dk dksdk.project.new` of DkHelloWorld.
#
# Invoking: ./dk
# That works in Powershell on Windows, and in Unix. Copy-and-paste works!
#
# Purpose: Install CMake if not already. Then invoke CMake.
set -euf
# --- Imports of dkml-runtime-common's crossplatform-functions.sh ---
# Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`).
#
# Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not
# know whether the PATH has been set correctly, or when you do not know if the
# system binary exists.
#
# At some point in the future, this function will error out if the required system binaries
# do not exist. Most system binaries are common to all Unix/Linux/macOS installations but
# some (like `comm`) may need to be installed for proper functioning of DKML.
#
# Outputs:
# - env:DKMLSYS_MV - Location of `mv`
# - env:DKMLSYS_CHMOD - Location of `chmod`
# - env:DKMLSYS_UNAME - Location of `uname`
# - env:DKMLSYS_ENV - Location of `env`
# - env:DKMLSYS_AWK - Location of `awk`
# - env:DKMLSYS_SED - Location of `sed`
# - env:DKMLSYS_COMM - Location of `comm`
# - env:DKMLSYS_INSTALL - Location of `install`
# - env:DKMLSYS_RM - Location of `rm`
# - env:DKMLSYS_SORT - Location of `sort`
# - env:DKMLSYS_CAT - Location of `cat`
# - env:DKMLSYS_STAT - Location of `stat`
# - env:DKMLSYS_GREP - Location of `grep`
# - env:DKMLSYS_CURL - Location of `curl` (empty if not found)
# - env:DKMLSYS_WGET - Location of `wget` (empty if not found)
# - env:DKMLSYS_TR - Location of `tr`
autodetect_system_binaries() {
if [ -z "${DKMLSYS_MV:-}" ]; then
if [ -x /usr/bin/mv ]; then
DKMLSYS_MV=/usr/bin/mv
else
DKMLSYS_MV=/bin/mv
fi
fi
if [ -z "${DKMLSYS_CHMOD:-}" ]; then
if [ -x /usr/bin/chmod ]; then
DKMLSYS_CHMOD=/usr/bin/chmod
else
DKMLSYS_CHMOD=/bin/chmod
fi
fi
if [ -z "${DKMLSYS_UNAME:-}" ]; then
if [ -x /usr/bin/uname ]; then
DKMLSYS_UNAME=/usr/bin/uname
else
DKMLSYS_UNAME=/bin/uname
fi
fi
if [ -z "${DKMLSYS_ENV:-}" ]; then
if [ -x /usr/bin/env ]; then
DKMLSYS_ENV=/usr/bin/env
else
DKMLSYS_ENV=/bin/env
fi
fi
if [ -z "${DKMLSYS_AWK:-}" ]; then
if [ -x /usr/bin/awk ]; then
DKMLSYS_AWK=/usr/bin/awk
else
DKMLSYS_AWK=/bin/awk
fi
fi
if [ -z "${DKMLSYS_SED:-}" ]; then
if [ -x /usr/bin/sed ]; then
DKMLSYS_SED=/usr/bin/sed
else
DKMLSYS_SED=/bin/sed
fi
fi
if [ -z "${DKMLSYS_COMM:-}" ]; then
if [ -x /usr/bin/comm ]; then
DKMLSYS_COMM=/usr/bin/comm
else
DKMLSYS_COMM=/bin/comm
fi
fi
if [ -z "${DKMLSYS_INSTALL:-}" ]; then
if [ -x /usr/bin/install ]; then
DKMLSYS_INSTALL=/usr/bin/install
else
DKMLSYS_INSTALL=/bin/install
fi
fi
if [ -z "${DKMLSYS_RM:-}" ]; then
if [ -x /usr/bin/rm ]; then
DKMLSYS_RM=/usr/bin/rm
else
DKMLSYS_RM=/bin/rm
fi
fi
if [ -z "${DKMLSYS_SORT:-}" ]; then
if [ -x /usr/bin/sort ]; then
DKMLSYS_SORT=/usr/bin/sort
else
DKMLSYS_SORT=/bin/sort
fi
fi
if [ -z "${DKMLSYS_CAT:-}" ]; then
if [ -x /usr/bin/cat ]; then
DKMLSYS_CAT=/usr/bin/cat
else
DKMLSYS_CAT=/bin/cat
fi
fi
if [ -z "${DKMLSYS_STAT:-}" ]; then
if [ -x /usr/bin/stat ]; then
DKMLSYS_STAT=/usr/bin/stat
else
DKMLSYS_STAT=/bin/stat
fi
fi
if [ -z "${DKMLSYS_GREP:-}" ]; then
if [ -x /usr/bin/grep ]; then
DKMLSYS_GREP=/usr/bin/grep
else
DKMLSYS_GREP=/bin/grep
fi
fi
if [ -z "${DKMLSYS_CURL:-}" ]; then
if [ -x /usr/bin/curl ]; then
DKMLSYS_CURL=/usr/bin/curl
elif [ -x /bin/curl ]; then
DKMLSYS_CURL=/bin/curl
else
DKMLSYS_CURL=
fi
fi
if [ -z "${DKMLSYS_WGET:-}" ]; then
if [ -x /usr/bin/wget ]; then
DKMLSYS_WGET=/usr/bin/wget
elif [ -x /bin/wget ]; then
DKMLSYS_WGET=/bin/wget
else
DKMLSYS_WGET=
fi
fi
if [ -z "${DKMLSYS_TR:-}" ]; then
if [ -x /usr/bin/tr ]; then
DKMLSYS_TR=/usr/bin/tr
else
DKMLSYS_TR=/bin/tr
fi
fi
export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL
export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR
}
# Is a Windows build machine if we are in a MSYS2 or Cygwin environment.
#
# Better alternatives
# -------------------
#
# 1. If you are checking to see if you should do a cygpath, then just guard it
# like so:
# if [ -x /usr/bin/cygpath ]; then
# do_something $(/usr/bin/cygpath ...) ...
# fi
# This clearly guards what you are about to do (cygpath) with what you will
# need (cygpath).
# 2. is_arg_windows_platform
is_unixy_windows_build_machine() {
if is_msys2_msys_build_machine || is_cygwin_build_machine; then
return 0
fi
return 1
}
# Is a MSYS2 environment with the MSYS or MINGW64 subsystem?
# * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml
# * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`)
# https://www.msys2.org/docs/environments/
is_msys2_msys_build_machine() {
if [ -e /usr/bin/msys-2.0.dll ] && {
[ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ]
}; then
return 0
fi
return 1
}
is_cygwin_build_machine() {
if [ -e /usr/bin/cygwin1.dll ]; then
return 0
fi
return 1
}
# Tries to find the host ABI.
#
# Beware: This function uses `uname` probing which is inaccurate during
# cross-compilation.
#
# Outputs:
# - env:BUILDHOST_ARCH will contain the host ABI.
autodetect_buildhost_arch() {
# Set DKMLSYS_*
autodetect_system_binaries
autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s)
autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m)
# list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in
Linux-armv7*)
BUILDHOST_ARCH=linux_arm32v7;;
Linux-armv6* | Linux-arm)
BUILDHOST_ARCH=linux_arm32v6;;
Linux-aarch64 | Linux-arm64 | Linux-armv8*)
BUILDHOST_ARCH=linux_arm64;;
Linux-i386 | Linux-i686)
BUILDHOST_ARCH=linux_x86;;
Linux-x86_64)
BUILDHOST_ARCH=linux_x86_64;;
Darwin-arm64)
BUILDHOST_ARCH=darwin_arm64;;
Darwin-x86_64)
BUILDHOST_ARCH=darwin_x86_64;;
*-i386 | *-i686)
if is_unixy_windows_build_machine; then
BUILDHOST_ARCH=windows_x86
else
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
exit 1
fi
;;
*-x86_64)
if is_unixy_windows_build_machine; then
BUILDHOST_ARCH=windows_x86_64
else
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
exit 1
fi
;;
*)
# Since:
# 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/)
# 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160)
# we do not support Windows ARM/ARM64 as a build machine
printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
exit 1
;;
esac
}
# A function that will try to print an ISO8601 timestamp, but will fallback to
# the system default. Always uses UTC timezone.
try_iso8601_timestamp() {
date -u -Iseconds 2>/dev/null || TZ=UTC date
}
# A function that will print the command and possibly time it (if and only if it uses a full path to
# an executable, so that 'time' does not fail on internal shell functions).
# If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the
# function will return the error code.
log_trace() {
log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF}
log_trace_1="$1"
if [ "$log_trace_1" = "--return-error-code" ]; then
shift
log_trace_RETURN=ON
fi
if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then
printf "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*" >&2
if [ -x "$1" ]; then
time "$@"
else
"$@"
fi
else
# use judgement so we essentially have log at an INFO level
case "$1" in
rm|cp)
# debug level. only show when DKML_BUILD_TRACE=ON
;;
git|make|ocaml_configure|ocaml_make|make_host|make_target)
# info level. and can show entire command without polluting the screen
printf "[%s] %s\n" "$(try_iso8601_timestamp)" "$*" >&2
;;
*) printf "[%s] %s\n" "$(try_iso8601_timestamp)" "$1" >&2
esac
"$@"
fi
log_trace_ec="$?"
if [ "$log_trace_ec" -ne 0 ]; then
if [ "$log_trace_RETURN" = ON ]; then
return "$log_trace_ec"
else
printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2
exit "$log_trace_ec"
fi
fi
}
# [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output.
sha256compute() {
sha256compute_FILE="$1"
shift
# For reasons unclear doing the following in MSYS2:
# sha256sum 'Z:\source\README.md'
# will produce a backslash like:
# \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md
# So always cygpath the filename if available
if [ -x /usr/bin/cygpath ]; then
sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE")
fi
if [ -x /usr/bin/shasum ]; then
/usr/bin/shasum -a 256 "$sha256compute_FILE" | awk '{print $1}'
elif [ -x /usr/bin/sha256sum ]; then
/usr/bin/sha256sum "$sha256compute_FILE" | awk '{print $1}'
else
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
exit 107
fi
}
# [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM.
# The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match.
sha256check() {
sha256check_FILE="$1"
shift
sha256check_SUM="$1"
shift
if [ -x /usr/bin/shasum ]; then
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/shasum -a 256 -c >&2
elif [ -x /usr/bin/sha256sum ]; then
printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2
else
printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
exit 107
fi
}
# [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM.
# If the FILE already exists with the correct checksum it is not redownloaded.
# The function will exit with failure if the checksum does not match.
downloadfile() {
downloadfile_URL="$1"
shift
downloadfile_FILE="$1"
shift
downloadfile_SUM="$1"
shift
# Set DKMLSYS_*
autodetect_system_binaries
if [ -e "$downloadfile_FILE" ]; then
if sha256check "$downloadfile_FILE" "$downloadfile_SUM"; then
return 0
else
$DKMLSYS_RM -f "$downloadfile_FILE"
fi
fi
if [ "${CI:-}" = true ]; then
if [ -n "$DKMLSYS_CURL" ]; then
log_trace "$DKMLSYS_CURL" -L -s "$downloadfile_URL" -o "$downloadfile_FILE".tmp
elif [ -n "$DKMLSYS_WGET" ]; then
log_trace "$DKMLSYS_WGET" -q -O "$downloadfile_FILE".tmp "$downloadfile_URL"
else
echo "No curl or wget available on the system paths" >&2
exit 107
fi
else
if [ -n "$DKMLSYS_CURL" ]; then
log_trace "$DKMLSYS_CURL" -L "$downloadfile_URL" -o "$downloadfile_FILE".tmp
elif [ -n "$DKMLSYS_WGET" ]; then
log_trace "$DKMLSYS_WGET" -O "$downloadfile_FILE".tmp "$downloadfile_URL"
else
echo "No curl or wget available on the system paths" >&2
exit 107
fi
fi
if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then
printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2
exit 1
fi
$DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE"
}
# --- Environment detection ---
# Set DKMLSYS_*
autodetect_system_binaries
# Find host ABI. Set in BUILDHOST_ARCH
autodetect_buildhost_arch
# Use the project tree as the current directory
PROJ_DIR=$(dirname "$0")
PROJ_DIR=$(cd "$PROJ_DIR" && pwd)
cd "$PROJ_DIR"
# --- Tool directory selection ---
tools_dir=
tools_name=dktool
# 1. Check if CI since many CI providers can only cache content in a subdirectory
# of the project.
if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then
install -d "$PROJ_DIR/.tools"
tools_dir="$PROJ_DIR/.tools"
fi
# 2. Check in locations rooted under /opt/diskuv
# We look under a /opt/diskuv early because
# - Especially important for WSL2 to use a pure Linux filesystem (ext4) for
# best performance.
# - Using a canonical location (especially /opt/diskuv/usr/share) makes
# it easy to use CMake presets for non-Windows hosts.
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then
install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name"
tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name"
fi
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then
install -d "/opt/diskuv/$HOME/.local/share/$tools_name"
tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name"
fi
if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then
install -d "/opt/diskuv/usr/share/$tools_name"
tools_dir="/opt/diskuv/usr/share/$tools_name"
fi
# 3. Check in the conventional locations rooted under /
if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then
install -d "$XDG_DATA_HOME/$tools_name"
tools_dir="$XDG_DATA_HOME/$tools_name"
fi
if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then
install -d "$HOME/.local/share/$tools_name"
tools_dir="$HOME/.local/share/$tools_name"
fi
# 4. Validate
if [ -z "$tools_dir" ]; then
echo "FATAL: Could not find a location to install the tools necessary for this project." >&2
echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2
echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2
echo " ...: creating the \$XDG_DATA_HOME directory." >&2
exit 2
fi
# --- Tool downloads and installs ---
# PREREQS
# -------
install_linux_prog() {
install_linux_prog_NAME=$1
shift
install_linux_prog_PKG=$1
shift
if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then
export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME"
else
if command -v yum > /dev/null 2> /dev/null; then
if [ "$(id -u)" -eq 0 ]; then
yum install -y "$install_linux_prog_PKG"
else
echo "Running: sudo yum install -y $install_linux_prog_PKG"
sudo yum install -y "$install_linux_prog_PKG"
fi
else
if [ "$(id -u)" -eq 0 ]; then
apt-get -q install -y "$install_linux_prog_PKG"
else
echo "Running: sudo -q apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG"
sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
fi
fi
DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME")
export DK_PROG_INSTALLED_LOCATION
fi
}
get_homebrew_binary() {
get_homebrew_binary_NAME=$1
shift
if command -v brew > /dev/null 2> /dev/null; then
get_homebrew_binary_PREFIX=$(brew --prefix)
if [ -x "$get_homebrew_binary_PREFIX/bin/$get_homebrew_binary_NAME" ]; then
export DK_PROG_INSTALLED_LOCATION="$get_homebrew_binary_PREFIX/bin/$get_homebrew_binary_NAME"
return 0
fi
fi
return 1
}
install_macos_prog() {
install_macos_prog_NAME=$1
shift
install_macos_prog_PKG=$1
shift
if [ -x "/usr/bin/$install_macos_prog_NAME" ]; then
export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_macos_prog_NAME"
elif [ -x "/usr/local/bin/$install_macos_prog_NAME" ]; then
export DK_PROG_INSTALLED_LOCATION="/usr/local/bin/$install_macos_prog_NAME"
elif get_homebrew_binary "$install_macos_prog_NAME"; then
# DK_PROG_INSTALLED_LOCATION already set by [get_homebrew_binary]
true
else
if command -v brew > /dev/null 2> /dev/null; then
brew install --quiet --formula "$install_macos_prog_PKG" >&2
get_homebrew_binary "$install_macos_prog_NAME"
# DK_PROG_INSTALLED_LOCATION already set by [get_homebrew_binary]
elif command -v port > /dev/null 2> /dev/null; then
if [ "$(id -u)" -eq 0 ]; then
port install "$install_macos_prog_PKG"
else
echo "Running: sudo port install $install_macos_prog_PKG"
sudo port install "$install_macos_prog_PKG"
fi
DK_PROG_INSTALLED_LOCATION=$(command -v "$install_macos_prog_NAME")
export DK_PROG_INSTALLED_LOCATION
else
echo "FATAL: Neither Homebrew nor MacPorts are available on your macOS. You can follow https://docs.brew.sh/Installation to install Homebrew." >&2
exit 2
fi
fi
}
case $BUILDHOST_ARCH in
linux_*)
install_linux_prog wget wget # For [downloadfile]
install_linux_prog tar tar # For handling tar balls later in this script
;;
esac
# NINJA
# -----
# We need a valid CMAKE_GENERATOR to do FetchContent_Populate() in script mode
NINJA_EXE=
case $BUILDHOST_ARCH in
darwin_*)
install_macos_prog ninja ninja
NINJA_EXE=$DK_PROG_INSTALLED_LOCATION;;
linux_*)
install_linux_prog ninja ninja-build
NINJA_EXE=$DK_PROG_INSTALLED_LOCATION;;
esac
# CMAKE
# -----
case $BUILDHOST_ARCH in
linux_*)
# This is for CMake to do FetchContent()
install_linux_prog git git ;;
esac
case $BUILDHOST_ARCH in
linux_x86)
# This is for Python wheel extraction
install_linux_prog unzip unzip ;;
esac
cmake_base=
cmake_majmin_ver=3.25
cmake_majminpat_ver=3.25.2
cmake_bindir=
cmake_destdir=$tools_dir/cmake-$cmake_majminpat_ver
install -d "$tools_dir/dl"
download_cmake() {
case $BUILDHOST_ARCH in
darwin_*)
install_macos_prog cmake cmake
cmake_bindir=$(dirname "$DK_PROG_INSTALLED_LOCATION")
;;
linux_x86_64)
cmake_base="cmake-$cmake_majminpat_ver-linux-x86_64"
printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux x86_64" >&2
downloadfile \
"https://github.com/Kitware/CMake/releases/download/v$cmake_majminpat_ver/$cmake_base.tar.gz" \
"$tools_dir/dl/cmake.tar.gz" \
783da74f132fd1fea91b8236d267efa4df5b91c5eec1dea0a87f0cf233748d99
cmake_bindir="$cmake_destdir/bin" ;;
linux_x86)
# CMake does not provide 32-bit binaries. But pypi does at https://pypi.org/project/cmake/
printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux x86" >&2
downloadfile \
https://files.pythonhosted.org/packages/11/6e/aeeddf2f5b16542b6a30ceab4896421e8705d8e9a9296dba79395db11b00/cmake-3.25.2-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl \
"$tools_dir/dl/cmake.whl" \
715ef82e81b48db3e4c7744614c15ff361d53f6987fd70b1b66b0880595f2e2c
cmake_bindir="$cmake_destdir/bin" ;;
linux_arm64)
cmake_base="cmake-$cmake_majminpat_ver-linux-aarch64"
printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux ARM64" >&2
downloadfile \
"https://github.com/Kitware/CMake/releases/download/v$cmake_majminpat_ver/$cmake_base.tar.gz" \
"$tools_dir/dl/cmake.tar.gz" \
9216ecf0449ade700e66e0def11eeaebf9fa7d4428c02f49cb59f11418d3f8a5
cmake_bindir="$cmake_destdir/bin" ;;
esac
}
export_cmake_vars() {
case $BUILDHOST_ARCH in
darwin_*)
if command -v brew > /dev/null 2> /dev/null; then
cmake_bindir=$(brew --prefix cmake)/bin
else
cmake_bindir=$(command -v cmake)
cmake_bindir=$(dirname "$cmake_bindir")
fi
;;
linux_x86_64)
cmake_bindir="$cmake_destdir/bin" ;;
linux_x86)
cmake_bindir="$cmake_destdir/bin" ;;
esac
}
have_correct_cmake=0
if [ -x "$tools_dir/cmake-$cmake_majminpat_ver/bin/cmake" ]; then
# shellcheck disable=SC2016
have_correct_cmake_VER=$("$tools_dir/cmake-$cmake_majminpat_ver/bin/cmake" --version | $DKMLSYS_AWK 'NR==1{print $NF}')
if [ "$have_correct_cmake_VER" = "$cmake_majminpat_ver" ]; then
have_correct_cmake=1
fi
fi
if [ $have_correct_cmake -eq 0 ]; then
download_cmake
fi
# Handle tarball
if [ -e "$tools_dir/dl/cmake.tar.gz" ] && [ -n "$cmake_base" ]; then
rm -rf "$tools_dir/cmake-$cmake_majminpat_ver"
install -d "$cmake_destdir"
tar xCfz "$cmake_destdir" "$tools_dir/dl/cmake.tar.gz"
rm -f "$tools_dir/dl/cmake.tar.gz"
set +f
if [ -e "$cmake_destdir/$cmake_base/CMake.app" ]; then
mv "$cmake_destdir/$cmake_base/CMake.app/Contents"/* "$cmake_destdir/"
else
mv "$cmake_destdir/$cmake_base"/* "$cmake_destdir/"
fi
set -f
fi
# Handle Python wheel
if [ -e "$tools_dir/dl/cmake.whl" ]; then
rm -rf "$tools_dir/cmake-$cmake_majminpat_ver"
cd "$tools_dir/dl"
rm -rf cmake/data
# Don't want cmake/data/{aclocal,bash-completion,emacs,vim}
unzip -q cmake.whl 'cmake/data/bin/**'
unzip -q cmake.whl 'cmake/data/doc/**'
# Don't want cmake/data/share/cmake-$cmake_majmin_ver/Help
unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'include/**'
unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'Modules/**'
unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'Templates/**'
rm -f cmake.whl
cd -
set +f
install -d "$cmake_destdir/share" "$cmake_destdir/doc" "$cmake_destdir/bin"
mv "$tools_dir/dl/cmake/data/bin"/* "$cmake_destdir/bin/"
rm -rf "$cmake_destdir/share/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/cmake"
mv "$tools_dir/dl/cmake/data/share/cmake-$cmake_majmin_ver" "$cmake_destdir/share/"
if [ -e "$tools_dir/dl/cmake/data/doc/cmake" ]; then # Windows wheel
mv "$tools_dir/dl/cmake/data/doc/cmake" "$cmake_destdir/doc/"
fi
if [ -e "$tools_dir/dl/cmake/data/doc/cmake-$cmake_majmin_ver" ]; then # Linux wheel
mv "$tools_dir/dl/cmake/data/doc/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/"
fi
set -f
# other dirs: aclocal bash-completion emacs vim
rm -rf "$tools_dir/dl/cmake/data/share"
# be pedantic. if we don't know about a directory, it may be important. so error
# if some directory is non-empty
rmdir "$tools_dir/dl/cmake/data/bin" "$tools_dir/dl/cmake/data/doc"
rmdir "$tools_dir/dl/cmake/data"
fi
# Put tools in PATH
export_cmake_vars
if [ -n "$cmake_bindir" ] && [ -d "$cmake_bindir" ]; then
tools_bin_dir=$(cd "$cmake_bindir" && pwd)
export PATH="$tools_bin_dir:$PATH"
else
echo "This platform is not supported. No cmake 3.25+ download logic has been added" >&2
exit 1
fi
# Validate
"$cmake_bindir/cmake" --version > /dev/null
# --- Run finder script ---
cd "$PROJ_DIR"
"$cmake_bindir/cmake" \
-D CMAKE_GENERATOR=Ninja -D CMAKE_MAKE_PROGRAM="$NINJA_EXE" \
-D "DKTOOL_WORKDIR:FILEPATH=$tools_dir/work" -D "DKTOOL_CMDLINE:STRING=$*" \
-P cmake/FindDkToolScripts.cmake