From 681db9d73975915c605f4b712fb856b841fa0b23 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 9 Sep 2023 12:01:38 +0000 Subject: ci/profiles: rewrite in Perl Reading os-release(5) is a bit more painful, now; and still requires using the shell. However, sharing code between *BSDs and being able to use v-strings for version comparisons is much easier. Test profiles for *BSDs are also trimmed down and more focused on portability stuff. --- ci/profiles.perl | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ci/profiles.sh | 98 -------------------------------------------------------- ci/run.sh | 2 +- 3 files changed, 98 insertions(+), 99 deletions(-) create mode 100755 ci/profiles.perl delete mode 100755 ci/profiles.sh (limited to 'ci') diff --git a/ci/profiles.perl b/ci/profiles.perl new file mode 100755 index 00000000..3d67143a --- /dev/null +++ b/ci/profiles.perl @@ -0,0 +1,97 @@ +# Copyright (C) all contributors +# License: AGPL-3.0+ +# Prints OS-specific package profiles to stdout (one per line) to use +# as command-line args for ci/deps.perl. Called automatically by ci/run.sh +eval 'exec perl -wS $0 ${1+"$@"}' # no shebang +if 0; # running under some shell +use v5.12; +our ($ID, $PRETTY_NAME, $VERSION_ID); # same vars as os-release(5) +my ($release, $version); # from uname +if ($^O eq 'linux') { # try using os-release(5) + for my $f (qw(/etc/os-release /usr/lib/os-release)) { + next unless -f $f; + my @echo = map { + qq{echo "\$"$_" = qq[\$$_];"; } + } qw(ID PRETTY_NAME VERSION_ID); + # rely on sh(1) to handle interpolation and such: + my $vars = `sh -c '. $f; @echo'`; + die "sh \$?=$?" if $?; + eval $vars; + die $@ if $@; + $VERSION_ID //= ''; + $ID //= ''; + if ($ID eq 'debian') { + if ($PRETTY_NAME =~ m!/sid\z!) { + $VERSION_ID = 'sid'; + } else { + open my $fh, '<', $f or die "open($f): $!"; + my $msg = do { local $/; <$fh> }; + die < $f <== +$msg +EOM + } + } + last if $ID ne '' && $VERSION_ID ne ''; + } + $ID = 'linux' if $ID eq ''; # cf. os-release(5) +} elsif ($^O =~ m!\A(?:free|net|open)bsd\z!) { # TODO: net? dragonfly? + $ID = $^O; + require POSIX; + (undef, undef, $release, $version) = POSIX::uname(); + $VERSION_ID = lc $release; + $VERSION_ID =~ s/[^0-9a-z\.\_\-]//sg; # cf. os-release(5) +} else { # only support POSIX-like and Free systems: + die "$^O unsupported"; +} +$VERSION_ID //= 0; # numeric? could be 'sid', actually... +my %MIN_VER = (freebsd => v11, openbsd => v7.3, netbsd => v9.3); + +if (defined(my $min_ver = $MIN_VER{$^O})) { + my $vstr = eval "v$VERSION_ID"; + die < -# License: AGPL-3.0+ - -# Prints OS-specific package profiles to stdout (one per line) to use -# as command-line args for ci/deps.perl. Called automatically by ci/run.sh - -# set by os-release(5) or similar -ID= VERSION_ID= -case $(uname -o 2>/dev/null || uname -s) in -GNU/Linux) - for f in /etc/os-release /usr/lib/os-release - do - test -f $f || continue - . $f - - # Debian sid (and testing) have no VERSION_ID - case $ID--$VERSION_ID in - debian--) - case $PRETTY_NAME in - */sid) VERSION_ID=sid ;; - *) - echo >&2 "$ID, but no VERSION_ID" - echo >&2 "==> $f <==" - cat >&2 $f - exit 1 - ;; - esac - ;; - esac - - case $ID--$VERSION_ID in - *--|--*) continue ;; - *) break ;; - esac - done - ;; -FreeBSD) - ID=freebsd - VERSION_ID=$(uname -r | cut -d . -f 1) - test "$VERSION_ID" -lt 11 && { - echo >&2 "ID=$ID $(uname -r) too old to support"; - exit 1 - } - ;; -OpenBSD) - ID=openbsd - VERSION_ID=$(uname -r | cut -d . -f 1) - test "$VERSION_ID" -lt 7 && { - echo >&2 "ID=$ID $(uname -r) too old to support"; - exit 1 - } - ;; -esac - -case $ID in -freebsd) PKG_FMT=pkg ;; -debian|ubuntu) PKG_FMT=deb ;; -centos|redhat|fedora) PKG_FMT=rpm ;; -openbsd) PKG_FMT=pkg_add ;; # unsure about name, but it's not FreeBSD `pkg' -*) echo >&2 "PKG_FMT undefined for ID=$ID in $0" -esac - -case $ID-$VERSION_ID in -freebsd-11|freebsd-12) sed "s/^/$PKG_FMT /" </dev/null)} -./ci/profiles.sh | while read args +$PERL -w ci/profiles.perl | while read args do $DO $SUDO $PERL -w ci/deps.perl $args $DO $PERL Makefile.PL -- cgit v1.2.3-24-ge0c7