1#!/usr/bin/env bash
2# Setup development environment on BSD-like platforms.
3#
4# Tested on: FreeBSD, OpenBSD, NetBSD.
5#
6# Wireshark - Network traffic analyzer
7# By Gerald Combs <gerald@wireshark.org>
8# Copyright 1998 Gerald Combs
9#
10# SPDX-License-Identifier: GPL-2.0-or-later
11#
12# We drag in tools that might not be needed by all users; it's easier
13# that way.
14#
15
16if [ "$1" = "--help" ]
17then
18	echo "\nUtility to setup a bsd-based system for Wireshark Development.\n"
19	echo "The basic usage installs the needed software\n\n"
20	echo "Usage: $0 [--install-optional] [...other options...]\n"
21	echo "\t--install-optional: install optional software as well"
22	echo "\t[other]: other options are passed as-is to pkg manager.\n"
23	exit 1
24fi
25
26# Check if the user is root
27if [ $(id -u) -ne 0 ]
28then
29	echo "You must be root."
30	exit 1
31fi
32
33for op
34do
35	if [ "$op" = "--install-optional" ]
36	then
37		ADDITIONAL=1
38	else
39		OPTIONS="$OPTIONS $op"
40	fi
41done
42
43BASIC_LIST="\
44	cmake \
45	qt5 \
46	git"
47
48ADDITIONAL_LIST="\
49	gettext-tools \
50	snappy \
51	bcg729 \
52	libssh \
53	libmaxminddb \
54	libsmi \
55	brotli \
56	speexdsp \
57	zstd \
58	lua52 \
59	"
60
61# Uncomment to add PNG compression utilities used by compress-pngs:
62# ADDITIONAL_LIST="$ADDITIONAL_LIST \
63#	advancecomp \
64#	optipng \
65#	pngcrush"
66
67# Guess which package manager we will use
68PM=`which pkgin 2> /dev/null || which pkg 2> /dev/null || which pkg_add 2> /dev/null`
69
70case $PM in
71	*/pkgin)
72		PM_OPTIONS="install"
73		PM_SEARCH="pkgin search"
74		PM_MUST_GLOB=no
75		;;
76	*/pkg)
77		PM_OPTIONS="install"
78		PM_SEARCH="pkg search"
79		PM_MUST_GLOB=yes
80		;;
81	*/pkg_add)
82		PM_OPTIONS=""
83		PM_SEARCH="pkg_info"
84		PM_MUST_GLOB=no
85		;;
86esac
87
88
89echo "Using $PM ($PM_SEARCH)"
90
91# Adds package $2 to list variable $1 if the package is found
92add_package() {
93	local list="$1" pkgname="$2"
94
95	# fail if the package is not known
96	if [ "$PM_MUST_GLOB" = yes ]
97	then
98		#
99		# We need to do a glob search, with a "*" at the
100		# end, so we only find packages that *begin* with
101		# the name; otherwise, searching for pkg-config
102		# could find packages that *don't* begin with
103		# pkg-config, but have it later in the name
104		# (FreeBSD 11 has one such package), so when
105		# we then try to install it, that fails.  Doing
106		# an *exact* search fails, as that requires that
107		# the package name include the version number.
108		#
109		$PM_SEARCH -g "$pkgname*" > /dev/null 2>&1 || return 1
110	else
111		$PM_SEARCH "$pkgname" > /dev/null 2>&1 || return 1
112	fi
113
114	# package is found, append it to list
115	eval "${list}=\"\${${list}} \${pkgname}\""
116}
117
118# pkg-config: NetBSD
119# pkgconf: FreeBSD
120add_package BASIC_LIST pkg-config ||
121add_package BASIC_LIST pkgconf ||
122echo "pkg-config is unavailable"
123
124# c-ares: FreeBSD
125# libcares: OpenBSD
126add_package BASIC_LIST c-ares ||
127add_package BASIC_LIST libcares ||
128echo "c-ares is unavailable"
129
130# rubygem-asciidoctor: FreeBSD
131add_package ADDITIONAL_LIST rubygem-asciidoctor ||
132echo "asciidoctor is unavailable"
133
134# liblz4: FreeBSD
135# lz4: NetBSD
136add_package ADDITIONAL_LIST liblz4 ||
137add_package ADDITIONAL_LIST lz4 ||
138echo "lz4 is unavailable"
139
140# nghttp2: NetBSD
141add_package ADDITIONAL_LIST nghttp2 ||
142echo "nghttp2 is unavailable"
143
144# spandsp: NetBSD
145add_package ADDITIONAL_LIST spandsp ||
146echo "spandsp is unavailable"
147
148# ninja: FreeBSD, OpenBSD
149# ninja-build: NetBSD
150add_package ADDITIONAL_LIST ninja-build ||
151add_package ADDITIONAL_LIST ninja ||
152echo "ninja is unavailable"
153
154# libilbc: FreeBSD
155add_package ADDITIONAL_LIST libilbc ||
156echo "libilbc is unavailable"
157
158# Add OS-specific required/optional packages
159# Those not listed don't require additions.
160case `uname` in
161	NetBSD)
162		add_package ADDITIONAL_LIST libgcrypt || echo "libgcrypt is unavailable"
163		;;
164esac
165
166ACTUAL_LIST=$BASIC_LIST
167
168# Now arrange for optional support libraries
169if [ "$ADDITIONAL" != "" ]
170then
171	ACTUAL_LIST="$ACTUAL_LIST $ADDITIONAL_LIST"
172fi
173
174$PM $PM_OPTIONS $ACTUAL_LIST $OPTIONS
175if [ ! $? ]
176then
177	exit 2
178fi
179
180if [ "$ADDITIONAL" == "" ]
181then
182	echo -e "\n*** Optional packages not installed. Rerun with --install-optional to have them.\n"
183fi
184