TODO netlogon_user_flags_ntlmv2_enabled
[wireshark-sm.git] / tools / rpm-setup.sh
blob6a36d59b00c9e2b61013f9643f94bd9ff582cd0e
1 #!/bin/bash
2 # Setup development environment for RPM based systems such as Red Hat, Centos, Fedora, openSUSE
4 # Wireshark - Network traffic analyzer
5 # By Gerald Combs <gerald@wireshark.org>
6 # Copyright 1998 Gerald Combs
8 # SPDX-License-Identifier: GPL-2.0-or-later
10 # We drag in tools that might not be needed by all users; it's easier
11 # that way.
14 set -e -u -o pipefail
16 function print_usage() {
17 printf "\nUtility to setup a rpm-based system for Wireshark Development.\n"
18 printf "The basic usage installs the needed software\n\n"
19 printf "Usage: %s [--install-optional] [...other options...]\n" "$0"
20 printf "\t--install-optional: install optional software as well\n"
21 printf "\t--install-rpm-deps: install packages required to build the .rpm file\n"
22 printf "\\t--install-qt5-deps: force installation of packages required to use Qt5\\n"
23 printf "\\t--install-qt6-deps: force installation of packages required to use Qt6\\n"
24 printf "\\t--install-all: install everything\\n"
25 printf "\t[other]: other options are passed as-is to the package manager\n"
28 ADDITIONAL=0
29 RPMDEPS=0
30 ADD_QT5=0
31 ADD_QT6=0
32 HAVE_ADD_QT=0
33 OPTIONS=
34 for arg; do
35 case $arg in
36 --help|-h)
37 print_usage
38 exit 0
40 --install-optional)
41 ADDITIONAL=1
43 --install-rpm-deps)
44 RPMDEPS=1
46 --install-qt5-deps)
47 ADD_QT5=1
48 HAVE_ADD_QT=1
50 --install-qt6-deps)
51 ADD_QT6=1
52 HAVE_ADD_QT=1
54 --install-all)
55 ADDITIONAL=1
56 RPMDEPS=1
57 ADD_QT5=1
58 ADD_QT6=1
59 HAVE_ADD_QT=1
62 OPTIONS="$OPTIONS $arg"
64 esac
65 done
67 # Check if the user is root
68 if [ "$(id -u)" -ne 0 ]
69 then
70 echo "You must be root."
71 exit 1
74 BASIC_LIST="
75 cmake
76 desktop-file-utils
77 flex
78 gcc
79 gcc-c++
80 git
81 glib2-devel
82 libgcrypt-devel
83 libpcap-devel
84 pcre2-devel
85 python3
88 ADDITIONAL_LIST="
89 krb5-devel
90 libcap-devel
91 libssh-devel
92 libxml2-devel
93 lz4
94 perl
95 perl-Parse-Yapp
96 python3-pytest
97 python3-pytest-xdist
98 snappy-devel
99 spandsp-devel
100 systemd-devel
103 # Uncomment to add PNG compression utilities used by compress-pngs:
104 # ADDITIONAL_LIST="$ADDITIONAL_LIST
105 # advancecomp
106 # optipng
107 # oxipng
108 # pngcrush"
110 # XXX
111 RPMDEPS_LIST="rpm-build"
113 # Guess which package manager we will use
114 for PM in zypper dnf yum ''; do
115 if type "$PM" >/dev/null 2>&1; then
116 break
118 done
120 if [ -z "$PM" ]
121 then
122 echo "No package managers found, exiting"
123 exit 1
126 PM_OPT=
127 case $PM in
128 zypper)
129 PM_OPT="--non-interactive"
130 PM_SEARCH="search -x --provides"
132 dnf)
133 PM_SEARCH="info"
135 yum)
136 PM_SEARCH="info"
138 esac
140 echo "Using $PM ($PM_SEARCH)"
142 # Adds package $2 to list variable $1 if the package is found
143 add_package() {
144 local list="$1" pkgname="$2"
146 # fail if the package is not known
147 # shellcheck disable=SC2086
148 $PM $PM_SEARCH "$pkgname" &> /dev/null || return 1
150 # package is found, append it to list
151 eval "${list}=\"\${${list}} \${pkgname}\""
154 # Adds packages $2-$n to list variable $1 if all the packages are found
155 add_packages() {
156 local list="$1" pkgnames="${*:2}"
158 # fail if any package is not known
159 for pkgname in $pkgnames; do
160 # shellcheck disable=SC2086
161 $PM $PM_SEARCH "$pkgname" &> /dev/null || return 1
162 done
164 # all packages are found, append it to list
165 eval "${list}=\"\${${list}} \${pkgnames}\""
168 add_package BASIC_LIST glib2 || add_package BASIC_LIST libglib-2_0-0 ||
169 echo "Required package glib2|libglib-2_0-0 is unavailable" >&2
171 add_package BASIC_LIST lua-devel || add_package BASIC_LIST lua54-devel || add_package BASIC_LIST lua53-devel ||
172 echo "Required package lua-devel|lua54-devel|lua53-devel is unavailable" >&2
174 add_package BASIC_LIST libpcap || add_package BASIC_LIST libpcap1 ||
175 echo "Required package libpcap|libpcap1 is unavailable" >&2
177 add_package BASIC_LIST zlib-ng-compat-devel || add_package BASIC_LIST zlib-devel ||
178 echo "Optional package zlib-ng-compat-devel|zlib-devel is unavailable" >&2
180 add_package BASIC_LIST c-ares-devel || add_package BASIC_LIST libcares-devel ||
181 echo "Required package c-ares-devel|libcares-devel is unavailable" >&2
183 add_package BASIC_LIST speexdsp-devel || add_package BASIC_LIST speex-devel ||
184 echo "Required package speexdsp-devel|speex-devel is unavailable" >&2
186 if [ $HAVE_ADD_QT -eq 0 ]
187 then
188 # Try to select Qt version from distro
189 test -e /etc/os-release && os_release='/etc/os-release' || os_release='/usr/lib/os-release'
190 # shellcheck disable=SC1090
191 . "${os_release}"
193 # Fedora 35 or later
194 if [ "${ID:-linux}" = "fedora" ] && [ "${VERSION_ID:-0}" -ge "35" ]; then
195 echo "Installing Qt6."
196 ADD_QT6=1
197 else
198 echo "Installing Qt5."
199 ADD_QT5=1
203 if [ $ADD_QT5 -ne 0 ]
204 then
205 # qt5-linguist: CentOS, Fedora
206 # libqt5-linguist-devel: OpenSUSE
207 add_package BASIC_LIST qt5-linguist ||
208 add_package BASIC_LIST libqt5-linguist-devel ||
209 echo "Required package qt5-linguist|libqt5-linguist-devel is unavailable" >&2
211 # qt5-qtmultimedia: CentOS, Fedora, pulls in qt5-qtbase-devel (big dependency list!)
212 # libqt5-qtmultimedia-devel: OpenSUSE, pulls in Core, Gui, Multimedia, Network, Widgets
213 # OpenSUSE additionally has a separate Qt5PrintSupport package.
214 add_package BASIC_LIST qt5-qtmultimedia-devel ||
215 add_packages BASIC_LIST libqt5-qtmultimedia-devel libQt5PrintSupport-devel ||
216 echo "Required Qt5 Multimedia and/or Qt5 Print Support is unavailable" >&2
218 # This is only required on OpenSUSE
219 add_package BASIC_LIST libqt5-qtsvg-devel ||
220 echo "Required OpenSUSE package libqt5-qtsvg-devel is unavailable. Not required for other distributions." >&2
222 # This is only required on OpenSUSE
223 add_package BASIC_LIST libQt5Concurrent-devel ||
224 echo "Required OpenSUSE package libQt5Concurrent-devel is unavailable. Not required for other distributions." >&2
226 # This is only required on OpenSUSE
227 add_package ADDITIONAL_LIST libQt5DBus-devel ||
228 echo "Optional OpenSUSE package libQt5DBus-devel is unavailable. Not required for other distributions." >&2
230 add_package ADDITIONAL_LIST qt5-qtimageformats ||
231 add_package ADDITIONAL_LIST libqt5-qtimageformats ||
232 echo "Optional Qt5 Image Formats is unavailable" >&2
235 if [ $ADD_QT6 -ne 0 ]
236 then
237 # See CMakeLists.txt in the root directory for a list of
238 # Qt6 modules required for a minimal installation
239 # Base and Multimedia pull in most of the other required modules
240 # RH/Fedora and SUSE use slightly different pkg names for modules
241 QT6_LIST=(base
242 tools
243 multimedia)
245 for module in "${QT6_LIST[@]}"
247 add_package BASIC_LIST "qt6-qt${module}-devel" ||
248 add_package BASIC_LIST "qt6-${module}-devel" ||
249 echo "Required Qt6 Module $module is unavailable" >&2
250 done
252 # qt6-linguist: RHEL, Fedora
253 # qt6-linguist-devel: OpenSUSE
254 add_package BASIC_LIST qt6-linguist ||
255 add_package BASIC_LIST qt6-linguist-devel ||
256 echo "Required Qt6 module LinguistTools is unavailable" >&2
258 add_package BASIC_LIST qt6-qt5compat-devel ||
259 echo "Required Qt6 module Qt5Compat is unavailable"
261 add_package BASIC_LIST libxkbcommon-devel ||
262 echo "Required Qt6 dependency libxkbcommon-devel is unavailable"
264 add_package ADDITIONAL_LIST qt6-qtimageformats ||
265 add_package ADDITIONAL_LIST qt6-imageformats ||
266 echo "Optional Qt6 module Image Formats is unavailable" >&2
269 # This in only required on OpenSUSE
270 add_packages BASIC_LIST hicolor-icon-theme xdg-utils ||
271 echo "Required OpenSUSE packages hicolor-icon-theme and xdg-utils are unavailable. Not required for other distributions." >&2
273 # This in only required (and available) on OpenSUSE
274 add_package BASIC_LIST update-desktop-files ||
275 echo "Required OpenSUSE package update-desktop-files is unavailable. Not required for other distributions." >&2
277 # rubygem-asciidoctor.noarch: Centos, Fedora
278 # (Added to RHEL/Centos 8: https://bugzilla.redhat.com/show_bug.cgi?id=1820896 )
279 # ruby2.5-rubygem-asciidoctor: openSUSE 15.2
280 add_package RPMDEPS_LIST rubygem-asciidoctor.noarch || add_package RPMDEPS_LIST ruby2.5-rubygem-asciidoctor ||
281 echo "RPM dependency asciidoctor is unavailable" >&2
283 # libcap: CentOS 7, Fedora 28, Fedora 29
284 # libcap2: OpenSUSE Leap 42.3, OpenSUSE Leap 15.0
285 add_package ADDITIONAL_LIST libcap || add_package ADDITIONAL_LIST libcap2 ||
286 echo "Optional package libcap|libcap2 is unavailable" >&2
288 add_package ADDITIONAL_LIST nghttp2-devel || add_package ADDITIONAL_LIST libnghttp2-devel ||
289 echo "Optional package nghttp2-devel|libnghttp2-devel is unavailable" >&2
291 add_package ADDITIONAL_LIST snappy || add_package ADDITIONAL_LIST libsnappy1 ||
292 echo "Optional package snappy|libsnappy1 is unavailable" >&2
294 add_package ADDITIONAL_LIST libzstd-devel || echo "Optional package lbzstd-devel is unavailable" >&2
296 add_package ADDITIONAL_LIST lz4-devel || add_package ADDITIONAL_LIST liblz4-devel ||
297 echo "Optional package lz4-devel|liblz4-devel is unavailable" >&2
299 add_package ADDITIONAL_LIST libcap-progs || echo "Optional package libcap-progs is unavailable" >&2
301 add_package ADDITIONAL_LIST libmaxminddb-devel ||
302 echo "Optional package libmaxminddb-devel is unavailable" >&2
304 add_package ADDITIONAL_LIST gnutls-devel || add_package ADDITIONAL_LIST libgnutls-devel ||
305 echo "Optional package gnutls-devel|libgnutls-devel is unavailable" >&2
307 add_package ADDITIONAL_LIST gettext-devel || add_package ADDITIONAL_LIST gettext-tools ||
308 echo "Optional package gettext-devel|gettext-tools is unavailable" >&2
310 add_package ADDITIONAL_LIST ninja || add_package ADDITIONAL_LIST ninja-build ||
311 echo "Optional package ninja|ninja-build is unavailable" >&2
313 add_package ADDITIONAL_LIST libxslt || add_package ADDITIONAL_LIST libxslt1 ||
314 echo "Optional package libxslt|libxslt1 is unavailable" >&2
316 add_package ADDITIONAL_LIST docbook-style-xsl || add_package ADDITIONAL_LIST docbook-xsl-stylesheets ||
317 echo "Optional package docbook-style-xsl|docbook-xsl-stylesheets is unavailable" >&2
319 add_package ADDITIONAL_LIST brotli-devel || add_packages ADDITIONAL_LIST libbrotli-devel libbrotlidec1 ||
320 echo "Optional packages brotli-devel|libbrotli-devel is unavailable" >&2
322 add_package ADDITIONAL_LIST libnl3-devel || add_package ADDITIONAL_LIST libnl-devel ||
323 echo "Optional package libnl3-devel|libnl-devel are unavailable" >&2
325 add_package ADDITIONAL_LIST ilbc-devel ||
326 echo "Optional package ilbc-devel is unavailable" >&2
328 # opus-devel: RHEL/CentOS, Fedora
329 # libopus-devel: OpenSUSE
330 add_package ADDITIONAL_LIST opus-devel || add_package ADDITIONAL_LIST libopus-devel ||
331 echo "Optional package opus-devel|libopus-devel is unavailable" >&2
333 add_package ADDITIONAL_LIST bcg729-devel ||
334 echo "Optional package bcg729-devel is unavailable" >&2
336 add_package ADDITIONAL_LIST minizip-ng-compat-devel || add_package ADDITIONAL_LIST minizip-devel ||
337 echo "Optional package minizip-ng-compat-devel|minizip-devel is unavailable" >&2
339 # RHEL 8 / CentOS 8 are missing the -devel packages for sbc and libsmi due to
340 # RH deciding not to ship all -devel packages.
341 # https://wiki.centos.org/FAQ/CentOS8/UnshippedPackages
342 # There are CentOS bugs filed to add them to the Devel repository and eventually
343 # RHEL 8 CRB / CentOS PowerTools, but make them optional for now.
344 # https://bugs.centos.org/view.php?id=16504
345 # https://bugs.centos.org/view.php?id=17824
346 add_package ADDITIONAL_LIST sbc-devel ||
347 echo "Optional package sbc-devel is unavailable"
349 add_package ADDITIONAL_LIST libsmi-devel ||
350 echo "Optional package libsmi-devel is unavailable"
352 add_package ADDITIONAL_LIST opencore-amr-devel ||
353 echo "Optional package opencore-amr-devel is unavailable" >&2
355 add_package ADDITIONAL_LIST softhsm ||
356 echo "Optional package softhsm is unavailable" >&2
358 ACTUAL_LIST=$BASIC_LIST
360 # Now arrange for optional support libraries
361 if [ $ADDITIONAL -ne 0 ]
362 then
363 ACTUAL_LIST="$ACTUAL_LIST $ADDITIONAL_LIST"
366 if [ $RPMDEPS -ne 0 ]
367 then
368 ACTUAL_LIST="$ACTUAL_LIST $RPMDEPS_LIST"
371 # shellcheck disable=SC2086
372 $PM $PM_OPT install $OPTIONS $ACTUAL_LIST
374 if [ $ADDITIONAL -eq 0 ]
375 then
376 echo -e "\n*** Optional packages not installed. Rerun with --install-optional to have them.\n"
379 if [ $RPMDEPS -eq 0 ]
380 then
381 printf "\n*** RPM packages build deps not installed. Rerun with --install-rpm-deps to have them.\n"