#!/bin/bash # exit when any command fails set -e MANAGERS=(dnf apt port vcpkg brew) MANAGER="" LIST=0 VERBOSE=0 DRYRUN=0 UPDATE=0 REQUIRED_RECOMMENDED_ALL=1 SUDO="" PKGS_UPDATE="" PKGS_REQUIRED=() PKGS_RECOMMENDED=() PKGS_ALL=() PKGS_OPTIONS=() # Parse Command line PARAMS="" while (( "$#" )); do case "$1" in -v|--verbose) VERBOSE=1 shift ;; -d|--dry-run) DRYRUN=1 shift ;; -l|--list) LIST=1 shift ;; -u|--update-package-list) UPDATE=1 shift ;; -m|--package-manager) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then MANAGERS=($2) shift 2 else echo "Error: Argument for $1 is missing" >&2 exit 1 fi ;; -h|--help) echo "$0 [-vh] [-m package-manager-list] [required|recommended|all]" echo " -m, --package-manager: preferred package manager order (default: \"${MANAGERS[*]}\")" echo " -v, --verbose: verbose output" echo " -d, --dry-run: print actions, but do not execute" echo " -l, --list: just list the packages to install" echo " -u, --update-package-list: update package manager package list" echo " -h, --help: this help message" echo " (required|recommended|all) the set of dependencies to select." exit 0 ;; -*|--*=) # unsupported flags echo "Error: Unsupported flag $1" >&2 exit 1 ;; *) # preserve positional arguments PARAMS="$1" shift ;; esac done # Make lower case PARAMS=$(echo "$PARAMS" | tr '[:upper:]' '[:lower:]' | tr -s "[:blank:]") # Work out which set of dependencies we're installing case "$PARAMS" in required) REQUIRED_RECOMMENDED_ALL=0 if ((VERBOSE > 0)); then echo "Selecting required dependencies only."; fi ;; ""|recommended) REQUIRED_RECOMMENDED_ALL=1 if ((VERBOSE > 0)); then echo "Selecting required+recommended dependencies."; fi ;; all) REQUIRED_RECOMMENDED_ALL=2 if ((VERBOSE > 0)); then echo "Selecting all available dependencies."; fi ;; *) echo "Unrecognized positional argument \"$PARAMS\". Expecting one of (required,recommended [default],all)" exit 1 ;; esac # Find an available package manager from the preferred list for m in ${MANAGERS[@]} do if [ -x "$(command -v $m)" ]; then MANAGER="$m" break fi done # If no package manager is found, exit if [ -z "$MANAGER" ] then echo "Error: No preferred package managers from list [${MANAGERS[*]}] found. Use -m to select manually." >&2 exit 1 fi if ((VERBOSE > 0)); then echo "Using \"$MANAGER\" package manager (select another using -m)"; fi # Setup prereq commands and packages. if [[ "$MANAGER" == "apt" ]]; then SUDO="sudo" PKGS_UPDATE="apt update" PKGS_OPTIONS+=(install --no-install-suggests --no-install-recommends) if ((DRYRUN > 0)); then PKGS_OPTIONS+=(--dry-run); fi PKGS_REQUIRED+=(libgl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols libegl1-mesa-dev) PKGS_REQUIRED+=(libc++-dev libglew-dev libeigen3-dev cmake g++ ninja-build) PKGS_RECOMMENDED+=(libjpeg-dev libpng-dev) PKGS_RECOMMENDED+=(libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev) PKGS_ALL+=(libdc1394-22-dev libraw1394-dev libopenni-dev python3.9-dev python3-distutils) elif [[ "$MANAGER" == "dnf" ]]; then SUDO="sudo" PKGS_UPDATE="dnf check-update" PKGS_OPTIONS+=(install) PKGS_REQUIRED+=(wayland-devel libxkbcommon-devel g++ ninja-build) PKGS_REQUIRED+=(glew-devel eigen3 cmake) PKGS_RECOMMENDED+=(libjpeg-devel libpng-devel OpenEXR-devel) PKGS_ALL+=(libdc1394-22-devel libraw1394-devel librealsense-devel openni-devel) if ((DRYRUN > 0)); then MANAGER="echo $MANAGER" fi elif [[ "$MANAGER" == "port" ]]; then SUDO="sudo" PKGS_UPDATE="port sync -q" PKGS_OPTIONS+=(-N install -q) if ((DRYRUN > 0)); then PKGS_OPTIONS+=(-y); fi PKGS_REQUIRED+=(glew eigen3-devel cmake +gui ninja) PKGS_RECOMMENDED+=(jpeg libpng openexr tiff ffmpeg-devel lz4 zstd py37-pybind11 catch2) PKGS_ALL+=(libdc1394 openni) elif [[ "$MANAGER" == "brew" ]]; then PKGS_OPTIONS+=(install) if ((VERBOSE > 0)); then PKGS_OPTIONS+=(--verbose); fi PKGS_REQUIRED+=(glew eigen cmake ninja) PKGS_RECOMMENDED+=(libjpeg libpng openexr libtiff ffmpeg lz4 zstd catch2) # Brew doesn't have a dryrun option if ((DRYRUN > 0)); then MANAGER="echo $MANAGER" fi elif [[ "$MANAGER" == "vcpkg" ]]; then # TODO: this should be a config option somehow... PKGS_OPTIONS+=(install --triplet=x64-windows ) if ((DRYRUN > 0)); then PKGS_OPTIONS+=(--dry-run); fi PKGS_REQUIRED+=(glew eigen3) PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr tiff ffmpeg lz4 zstd python3 Catch2) PKGS_ALL+=(openni2 realsense2) else echo "Error: Don't know how to use \"$MANAGER\", please fix the script." >&2 exit 1 fi if ((REQUIRED_RECOMMENDED_ALL < 2)); then PKGS_ALL=(); fi if ((REQUIRED_RECOMMENDED_ALL < 1)); then PKGS_RECOMMENDED=(); fi PACKAGES=( "${PKGS_REQUIRED[*]}" "${PKGS_RECOMMENDED[*]}" "${PKGS_ALL[*]}" ) if ((LIST > 0)); then echo "${PACKAGES[*]}" exit 0 fi if ((UPDATE > 0)); then if ((VERBOSE > 0)); then echo "Requesting \"$MANAGER\" package update."; fi $SUDO $PKGS_UPDATE fi if ((VERBOSE > 0)); then echo "Requesting install of: ${PACKAGES[*]}"; fi # Install $SUDO $MANAGER ${PKGS_OPTIONS[*]} ${PACKAGES[*]}