aboutsummaryrefslogtreecommitdiffstats
path: root/Mk/Scripts/depends-list.sh
blob: 843bedd03958311f0c4149b48e1a5a33fbc29cee (plain) (blame)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/sh
# MAINTAINER: portmgr@FreeBSD.org
# $FreeBSD$

set -e

. ${dp_SCRIPTSDIR}/functions.sh

flavors=0
recursive=0
missing=0
requires_wrkdir=0
while getopts "fmrw" FLAG; do
    case "${FLAG}" in
        f)
            flavors=1
            ;;
        m)
            missing=1
            recursive=1
            ;;
        r)
            recursive=1
            ;;
        w)
            # Only list dependencies that have a WRKDIR.  Used for
            # 'make clean-depends'.
            # Without -r recurse when WRKDIR exists; with -r
            # always recurse.
            requires_wrkdir=1
            ;;
        *)
            echo "Unknown flag" >&2
            exit 1
            ;;
    esac
done
shift $((OPTIND-1))

validate_env PORTSDIR dp_OVERLAYS dp_PKGNAME
if [ ${recursive} -eq 1 -o ${requires_wrkdir} -eq 1 ]; then
    validate_env dp_MAKE
    # Cache command executions to avoid looking them up again in every
    # sub-make.
    MAKE="${dp_MAKE}" export_ports_env >/dev/null
fi

[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DEPENDS_LIST}" ] && set -x

set -u

if [ ${missing} -eq 1 ]; then
    existing=$(${dp_PKG_INFO} -aoq|paste -d ' ' -s -)
fi

check_dep() {
    local _dep wrkdir show_dep

    for _dep ; do
        unset FLAVOR
        myifs=${IFS}
        IFS=:
        set -- ${_dep}
        IFS=${myifs}

        case "${2}" in
        /*) d=${2} ;;
        *) for overlay in ${dp_OVERLAYS} ${PORTSDIR}; do
            d=${overlay}/${2}
            f=
            case "${d}" in
            *@*/*) ;; # Ignore @ in the path which would not be a flavor
            *@*)
                f=${d##*@}
                d=${d%@*}
                ;;
            esac
            if [ -f ${d}/Makefile ]; then
                if [ -n $f ]; then
                    export FLAVOR=$f
                fi
                break
            fi
        done
        esac

        if [ ${flavors} -eq 1 -a -n "${FLAVOR:-}" ]; then
            port_display="${d}@${FLAVOR}"
        else
            port_display="${d}"
        fi

        case " ${checked} " in
            *\ ${d}\ *) continue ;; # Already checked
        esac
        checked="${checked} ${d}"
        # Check if the dependency actually exists or skip otherwise.
        if [ ! -d "${d}" ]; then
            echo "${dp_PKGNAME}: \"${port_display}\" non-existent -- dependency list incomplete" >&2
            continue
        fi

        # If only looking for missing, show if missing
        if [ ${missing} -eq 1 ]; then
            case " ${existing} " in
                *\ ${d#${PORTSDIR}/}\ *) continue ;; # We have it, nothing to see
            esac
        fi

        # Grab any needed vars from the port.

        if [ ${requires_wrkdir} -eq 1 ]; then
            # shellcheck disable=SC2046
            # We want word splitting here.
            set -- $(${dp_MAKE} -C ${d} -VWRKDIR -V_UNIFIED_DEPENDS)
            wrkdir="$1"
            shift
        elif [ ${recursive} -eq 1 ]; then
            # shellcheck disable=SC2046
            # We want word splitting here.
            set -- $(${dp_MAKE} -C ${d} -V_UNIFIED_DEPENDS)
        fi

        # If a WRKDIR is required to show the dependency, check for it.
        show_dep=1
        if [ ${requires_wrkdir} -eq 1 ] && ! [ -d "${wrkdir}" ]; then
            show_dep=0
        fi
        [ ${show_dep} -eq 1 ] && echo "${port_display}"
        if [ ${recursive} -eq 1 -o ${requires_wrkdir} -eq 1 -a ${show_dep} -eq 1 ]; then
            # shellcheck disable=SC2068
            # Do not add quotes, we want to split the string here.
            check_dep $@
        fi
    done
}

checked=
# shellcheck disable=SC2068
# Do not add quotes, we want to split the string here.
check_dep $@