File size: 5,751 Bytes
caf1218
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/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[*]}