Marcel Telka
2024-04-03 72d66ff28ec33bc2c05b355c6218d98d13b79450
commit | author | age
32921b 1 #! /usr/bin/ksh
MT 2 #
3 #
4 # This file and its contents are supplied under the terms of the
5 # Common Development and Distribution License ("CDDL"), version 1.0.
6 # You may only use this file in accordance with the terms of version
7 # 1.0 of the CDDL.
8 #
9 # A full copy of the text of the CDDL should have accompanied this
10 # source.  A copy of the CDDL is also available via the Internet at
11 # http://www.illumos.org/license/CDDL.
12 #
13
14 #
15 # Copyright 2022 Marcel Telka
16 #
17
18 function usage
19 {
20     [[ -n "$1" ]] && printf "ERROR: %s\n\n" "$1"
8f1b0e 21     printf "Usage: perl-meta-deps WS_MACH BUILD_DIR [configure|build|test|runtime]... [suggests] PERL_VERSION\n" >&2
32921b 22     [[ -n "$1" ]] && exit 1
MT 23     exit 0
24 }
25
26
27 (($# == 0)) && usage
5d333c 28
MT 29 WS_MACH="$1"
30 [[ -d "$WS_MACH" ]] && shift || usage "WS_MACH does not exist"
32921b 31
MT 32 BUILD_DIR="$1"
33 [[ -d "$BUILD_DIR" ]] && shift || usage "BUILD_DIR does not exist"
34
4d1e46 35 PHASES=
MT 36 while true ; do
37     case "$1" in
38         configure|build|test|runtime)
39             PHASES="$PHASES,.$1" && shift ;;
40         *)    break ;;
41     esac
42 done
43 PHASES=${PHASES/#,}
44 [[ -z "$PHASES" ]] && PHASES=".configure,.build,.test,.runtime"
32921b 45
8f1b0e 46 RELATION=".requires,.recommends"
MT 47 [[ "$1" == "suggests" ]] && RELATION=".$1" && shift
48
32921b 49 (($# == 0)) && usage "PERL_VERSION missing"
MT 50 PERLVER=$1 && shift
51 PLV=${PERLVER//.}
52 PERL=/usr/perl5/$PERLVER/bin/perl
4d1e46 53 [[ -x "$PERL" ]] || usage "Perl $PERLVER not found"
32921b 54 PERL_ARCH=$($PERL -e 'use Config; print $Config{archname}')
MT 55
2f4546 56 (($# != 0)) && usage "Too many arguments"
32921b 57
MT 58 PERL_VERSION_CONVERT="$(dirname $0)/perl-version-convert"
59 [[ ! -x "$PERL_VERSION_CONVERT" ]] && printf "ERROR: perl-version-convert not found" && exit 1
60
5d333c 61 CACHEDIR="$WS_MACH/perl-meta-deps-cache"
MT 62 mkdir -p "$CACHEDIR"
63 # Remove old entries from the cache
64 find "$CACHEDIR" -type f -mtime +7 -exec rm -f {} \;
65
32921b 66
8f1b0e 67 /usr/bin/jq -r '.prereqs|'"$PHASES"'|'"$RELATION"'|to_entries?|.[]|.key+" "+(.value|tostring)' | while read PREREQ VERSION ; do
32921b 68     # Convert perl version number to pkg(5) compatible form
MT 69     VER=$("$PERL_VERSION_CONVERT" "$PREREQ" "$VERSION")
70     [[ "$VER" != "0" ]] && VER="@$VER" || VER=
71
372e47 72     CACHEFILE="$CACHEDIR/$PREREQ-$PERLVER"
MT 73
5d333c 74     # Resolve the dependency if not in cache already
8f1b0e 75     if [[ ! -e "$CACHEFILE" || ("$RELATION" != ".suggests" && ! -s "$CACHEFILE") ]] ; then
ded056 76         # We must replace '::' by '-' otherwise 'pkgdepend resolve' fails
372e47 77         MANIFEST="$BUILD_DIR/META-${PREREQ//::/-}-$PERLVER"
32921b 78
5d333c 79         # Prepare manifest
MT 80         if [[ "$PREREQ" == "perl" ]] ; then
81             # "perl" is special case
82             cat <<#EOF > "$MANIFEST"
83                 depend fmri=__TBD type=require pkg.debug.depend.file=$PREREQ \\
84                     pkg.debug.depend.path=usr/perl5/$PERLVER/bin
85             EOF
86         else
87             cat <<#EOF > "$MANIFEST"
88                 depend fmri=__TBD type=require pkg.debug.depend.file=${PREREQ//:://}.pm \\
89                     pkg.debug.depend.path=usr/perl5/$PERLVER/lib \\
90                     pkg.debug.depend.path=usr/perl5/$PERLVER/lib/$PERL_ARCH \\
91                     pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER \\
92                     pkg.debug.depend.path=usr/perl5/vendor_perl/$PERLVER/$PERL_ARCH
93             EOF
94         fi
95
96         # Resolve dependency
97         if /usr/bin/pkgdepend resolve "$MANIFEST" ; then
98             # Remove version number and cache the result
372e47 99             cat "$MANIFEST.res" | sed -e 's/@[^ ]*//g' -e 's/-'$PLV'/-$(PLV)/g' > "$CACHEFILE"
5d333c 100         else
8f1b0e 101             if [[ "$RELATION" != ".suggests" ]] ; then
MT 102                 printf "ERROR: Prerequisite %s not found\n" "$PREREQ" >&2
103                 cat "$MANIFEST"
104             fi
105             # Cache negative result
106             [[ ! -e "$CACHEFILE" ]] && > "$CACHEFILE"
5d333c 107         fi
32921b 108     fi
MT 109
8f1b0e 110     # Use cached result, add required version number and drop runtime/perl
MT 111     cat "$CACHEFILE" | sed -e 's/\(fmri=[^ ]*\)/\1'$VER'/g' -e '/fmri=pkg:\/runtime\/perl-\$(PLV)/d'
32921b 112 done | /usr/bin/pkgfmt -u | uniq | (
MT 113     PREV_LINE_H=
114     PREV_FMRI=
115     PREV_VER=
116     PREV_LINE_T=
117     while read LINE ; do
644544 118         # Copy verbatim lines without "fmri=pkg:" (e.g. unresolved lines)
MT 119         [[ "${LINE//*fmri=pkg:*/FMRI}" != "FMRI" ]] && printf "%s\n" "$LINE" && continue
32921b 120
MT 121         LINE_H=${LINE%%fmri=*}
122         LINE_T=${LINE#*fmri=}
123         FMRI=${LINE_T%% *}
124         LINE_T=${LINE_T#* }
125         [[ "$FMRI" == "$LINE_T" ]] && LINE_T=
126         VER=${FMRI##*@}
127         FMRI=${FMRI%%@*}
128         [[ "$FMRI" == "$VER" ]] && VER=
129         [[ -n "$VER" ]] && VER="@$VER"
130         FMRI="fmri=$FMRI"
5d333c 131
32921b 132         if [[ "$PREV_LINE_H" != "$LINE_H" || "$PREV_FMRI" != "$FMRI" || "$PREV_LINE_T" != "$LINE_T" ]] ; then
MT 133             [[ -n "$PREV_LINE_H$PREV_FMRI$PREV_VER$PREV_LINE_T" ]] && printf "%s%s%s%s\n" "$PREV_LINE_H" "$PREV_FMRI" "$PREV_VER" "$PREV_LINE_T"
134             PREV_LINE_H="$LINE_H"
135             PREV_FMRI="$FMRI"
136             PREV_VER="$VER"
137             PREV_LINE_T="$LINE_T"
138             continue
139         fi
140
141         # Select higher version
142         VER1=${PREV_VER#@}
143         VER2=${VER#@}
144         while true ; do
145             [[ -z "$VER1" ]] && PREV_VER="$VER" && break
146             [[ -z "$VER2" ]] && break
147
148             V1=${VER1%%.*} ; [[ "$V1" == "$VER1" ]] && VER1="$VER1."
149             V2=${VER2%%.*} ; [[ "$V2" == "$VER2" ]] && VER2="$VER2."
150
151             ((V1 < V2)) && PREV_VER="$VER" && break
152             ((V1 > V2)) && break
153
154             VER1=${VER1#*.}
155             VER2=${VER2#*.}
156         done
157     done
158     [[ -n "$PREV_LINE_H$PREV_FMRI$PREV_VER$PREV_LINE_T" ]] && printf "%s%s%s%s\n" "$PREV_LINE_H" "$PREV_FMRI" "$PREV_VER" "$PREV_LINE_T"
372e47 159 )
MT 160
161 exit 0