Add first class support for FreeBSD (#9413)
* Add FreeBSD system detection and package manager support * Add suitable package selections for FreeBSD * Add non-interactive mode for pkg * Use gmake to buiold on FreeBSD and --disable-dependency-tracking
James Mills committed
Jun 26, 2020 at 09:28 UTC
d596b2530ab6b36c6cf1f1b294b91d214e230e07
2 files changed
+86
-6
netdata-installer.sh
+10
-3
@@ -297,6 +297,13 @@ while [ -n "${1}" ]; do
297
shift 1
298
done
299
300
+make="make"
301
+# See: https://github.com/netdata/netdata/issues/9163
302
+if [ "$(uname -s)" = "FreeBSD" ]; then
303
+ make="gmake"
304
+ NETDATA_CONFIGURE_OPTIONS="$NETDATA_CONFIGURE_OPTIONS --disable-dependency-tracking"
305
+fi
306
+
307
# replace multiple spaces with a single space
308
NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS// / }"
309
@@ -705,12 +712,12 @@ trap - EXIT
712
# -----------------------------------------------------------------------------
713
progress "Cleanup compilation directory"
714
708
-run make clean
715
+run $make clean
716
717
# -----------------------------------------------------------------------------
718
progress "Compile netdata"
719
713
-run make -j$(find_processors) || exit 1
720
+run $make -j$(find_processors) || exit 1
721
722
# -----------------------------------------------------------------------------
723
progress "Migrate configuration files for node.d.plugin and charts.d.plugin"
@@ -817,7 +824,7 @@ touch "${NETDATA_PREFIX}/etc/netdata/.installer-cleanup-of-stock-configs-done"
824
# -----------------------------------------------------------------------------
825
progress "Install netdata"
826
820
-run make install || exit 1
827
+run $make install || exit 1
828
829
# -----------------------------------------------------------------------------
830
progress "Fix generated files permissions"
packaging/installer/install-required-packages.sh
+76
-3
@@ -40,6 +40,7 @@ lsb_release=$(command -v lsb_release 2> /dev/null)
40
apk=$(command -v apk 2> /dev/null)
41
apt_get=$(command -v apt-get 2> /dev/null)
42
brew=$(command -v brew 2> /dev/null)
43
+pkg=$(command -v pkg 2> /dev/null)
44
dnf=$(command -v dnf 2> /dev/null)
45
emerge=$(command -v emerge 2> /dev/null)
46
equo=$(command -v equo 2> /dev/null)
@@ -92,6 +93,7 @@ Supported installers (IN):
93
- apk all Alpine derivatives
94
- swupd all Clear Linux derivatives
95
- brew macOS Homebrew
96
+ - pkg FreeBSD Ports
97
98
Supported packages (you can append many of them):
99
@@ -275,18 +277,24 @@ autodetect_distribution() {
277
"Linux")
278
get_os_release || get_lsb_release || find_etc_any_release
279
;;
280
+ "FreeBSD")
281
+ distribution="freebsd"
282
+ version="$(uname -r)"
283
+ detection="uname"
284
+ ;;
285
"Darwin")
286
distribution="macos"
287
version="$(uname -r)"
288
detection="uname"
289
283
- if [ ${EUID} -eq 0 ] ; then
290
+ if [ ${EUID} -eq 0 ]; then
291
echo >&2 "This script does not support running as EUID 0 on macOS. Please run it as a regular user."
292
exit 1
293
fi
294
;;
295
*)
296
return 1
297
+ ;;
298
esac
299
}
300
@@ -322,6 +330,7 @@ user_picks_distribution() {
330
[ -n "${apk}" ] && echo >&2 " - Alpine Linux based (installer is: apk)" && opts="apk ${opts}"
331
[ -n "${swupd}" ] && echo >&2 " - Clear Linux based (installer is: swupd)" && opts="swupd ${opts}"
332
[ -n "${brew}" ] && echo >&2 " - macOS based (installer is: brew)" && opts="brew ${opts}"
333
+ # XXX: This is being removed in another PR.
334
echo >&2
335
336
REPLY=
@@ -446,6 +455,14 @@ detect_package_manager_from_distribution() {
455
fi
456
;;
457
458
+ freebsd)
459
+ package_installer="install_pkg"
460
+ tree="freebsd"
461
+ if [ "${IGNORE_INSTALLED}" -eq 0 ] && [ -z "${pkg}" ]; then
462
+ echo >&2 "command 'pkg' is required to install packages on a '${distribution} ${version}' system."
463
+ exit 1
464
+ fi
465
+ ;;
466
macos)
467
package_installer="install_brew"
468
tree="macos"
@@ -462,6 +479,7 @@ detect_package_manager_from_distribution() {
479
esac
480
}
481
482
+# XXX: This is being removed in another PR.
483
check_package_manager() {
484
# This is called only when the user is selecting a package manager
485
# It is used to verify the user selection is right
@@ -585,6 +603,7 @@ declare -A pkg_find=(
603
['fedora']="findutils"
604
['clearlinux']="findutils"
605
['macos']="NOTREQUIRED"
606
+ ['freebsd']="NOTREQUIRED"
607
['default']="WARNING|"
608
)
609
@@ -646,6 +665,7 @@ declare -A pkg_json_c_dev=(
665
['gentoo']="dev-libs/json-c"
666
['sabayon']="dev-libs/json-c"
667
['suse']="libjson-c-devel"
668
+ ['freebsd']="json-c"
669
['default']="json-c-devel"
670
)
671
@@ -748,6 +768,7 @@ declare -A pkg_libz_dev=(
768
['suse']="zlib-devel"
769
['clearlinux']="devpkg-zlib"
770
['macos']="NOTREQUIRED"
771
+ ['freebsd']="lzlib"
772
['default']=""
773
)
774
@@ -762,6 +783,7 @@ declare -A pkg_libuuid_dev=(
783
['rhel']="libuuid-devel"
784
['suse']="libuuid-devel"
785
['macos']="NOTREQUIRED"
786
+ ['freebsd']="e2fsprogs-libuuid"
787
['default']=""
788
)
789
@@ -790,6 +812,7 @@ declare -A pkg_lm_sensors=(
812
['suse']="sensors"
813
['clearlinux']="lm-sensors"
814
['macos']="WARNING|"
815
+ ['freebsd']="NOTREQUIRED"
816
['default']="lm_sensors"
817
)
818
@@ -817,6 +840,7 @@ declare -A pkg_mailutils=(
840
declare -A pkg_make=(
841
['gentoo']="sys-devel/make"
842
['macos']="NOTREQUIRED"
843
+ ['freebsd']="gmake"
844
['default']="make"
845
)
846
@@ -847,6 +871,7 @@ declare -A pkg_nginx=(
871
declare -A pkg_nodejs=(
872
['gentoo']="net-libs/nodejs"
873
['clearlinux']="nodejs-basic"
874
+ ['freebsd']="node"
875
['default']="nodejs"
876
877
# exceptions
@@ -872,6 +897,7 @@ declare -A pkg_pkg_config=(
897
['sabayon']="virtual/pkgconfig"
898
['rhel']="pkgconfig"
899
['suse']="pkg-config"
900
+ ['freebsd']="pkgconf"
901
['clearlinux']="c-basic"
902
['default']="pkg-config"
903
)
@@ -999,6 +1025,7 @@ declare -A pkg_python3_pymongo=(
1025
['gentoo']="dev-python/pymongo"
1026
['suse']="python3-pymongo"
1027
['clearlinux']="WARNING|"
1028
+ ['freebsd']="py37-pymongo"
1029
['macos']="WARNING|"
1030
['default']="python3-pymongo"
1031
)
@@ -1042,6 +1069,7 @@ declare -A pkg_lz4=(
1069
['clearlinux']="devpkg-lz4"
1070
['arch']="lz4"
1071
['macos']="lz4"
1072
+ ['freebsd']="liblz4"
1073
['default']="lz4-devel"
1074
)
1075
@@ -1053,6 +1081,7 @@ declare -A pkg_libuv=(
1081
['arch']="libuv"
1082
['clearlinux']="devpkg-libuv"
1083
['macos']="libuv"
1084
+ ['freebsd']="libuv"
1085
['default']="libuv-devel"
1086
)
1087
@@ -1064,6 +1093,7 @@ declare -A pkg_openssl=(
1093
['clearlinux']="devpkg-openssl"
1094
['gentoo']="dev-libs/openssl"
1095
['arch']="openssl"
1096
+ ['freebsd']="openssl"
1097
['macos']="openssl@1.1"
1098
['default']="openssl-devel"
1099
)
@@ -1077,6 +1107,7 @@ declare -A pkg_judy=(
1107
['suse']="judy-devel"
1108
['gentoo']="dev-libs/judy"
1109
['arch']="judy"
1110
+ ['freebsd']="Judy"
1111
['default']="Judy-devel"
1112
)
1113
@@ -1360,7 +1391,7 @@ run() {
1391
}
1392
1393
sudo=
1363
-if [ ${UID} -ne 0 ] ; then
1394
+if [ ${UID} -ne 0 ]; then
1395
sudo="sudo"
1396
fi
1397
@@ -1423,6 +1454,24 @@ prompt() {
1454
done
1455
}
1456
1457
+validate_tree_freebsd() {
1458
+ local opts=
1459
+ if [ "${NON_INTERACTIVE}" -eq 1 ]; then
1460
+ echo >&2 "Running in non-interactive mode"
1461
+ opts="-y"
1462
+ fi
1463
+
1464
+ echo >&2 " > FreeBSD Version: ${version} ..."
1465
+
1466
+ make="make"
1467
+ echo >&2 " > Checking for gmake ..."
1468
+ if ! pkg query %n-%v | grep -q gmake; then
1469
+ if prompt "gmake is required to build on FreeBSD and is not installed. Shall I install it?"; then
1470
+ run ${sudo} pkg install ${opts} gmake
1471
+ fi
1472
+ fi
1473
+}
1474
+
1475
validate_tree_centos() {
1476
local opts=
1477
if [ "${NON_INTERACTIVE}" -eq 1 ]; then
@@ -1736,10 +1785,34 @@ install_swupd() {
1785
# -----------------------------------------------------------------------------
1786
# macOS
1787
1788
+validate_install_pkg() {
1789
+ pkg query %n-%v | grep -q "${*}" || echo "${*}"
1790
+}
1791
+
1792
validate_install_brew() {
1793
brew list | grep -q "${*}" || echo "${*}"
1794
}
1795
1796
+install_pkg() {
1797
+ # download the latest package info
1798
+ if [ "${DRYRUN}" -eq 1 ]; then
1799
+ echo >&2 " >> IMPORTANT << "
1800
+ echo >&2 " Please make sure your system is up to date"
1801
+ echo >&2 " by running: pkg update "
1802
+ echo >&2
1803
+ fi
1804
+
1805
+ local opts=
1806
+ if [ "${NON_INTERACTIVE}" -eq 1 ]; then
1807
+ echo >&2 "Running in non-interactive mode"
1808
+ opts="-y"
1809
+ fi
1810
+
1811
+ read -r -a pkg_opts <<< "${opts}"
1812
+
1813
+ run ${sudo} pkg install "${pkg_opts[@]}" "${@}"
1814
+}
1815
+
1816
install_brew() {
1817
# download the latest package info
1818
if [ "${DRYRUN}" -eq 1 ]; then
@@ -1796,7 +1869,7 @@ if [ -z "${1}" ]; then
1869
fi
1870
1871
pv=$(python --version 2>&1)
1799
-if [ "${tree}" = macos ] ; then
1872
+if [ "${tree}" = macos ]; then
1873
pv=3
1874
elif [[ "${pv}" =~ ^Python\ 2.* ]]; then
1875
pv=2