Add CMake and tests
- Port tests to GitLab - Add GitLab CI test matrix - Remove gtest submodule
This commit is contained in:
parent
7056638935
commit
f07596dbb5
19 changed files with 1760 additions and 28 deletions
701
dk
Executable file
701
dk
Executable file
|
|
@ -0,0 +1,701 @@
|
|||
#!/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
|
||||
Loading…
Add table
Add a link
Reference in a new issue