summaryrefslogtreecommitdiff
path: root/pin-dependencies.PKGBUILDpatch
blob: a3ae3b53eaa067dcab1f9e8e0cef18db5658ca53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
if printf '%s\n' "${arch[@]}" | grep -qvxF any; then
  if ! _errors=$(
    diff <(
      {
        find "${pkgdir}" -type f -exec objdump -x {} \; 2>/dev/null \
        | sed '
          s/^\s*NEEDED\s\+\(\S\+\.so\)\(\.\S\+\)\?\s*$/\1/
          t
          d
        ' \
        | sort -u \
        | while read -r _lib; do
          for _libdir in {${pkgdir},}/usr/lib*; do
            [ -d "${_libdir}" ] || continue
            [ -e "${_libdir}/${_lib}" ] \
            && printf '%s\n' "${_lib}"
          done
        done \
        | sort -u
        for _libdir in "${pkgdir}/usr"/lib*; do
          [ -d "${_libdir}" ] || continue
          find "${_libdir}" -not -type d -name '*.so' -printf '%f\n%f\n'
        done
      } \
      | sort \
      | uniq -u \
      | while read -r _lib; do
        if ! _pkg=$(
          pacman -Qqo "/usr/lib/${_lib}" 2>/dev/null
        ); then
          >&2 printf 'WARNING: noone owns "%s"\n' "${_lib}"
          printf '%s\n' "${_lib}"
          continue
        fi
        if pacman -Qi "${_pkg}" \
        | sed '
          :a
            $! N
            s/\n\s\+/  /
            ta
          P
          D
        ' \
        | sed -n '
          s/^Provides\s*:\s*//
          T
          y/ /\n/
          p
        ' \
        | sed -n '
          /^$/d
          s/=.*$//
          T
          /\.so$/p
        ' \
        | grep -qxF "${_lib}"; then
          printf '%s\n' "${_lib}"
        else
          printf '%s\n' "${_pkg}"
        fi
      done \
      | sed '
        s/[<>]\?=.*$//
        /^$/d
      ' \
      | sort -u
    ) <(
      eval 'printf '"'"'%s\n'"'"' "${_pinned_dependencies[@]}" "${_pinned_dependencies_'"${CARCH}"'[@]}"' \
      | sed '
        s/[<>]\?=.*$//
        /^$/d
      ' \
      | sort -u
    )
  ); then
    printf 'There are discrepancies between the _pinned_dependencies and the linked libraries in %s'"'"'s %s():\n' \
      "${pkgbase:-${pkgname}}" \
      "${FUNCNAME[1]}"
    printf '%s\n' "${_errors}" \
    | sed '
      s/^</actual  /
      t
      s/^>/claimed /
      t
      d
    ' \
    | sort -k1,1
    return 1
  fi
fi