From f2bd67b386b6e6f55ee9ca66fb19b5c3ff2b446a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 4 Aug 2022 13:49:26 +0200 Subject: [PATCH] contrib/rpm: add "configure-for-system.sh" script to configure build This will use the same option as when we do an RPM build. The purpose is that you could type `make install` with such a build, and it would replace the files that you'd get by installing the NetworkManager RPMs. Of course, you would not want to do that on your work station, but it will be useful in a container, where we don't mind messing up the installation. --- contrib/fedora/rpm/configure-for-system.sh | 509 +++++++++++++++++++++ 1 file changed, 509 insertions(+) create mode 100755 contrib/fedora/rpm/configure-for-system.sh diff --git a/contrib/fedora/rpm/configure-for-system.sh b/contrib/fedora/rpm/configure-for-system.sh new file mode 100755 index 0000000000..bae35e227c --- /dev/null +++ b/contrib/fedora/rpm/configure-for-system.sh @@ -0,0 +1,509 @@ +#!/bin/bash + +# Run configure/meson for NetworkManager in a way similar to how an RPM build does it. +# The effect is, that if you do `make install`, that it will overwrite the files that +# you'd usually get by installing the NetworkManager RPM. Also, it means you can afterwards +# systemctl restart NetworkManager. + +die() { + printf "%s\n" "$*" + exit 1 +} + +BASE_DIR="$(cd "$(dirname "$BASH_SOURCE")"; git rev-parse --show-toplevel)" + +cd "$BASE_DIR" || die "Cannot cd to base directory" + +vars() { + sed -e '1,/[P]VARS/!d' "$BASH_SOURCE" | sed -n 's/^'"$1"'_\([^=]*\)=.*/\1/p' +} + +vars_with_vals() { + echo "Variables:" + for v in $(vars P); do + printf " %s=%q\n" "$v" "$(eval "echo \"\$P_$v\"")" + done + echo "Directories:" + for v in $(vars D); do + printf " %s=%q\n" "$v" "$(eval "echo \"\$D_$v\"")" + done +} + +usage() { + echo "$ $0 [-m|--meson] [-a|--autotools] [-s|--show]" + echo "" + echo "Configure NetworkManager in a way that is similar to when building" + echo "RPMs of NetworkManager for Fedora/RHEL. The effect is that \`make install\`" + echo "will overwrite the files in /usr that you installed via the package management" + echo "systemd. Also, subsequent \`systemctl restart NetworkManager\` works." + echo "You don't want to do this on your real system, because it messes up your" + echo "installation" + echo + + vars_with_vals +} + +get_version() { + local major minor micro + local F="./configure.ac" + + vars="$(sed -n 's/^m4_define(\[nm_\(major\|minor\|micro\)_version\], *\[\([0-9]\+\)\]) *$/local \1='\''\2'\''/p' "$F" 2>/dev/null)" + eval "$vars" + + [[ -n "$major" && -n "$minor" && "$micro" ]] || return 1 + echo "$major.$minor.$micro" +} + +bool() { + case "$1" in + 1|y|Y|yes|Yes|YES|true|True|TRUE) + return 0 + ;; + 0|n|N|no|No|NO|false|False|FALSE) + return 1 + ;; + *) + local re='^[0-9]+$' + [[ $1 =~ $re ]] && test "$1" -gt 0 && return 0 + [ "$#" -le "1" ] && return 1 + shift + bool "$@" + return $? + ;; + esac +} + +bool_true() { + if bool "$@"; then + echo true + else + echo false + fi +} + +bool_not_true() { + if bool "$@"; then + echo false + else + echo true + fi +} + +bool_enable() { + if bool "$@"; then + echo enable + else + echo disable + fi +} + +bool_not_enable() { + if bool "$@"; then + echo disable + else + echo enable + fi +} + +bool_yes() { + if bool "$@"; then + echo yes + else + echo no + fi +} + +bool_not_yes() { + if bool "$@"; then + echo no + else + echo yes + fi +} + +args_enable() { + local cond="$1" + local a + shift + if bool "$cond" ; then + for a; do + printf "%q\n" "$a" + done + fi +} + +show_cmd() { + local a + local sep= + + for a; do + printf '%s%q' "$sep" "$a" + sep=' ' + done + printf '\n' +} + +SHOW_CMD= + +P_DEBUG="${DEBUG-1}" + +P_BUILD_TYPE="${BUILD_TYPE-}" +P_CFLAGS="${CFLAGS-}" +P_CC="${CC-$((! command -v gcc && command -v clang) &>/dev/null && echo clang || echo gcc)}" + +P_RHEL="${RHEL-}" +P_FEDORA="${FEDORA-}" + +P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH="${CONFIG_PLUGINS_DEFAULT_IFCFG_RH-}" +P_CRYPTO="${CRYPTO-}" +P_DBUS_SYS_DIR="${DBUS_SYS_DIR-}" +P_DHCP_DEFAULT="${DHCP_DEFAULT-}" +P_DNS_RC_MANAGER_DEFAULT="${DNS_RC_MANAGER_DEFAULT-}" +P_EBPF_ENABLED="${EBPF_ENABLED-no}" +P_FIREWALLD_ZONE="${FIREWALLD_ZONE-}" +P_IWD="${IWD-}" +P_LOGGING_BACKEND_DEFAULT="${LOGGING_BACKEND_DEFAULT-}" +P_LTO="${LTO-0}" +P_MODEM_MANAGER_1="${MODEM_MANAGER_1-}" +P_TEST="${TEST-1}" +P_SILENT_RULES="${SILENT_RULES-1}" + +P_VERSION="${VERSION:-$(get_version)}" +P_RELEASE="${RELEASE:-$(git rev-list HEAD | wc -l).test}" + +P_REGEN_DOCS="${REGEN_DOCS-1}" +P_SANITIZER="${SANITIZER-0}" + +P_WIFI="${WIFI-1}" +P_WWAN="${WWAN-1}" +P_TEAM="${TEAM-1}" +P_BLUETOOTH="${BLUETOOTH-1}" +P_NMTUI="${NMTUI-1}" +P_NM_CLOUD_SETUP="${NM_CLOUD_SETUP-1}" +P_OVS="${OVS-1}" +P_PPP="${PPP-1}" + +P_PPP_VERSION="${PPP_VERSION-}" + +D_PREFIX="$(rpm --eval "%{_prefix}")" +D_BINDIR="$(rpm --eval "%{_bindir}")" +D_SBINDIR="$(rpm --eval "%{_sbindir}")" +D_LIBDIR="$(rpm --eval "%{_libdir}")" +D_LIBEXECDIR="$(rpm --eval "%{_libexecdir}")" +D_INCLUDEDIR="$(rpm --eval "%{_includedir}")" +D_DATADIR="$(rpm --eval "%{_datadir}")" +D_RUNDIR="$(rpm --eval "%{_rundir}")" +D_MANDIR="$(rpm --eval "%{_mandir}")" +D_INFODIR="$(rpm --eval "%{_infodir}")" +D_SYSCONFDIR="$(rpm --eval "%{_sysconfdir}")" +D_LOCALSTATEDIR="$(rpm --eval "%{_localstatedir}")" +D_SHAREDSTATEDIR="$(rpm --eval "%{_sharedstatedir}")" + +#PVARS + +if [ -z "$P_FEDORA" -a -z "$P_RHEL" ] ; then + x="$(grep -q "ID=fedora" /etc/os-release && sed -n 's/VERSION_ID=//p' /etc/os-release)" + if test "$x" -gt 0 ; then + P_FEDORA="$x" + P_RHEL=0 + else + x="$(grep -q "ID=fedora" /etc/os-release && sed -n 's/VERSION_ID=//p' /etc/os-release)" + if test "$x" -gt 0 ; then + P_FEDORA=0 + P_RHEL="$x" + fi + fi +fi +test -z "$P_FEDORA" && P_FEDORA=0 +test -z "$P_RHEL" && P_RHEL=0 + +test "$P_FEDORA" -gt 0 -o "$P_RHEL" -gt 0 || die "FEDORA/RHEL variables unset" + +if [ -z "$P_PPP_VERSION" ] ; then + P_PPP_VERSION="$(sed -n 's/^#define\s*VERSION\s*"\([^\s]*\)"$/\1/p' "$D_INCLUDEDIR/pppd/patchlevel.h" 2>/dev/null | grep . || echo bad)" +fi + +if [ -z "$P_CRYPTO" ] ; then + if [ "$P_FEDORA" -ge 29 -o "$P_RHEL" -ge 8 ] ; then + P_CRYPTO=gnutls + else + P_CRYPTO=nss + fi +fi + +if [ -z "$P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH" ] ; then + if [ "$P_FEDORA" -ge 33 -o "$P_RHEL" -ge 9 ] ; then + P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH=0 + else + P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH=1 + fi +fi + + +if [ -z "$P_DBUS_SYS_DIR" ] ; then + if [ "$P_FEDORA" -ge 1 -o "$P_RHEL" -ge 8 ] ; then + P_DBUS_SYS_DIR="$D_DATADIR/dbus-1/system.d" + else + P_DBUS_SYS_DIR="$D_SYSCONFDIR/dbus-1/system.d" + fi +fi + +if [ -z "$P_DNS_RC_MANAGER_DEFAULT" ] ; then + if [ "$P_FEDORA" -ge 1 -o "$P_RHEL" -ge 9 ] ; then + P_DNS_RC_MANAGER_DEFAULT=auto + elif [ "$P_FEDORA" -ge 1 -o "$P_RHEL" -ge 8 ] ; then + P_DNS_RC_MANAGER_DEFAULT=symlink + else + P_DNS_RC_MANAGER_DEFAULT=file + fi +fi + +if [ -z "$P_LOGGING_BACKEND_DEFAULT" ] ; then + if [ "$P_FEDORA" -ge 1 -o "$P_RHEL" -ge 8 ] ; then + P_LOGGING_BACKEND_DEFAULT=journal + else + P_LOGGING_BACKEND_DEFAULT=syslog + fi +fi + +if [ -z "$P_DHCP_DEFAULT" ] ; then + if [ "$P_FEDORA" -ge 31 -o "$P_RHEL" -ge 8 ] ; then + P_DHCP_DEFAULT=internal + else + P_DHCP_DEFAULT=dhclient + fi +fi + +if [ -z "$P_FIREWALLD_ZONE" ] ; then + if [ "$P_FEDORA" -ge 32 -o "$P_RHEL" -ge 8 ] ; then + P_FIREWALLD_ZONE=1 + else + P_FIREWALLD_ZONE=0 + fi +fi + +if [ -z "$P_IWD" ] ; then + if [ "$P_RHEL" -ge 1 ] ; then + P_IWD=0 + else + P_IWD=1 + fi +fi + +if [ -z "$P_MODEM_MANAGER_1" ] ; then + if bool "$P_BLUETOOTH" || bool "$P_WWAN" ; then + P_MODEM_MANAGER_1=1 + else + P_MODEM_MANAGER_1=0 + fi +fi + +if bool "$P_DEBUG" ; then + P_CFLAGS="-g -Og -fexceptions${P_CFLAGS:+ }$P_CFLAGS" +else + P_CFLAGS="-g -O2 -fexceptions${P_CFLAGS:+ }$P_CFLAGS" +fi + +if [ -z "$P_BUILD_TYPE" ] ; then + if [ -d ./build -a ! -f ./configure] ; then + P_BUILD_TYPE=meson + elif [ ! -d ./build -a -f ./configure] ; then + P_BUILD_TYPE=autotools + else + P_BUILD_TYPE=autotools + fi +fi + +while [[ $# -gt 0 ]] ; do + A="$1" + shift + case "$A" in + --meson|-m) + P_BUILD_TYPE=meson + ;; + --autotools|-a) + P_BUILD_TYPE=autotools + ;; + -s|--show) + SHOW_CMD=show_cmd + ;; + -h|help|-help|--help) + usage + exit 0 + ;; + *) + usage + exit 1 + ;; + esac +done + +vars_with_vals + +if [ "$P_BUILD_TYPE" == meson ] ; then + MESON_RECONFIGURE= + if test -d "./build/" ; then + MESON_RECONFIGURE="--reconfigure" + fi + + $SHOW_CMD \ + env \ + CC="$P_CC" \ + CFLAGS="$P_CFLAGS" \ + meson \ + --buildtype=plain \ + --prefix="$D_PREFIX" \ + --libdir="$D_LIBDIR" \ + --libexecdir="$D_LIBEXECDIR" \ + --bindir="$D_BINDIR" \ + --sbindir="$D_SBINDIR" \ + --includedir="$D_INCLUDEDIR" \ + --datadir="$D_DATADIR" \ + --mandir="$D_MANDIR" \ + --infodir="$D_INFODIR" \ + --localedir="$D_DATADIR"/locale \ + --sysconfdir="$D_SYSCONFDIR" \ + --localstatedir="$D_LOCALSTATEDIR" \ + --sharedstatedir="$D_SHAREDSTATEDIR" \ + --wrap-mode=nodownload \ + --auto-features=enabled \ + \ + build \ + \ + $MESON_RECONFIGURE \ + \ + -Db_ndebug=false \ + --warnlevel 2 \ + $(args_enable "$P_TEST" --werror) \ + -Dnft=/usr/sbin/nft \ + -Diptables=/usr/sbin/iptables \ + -Ddhcpcanon=no \ + -Ddhcpcd=no \ + -Dconfig_dhcp_default="$P_DHCP_DEFAULT" \ + "-Dcrypto=$P_CRYPTO" \ + $(args_enable "$P_DEBUG" -Dmore_logging=true -Dmore_asserts=10000) \ + $(args_enable "$(bool_not_true "$P_DEBUG")" -Dmore_logging=false -Dmore_asserts=0) \ + -Dld_gc=true \ + -Db_lto="$(bool_true "$P_LTO")" \ + -Dlibaudit=yes-disabled-by-default \ + -Dmodem_manager="$(bool_true "$P_MODEM_MANAGER_1")" \ + $(args_enable "$P_WIFI" -Dwifi=true -Dwext="$(bool_true "$P_FEDORA")") \ + $(args_enable "$(bool_not_true "$P_WIFI")" -Dwifi=false) \ + -Diwd="$(bool_true "$P_IWD")" \ + -Dbluez5_dun="$(bool_true "$P_BLUETOOTH")" \ + -Dnmtui="$(bool_true "$P_NMTUI")" \ + -Dnm_cloud_setup="$(bool_true "$P_NM_CLOUD_SETUP")" \ + -Dvapi=true \ + -Dintrospection=true \ + -Ddocs="$(bool_true "$P_REGEN_DOCS")" \ + -Dteamdctl="$(bool_true "$P_TEAM")" \ + -Dovs="$(bool_true "$P_OVS")" \ + -Dselinux=true \ + -Dpolkit=true \ + -Dconfig_auth_polkit_default=true \ + -Dmodify_system=true \ + -Dconcheck=true \ + -Dlibpsl="$(bool_true "$P_FEDORA")" \ + -Debpf="$(bool_true "$P_EBPF_ENABLED")" \ + -Dsession_tracking=systemd \ + -Dsuspend_resume=systemd \ + -Dsystem_ca_path=/etc/pki/tls/cert.pem \ + -Ddbus_conf_dir="$P_DBUS_SYS_DIR" \ + -Dtests=yes \ + -Dvalgrind=no \ + -Difcfg_rh=true \ + -Difupdown=false \ + $(args_enable "$P_PPP" -Dpppd_plugin_dir="$D_LIBDIR/pppd/$P_PPP_VERSION" -Dppp=true) \ + -Dfirewalld_zone="$(bool_true "$P_FIREWALLD_ZONE}")" \ + -Ddist_version="$P_VERSION-$P_RELEASE" \ + $(args_enable "$P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH" -Dconfig_plugins_default=ifcfg-rh) \ + -Dresolvconf=no \ + -Dnetconfig=no \ + -Dconfig_dns_rc_manager_default="$P_DNS_RC_MANAGER_DEFAULT" \ + -Dconfig_logging_backend_default="$P_LOGGING_BACKEND_DEFAULT" \ + ; + +else + if ! test -x ./configure ; then + if [ -z "$SHOW_CMD" ]; then + NOCONFIGURE=yes ./autogen.sh + fi + fi + $SHOW_CMD \ + ./configure \ + --build=x86_64-redhat-linux-gnu \ + --host=x86_64-redhat-linux-gnu \ + --program-prefix= \ + --prefix="$D_PREFIX" \ + --exec-prefix=/usr \ + --bindir="$D_BINDIR" \ + --sbindir="$D_SBINDIR" \ + --sysconfdir="$D_SYSCONFDIR" \ + --datadir="$D_DATADIR" \ + --includedir="$D_INCLUDEDIR" \ + --libdir="$D_LIBDIR" \ + --libexecdir="$D_LIBEXECDIR" \ + --localstatedir="$D_LOCALSTATEDIR" \ + --sharedstatedir="$D_SHAREDSTATEDIR" \ + --mandir="$D_MANDIR" \ + --infodir="$D_INFODIR" \ + \ + CC="$P_CC" \ + CFLAGS="$P_CFLAGS" \ + \ + --enable-dependency-tracking=yes \ + \ + --with-runstatedir="$D_RUNDIR" \ + --enable-silent-rules="$(bool_yes "$P_SILENT_RULES")" \ + --enable-static=no \ + --with-nft=/usr/sbin/nft \ + --with-iptables=/usr/sbin/iptables \ + --with-dhclient=yes \ + --with-dhcpcd=no \ + --with-dhcpcanon=no \ + --with-config-dhcp-default="$P_DHCP_DEFAULT" \ + --with-crypto="$P_CRYPTO" \ + $(args_enable "$P_SANITIZER" --with-address-sanitizer=exec "$( (bool "$P_FEDORA" || test "$P_RHEL" -ge 8) && echo --enable-undefined-sanitizer=yes || echo --enable-undefined-sanitizer=no)" ) \ + $(args_enable "$(bool_not_true "$P_SANITIZER")" --with-address-sanitizer=no --enable-undefined-sanitizer=no) \ + $(args_enable "$P_DEBUG" --enable-more-logging=yes --with-more-asserts=10000) \ + $(args_enable "$(bool_not_true "$P_DEBUG")" --enable-more-logging=no --with-more-asserts=0) \ + --enable-ld-gc=yes \ + "--$(bool_enable "$P_LTO")-lto" \ + --with-libaudit=yes-disabled-by-default \ + --with-modem-manager-1="$(bool_yes "$P_MODEM_MANAGER_1")" \ + $(args_enable "$P_WIFI" --enable-wifi=yes --with-wext="$(bool_yes "$P_FEDORA")") \ + $(args_enable "$(bool_not_true "$P_WIFI")" --enable-wifi=no) \ + --with-iwd="$(bool_yes "$P_IWD")" \ + --enable-bluez5-dun="$(bool_yes "$P_BLUETOOTH")" \ + --with-nmtui="$(bool_yes "$P_NMTUI")" \ + --with-nm-cloud-setup="$(bool_yes "$P_NM_CLOUD_SETUP")" \ + --enable-vala=yes \ + --enable-introspection=yes \ + --enable-gtk-doc="$(bool_yes "$P_REGEN_DOCS")" \ + --enable-teamdctl="$(bool_yes "$P_TEAM")" \ + --enable-ovs="$(bool_yes "$P_OVS")" \ + --with-selinux=yes \ + --enable-polkit=yes \ + --enable-modify-system=yes \ + --enable-concheck=yes \ + --with-libpsl="$(bool_yes "$P_FEDORA")" \ + --with-ebpf="$(bool_yes "$P_EBPF_ENABLED")" \ + --with-session-tracking=systemd \ + --with-suspend-resume=systemd \ + --with-system-ca-path=/etc/pki/tls/cert.pem \ + --with-dbus-sys-dir="$P_DBUS_SYS_DIR" \ + --with-tests=yes \ + --enable-more-warnings="$(bool "$P_TEST" && echo error || echo yes)" \ + --with-valgrind=no \ + --enable-ifcfg-rh=yes \ + --enable-ifupdown=no \ + $(args_enable "$P_PPP" --with-pppd-plugin-dir="$D_LIBDIR/pppd/$P_PPP_VERSION" --enable-ppp=yes) \ + --enable-firewalld-zone="$(bool_yes "$P_FIREWALLD_ZONE")" \ + --with-dist-version="$P_VERSION-$P_RELEASE" \ + $(args_enable "$P_CONFIG_PLUGINS_DEFAULT_IFCFG_RH" --with-config-plugins-default=ifcfg-rh) \ + --with-resolvconf=no \ + --with-netconfig=no \ + --with-config-dns-rc-manager-default="$P_DNS_RC_MANAGER_DEFAULT" \ + --with-config-logging-backend-default="$P_LOGGING_BACKEND_DEFAULT" \ + ; +fi