makepad/tools/makepad_builder/check-tools.sh

118 lines
5.6 KiB
Bash

#!/bin/sh
# Checks the system tools the Builder compiles with.
#
# check-tools.sh check, and offer to install what is missing
# check-tools.sh --check check only: exit 0 when ready, 1 when not
#
# macOS: Apple's command line developer tools (clang, the macOS SDK, the
# linker and git). Xcode itself is not needed. The only fix offered is
# Apple's own installer; an Xcode license is never accepted for you.
# Linux: C/C++, git, curl and the development libraries Makepad apps use,
# installed with your distribution's package manager after you see the
# exact command. This is the one step that changes your system.
set -eu
check_only=no
[ "${1:-}" != --check ] || check_only=yes
say() { printf ' %s\n' "$*"; }
fail() { printf '\n %s\n\n' "$*" >&2; exit 1; }
# --- macOS ------------------------------------------------------------------
apple_problem() {
# Echoes nothing when ready, otherwise one line saying what is wrong.
# Probing through xcrun reports an unaccepted Xcode license as an error
# instead of opening a prompt.
developer=${DEVELOPER_DIR:-$(/usr/bin/xcode-select -p 2>/dev/null || :)}
if [ -z "$developer" ] || [ ! -d "$developer" ]; then
echo missing; return
fi
for probe in 'clang --version' '--show-sdk-path' '--find ld'; do
# shellcheck disable=SC2086 # the probe words are fixed above
if ! detail=$(/usr/bin/xcrun --sdk macosx $probe 2>&1); then
case "$detail" in *license*) echo license ;; *) echo missing ;; esac
return
fi
done
git --version >/dev/null 2>&1 || { echo missing; return; }
}
check_apple() {
problem=$(apple_problem)
[ -n "$problem" ] || { say "Apple's command line developer tools are ready."; return 0; }
[ "$check_only" = no ] || exit 1
case "$problem" in
missing)
say "Apple's command line developer tools are not installed (Xcode itself is not needed)."
say "Opening Apple's installer. When it has finished, run the Builder again."
/usr/bin/xcode-select --install >/dev/null 2>&1 || :
;;
license)
say 'Xcode is installed, but its license has not been accepted yet.'
say 'Read and accept it with this command, then run the Builder again:'
say ' sudo xcodebuild -license'
;;
esac
exit 1
}
# --- Linux ------------------------------------------------------------------
linux_ready() {
for tool in cc c++ make cmake git curl tar gzip pkg-config; do
command -v "$tool" >/dev/null 2>&1 || return 1
done
pkg-config --exists openssl x11 xcursor xkbcommon xrandr xi xinerama alsa libpulse \
wayland-client egl gl glx libdrm gbm
}
check_linux() {
getconf GNU_LIBC_VERSION >/dev/null 2>&1 || fail 'The Builder needs glibc Linux (x86_64 or ARM64).'
if linux_ready; then say 'System development packages are ready.'; return 0; fi
[ "$check_only" = no ] || exit 1
ID= ID_LIKE= PRETTY_NAME=
[ ! -r /etc/os-release ] || . /etc/os-release
case " $ID $ID_LIKE " in
*debian* | *ubuntu*)
set -- apt-get install --no-install-recommends build-essential clang cmake pkg-config \
git curl ca-certificates tar gzip libssl-dev libx11-dev libxcursor-dev libxkbcommon-dev \
libxrandr-dev libxi-dev libxinerama-dev libasound2-dev libpulse-dev libwayland-dev \
wayland-protocols libegl-dev libgl-dev libglx-dev libdrm-dev libgbm-dev ;;
*fedora* | *rhel* | *centos*)
set -- dnf install gcc gcc-c++ make clang cmake pkgconf-pkg-config git curl \
ca-certificates tar gzip openssl-devel libX11-devel libXcursor-devel libxkbcommon-devel \
libXrandr-devel libXi-devel libXinerama-devel alsa-lib-devel pulseaudio-libs-devel \
wayland-devel wayland-protocols-devel libglvnd-devel libdrm-devel mesa-libgbm-devel ;;
*arch*)
set -- pacman -S --needed base-devel clang cmake pkgconf git curl ca-certificates tar \
gzip openssl libx11 libxcursor libxkbcommon libxrandr libxi libxinerama alsa-lib \
libpulse wayland wayland-protocols libglvnd mesa libdrm ;;
*suse*)
set -- zypper install gcc gcc-c++ make clang cmake pkg-config git curl ca-certificates \
tar gzip libopenssl-devel libX11-devel libXcursor-devel libxkbcommon-devel \
libXrandr-devel libXi-devel libXinerama-devel alsa-devel libpulse-devel wayland-devel \
wayland-protocols-devel libglvnd-devel libdrm-devel Mesa-libgbm-devel ;;
*)
fail 'Install C/C++, git, curl, CMake, pkg-config and the OpenSSL, X11, Xcursor, xkbcommon, ALSA, PulseAudio, Wayland, EGL/GLX and GBM development packages with your package manager, then run the Builder again.' ;;
esac
say "Makepad compiles from source and needs development packages from ${PRETTY_NAME:-your distribution}."
say 'They are installed system-wide with this command:'
printf '\n sudo %s\n\n' "$*"
printf ' Press Return to run it (sudo asks for your password), or Ctrl+C to stop. '
IFS= read -r answer || fail 'Stopped. Nothing was installed.'
sudo "$@"
linux_ready || fail 'Some development packages are still missing; see the package manager output above.'
say 'System development packages are ready.'
}
# --- Run --------------------------------------------------------------------
case "$(uname -s)" in
Darwin) check_apple ;;
Linux) check_linux ;;
*) fail 'The Builder supports macOS and Linux.' ;;
esac
command -v curl >/dev/null 2>&1 || fail 'curl is needed for verified downloads.'