Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-ports-gnome
Path: blob/main/Mk/Scripts/do-depends.sh
16124 views
1
#!/bin/sh
2
#
3
# MAINTAINER: [email protected]
4
5
set -e
6
set -o pipefail
7
8
. ${dp_SCRIPTSDIR}/functions.sh
9
10
validate_env dp_RAWDEPENDS dp_DEPTYPE dp_DEPENDS_TARGET dp_DEPENDS_PRECLEAN \
11
dp_DEPENDS_CLEAN dp_DEPENDS_ARGS dp_USE_PACKAGE_DEPENDS \
12
dp_USE_PACKAGE_DEPENDS_ONLY dp_PKG_ADD dp_PKG_INFO dp_WRKDIR \
13
dp_PKGNAME dp_STRICT_DEPENDS dp_LOCALBASE dp_LIB_DIRS dp_SH \
14
dp_SCRIPTSDIR PORTSDIR dp_MAKE dp_MAKEFLAGS dp_OVERLAYS
15
16
[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_DEPENDS}" ] && set -x
17
18
set -u
19
20
install_depends()
21
{
22
origin=$1
23
target=$2
24
depends_args=$3
25
if [ -z "${dp_USE_PACKAGE_DEPENDS}" -a -z "${dp_USE_PACKAGE_DEPENDS_ONLY}" ]; then
26
MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args}
27
return 0
28
fi
29
30
port_var_fetch "${origin}" "${depends_args}" \
31
PKGFILE pkgfile \
32
PKGBASE pkgbase
33
34
if [ -r "${pkgfile}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then
35
echo "===> Installing existing package ${pkgfile}"
36
if [ "${pkgbase}" = "pkg" ]; then
37
[ -d ${dp_WRKDIR} ] || mkdir -p ${dp_WRKDIR}
38
tar xf ${pkgfile} -C ${dp_WRKDIR} -s ",/.*/,,g" "*/pkg-static"
39
${dp_WRKDIR}/pkg-static add ${pkgfile}
40
rm -f ${dp_WRKDIR}/pkg-static
41
else
42
${dp_PKG_ADD} -A ${pkgfile}
43
fi
44
elif [ -n "${dp_USE_PACKAGE_DEPENDS_ONLY}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then
45
echo "===> ${dp_PKGNAME} depends on package: ${pkgfile} - not found" >&2
46
echo "===> USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source" >&2
47
exit 1
48
else
49
MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args}
50
fi
51
}
52
53
find_package()
54
{
55
if ${dp_PKG_INFO} "$1" >/dev/null 2>&1; then
56
echo "===> ${dp_PKGNAME} depends on package: $1 - found"
57
return 0
58
fi
59
echo "===> ${dp_PKGNAME} depends on package: $1 - not found"
60
return 1
61
}
62
63
find_file()
64
{
65
if [ -e "$1" ]; then
66
echo "===> ${dp_PKGNAME} depends on file: $1 - found"
67
return 0
68
fi
69
echo "===> ${dp_PKGNAME} depends on file: $1 - not found"
70
return 1
71
}
72
73
find_file_path()
74
{
75
if which -s $1 ; then
76
echo "===> ${dp_PKGNAME} depends on executable: $1 - found"
77
return 0
78
fi
79
echo "===> ${dp_PKGNAME} depends on executable: $1 - not found"
80
return 1
81
}
82
83
find_lib()
84
{
85
echo -n "===> ${dp_PKGNAME} depends on shared library: $1"
86
libfile=$(env -i PATH="${PATH}" LIB_DIRS="${dp_LIB_DIRS}" LOCALBASE="${dp_LOCALBASE}" ${dp_SH} ${dp_SCRIPTSDIR}/find-lib.sh $1)
87
if [ -z "${libfile}" ]; then
88
echo " - not found"
89
return 1
90
fi
91
echo " - found (${libfile})"
92
}
93
94
anynotfound=0
95
err=0
96
for _line in ${dp_RAWDEPENDS} ; do
97
# ensure we never leak flavors
98
unset FLAVOR
99
myifs=${IFS}
100
IFS=:
101
set -- ${_line}
102
IFS=${myifs}
103
if [ $# -lt 2 -o $# -gt 3 ]; then
104
echo "Error: bad dependency syntax in ${dp_DEPTYPE}" >&2
105
echo "expecting: pattern:origin[@flavour][:target]" >&2
106
echo "got: ${_line}" >&2
107
err=1
108
continue
109
fi
110
pattern=$1
111
origin=$2
112
last=${3:-}
113
114
if [ -z "${pattern}" ]; then
115
echo "Error: there is an empty port dependency in ${dp_DEPTYPE}" >&2
116
err=1
117
continue
118
fi
119
120
if [ -z "${origin}" ]; then
121
echo "Error: a dependency has an empty origin in ${dp_DEPTYPE}" >&2
122
err=1
123
continue
124
fi
125
126
case "${origin}" in
127
*@*/*) ;; # Ignore @ in the path which would not be a flavor
128
*@*)
129
export FLAVOR="${origin##*@}"
130
origin=${origin%@*}
131
;;
132
esac
133
134
case "${origin}" in
135
/*) ;;
136
*)
137
for overlay in ${dp_OVERLAYS} ${PORTSDIR}; do
138
orig="${overlay}/${origin}"
139
if [ -f "${orig}/Makefile" ]; then
140
break
141
fi
142
done
143
origin="${orig}"
144
;;
145
esac
146
147
depends_args="${dp_DEPENDS_ARGS}"
148
target=${dp_DEPENDS_TARGET}
149
if [ -n "${last}" ]; then
150
# In case we depend on the fetch stage, actually run checksum,
151
# this prevent a MITM attack.
152
if [ "${last}" = "fetch" ]; then
153
target=checksum
154
else
155
target=${last}
156
fi
157
if [ -n "${dp_DEPENDS_PRECLEAN}" ]; then
158
target="clean ${target}"
159
depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes"
160
fi
161
if [ -n "${dp_DEPENDS_CLEAN}" ]; then
162
target="${target} clean"
163
depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes"
164
fi
165
fi
166
167
case ${dp_DEPTYPE} in
168
LIB_DEPENDS)
169
case ${pattern} in
170
lib*.so*) fct=find_lib ;;
171
*)
172
echo "Error: pattern ${pattern} in LIB_DEPENDS is not valid"
173
err=1
174
continue
175
;;
176
esac ;;
177
*)
178
case ${pattern} in
179
*\>*|*\<*|*=*) fct=find_package ;;
180
/nonexistent) fct=false ;;
181
/*) fct=find_file ;;
182
*) fct=find_file_path ;;
183
esac ;;
184
esac
185
if ${fct} "${pattern}" ; then
186
continue
187
fi
188
[ ${pattern} = "/nonexistent" ] || anynotfound=1
189
190
if [ ! -f "${origin}/Makefile" ]; then
191
echo "Error a dependency refers to a non existing origin: ${origin} in ${dp_DEPTYPE}" >&2
192
err=1
193
continue
194
fi
195
196
# Now actually install the dependencies
197
install_depends "${origin}" "${target}" "${depends_args}"
198
# Recheck if the installed dependency validates the pattern except for /nonexistent
199
[ "${fct}" = "false" ] || ${fct} "${pattern}"
200
echo "===> Returning to build of ${dp_PKGNAME}"
201
done
202
203
if [ $err -eq 1 ]; then
204
echo "Errors with dependencies."
205
exit 1
206
fi
207
208
if [ -n "${dp_STRICT_DEPENDS}" -a ${anynotfound} -eq 1 ]; then \
209
echo "===> STRICT_DEPENDS set - Not installing missing dependencies."
210
echo " This means a dependency is wrong since it was not satisfied in the ${dp_DEPTYPE} phase."
211
exit 1
212
fi
213
214