linux-qubasis
linux oasis port as a qubes template
git clone https://9o.is/git/linux-qubasis.git
genfn.sh
(7466B)
1 pkg() {
2 subgen $1 init_pkg fini_pkg
3 }
4
5 init_pkg() {
6 FTCH=
7 OBJS=
8 HDRS=
9 SRCS=
10 DEPS=
11
12 var srcdir $dir/src
13 var libdir $outdir
14 var objdir $outdir/obj
15 var hdrdir $outdir/include
16 var datdir $outdir/share
17
18 unset -f host
19 init_files
20 }
21
22 fini_pkg() {
23 if command -v host >/dev/null 2>&1 && persist; then
24 pkgsub host init_host
25 fi
26
27 [ "$DEPS" ] && phony deps $DEPS
28 [ "$HDRS" ] && phony headers $HDRS
29
30 fetch_complete
31 fini_files
32 }
33
34 pkgsub() {
35 SRCS="$SRCS $(sub $1 ${2-init_pkgsub} ${3-fini_pkgsub})"
36 }
37
38 init_host() {
39 SRCS=
40 OBJS=
41 DEPS=
42
43 var tgtdir $outdir
44 var outdir $hostdir
45 var libdir $outdir
46 var hdrdir $outdir/include
47 var objdir $objdir/host
48 var ar ar
49 var as as
50 var cc cc
51 var ld ld
52 var objcopy objcopy
53 var cflags -O2 -pipe
54 var ldflags ''
55 }
56
57 init_pkgsub() {
58 OBJS=
59 SRCS=
60 var outdir $outdir/$1
61 var objdir $outdir/obj
62 var libdir $outdir
63 }
64
65 fini_pkgsub() {
66 echo $SRCS
67 }
68
69 build() {
70 _v1=$1
71 _v2=$2
72 shift 2
73
74 prefix _v2 $outdir $_v2
75 prefix _vs \$srcdir $*
76
77 for _v in $_vs; do
78 case $_v in
79 \$srcdir/*) SRCS="$SRCS $_v"
80 esac
81 done
82
83 build_parse $_vs
84 write "build $_v2: $_v1 $_vs $_vd $_vo"
85 }
86
87 cflags() {
88 var cflags '$cflags' "$*"
89 }
90
91 ldflags() {
92 var ldflags '$ldflags' "$*"
93 }
94
95 dep() {
96 _deps=
97 for _d in $*; do
98 case $_d in
99 *.c) prefix _d $outdir $_d;;
100 *.h) prefix _d $hdrdir $_d;;
101 */headers) prefix _d pkg $_d;;
102 esac
103 _deps="$_deps $_d"
104 done
105 DEPS="$DEPS $_deps"
106 }
107
108 bin() {
109 _m=0755
110
111 while [ ${1#-} != $1 ]; do
112 case $1 in
113 -m) _m=$2;;
114 esac
115 shift 2
116 done
117
118 exe $*
119 file reg $_m '$bindir'/$_out $OUTDIR/$_out
120 }
121
122 libexec() {
123 _p=
124
125 while [ ${1#-} != $1 ]; do
126 case $1 in
127 -p) _p=$2/;;
128 esac
129 shift 2
130 done
131
132 exe $*
133 file reg 0755 '$libexecdir'/$_p$_out $OUTDIR/$_out
134 }
135
136 exe() {
137 _out=$1
138 shift
139 compile $*
140
141 if [ ! "$_deps" ]; then
142 link $_out $_objs $_libs
143 else
144 _rspfile=$outdir/$_out.rsp
145
146 awk $_rspfile $_deps '|' ./pkg/rsp.awk
147 bind expr '-f ./pkg/rsp.awk'
148
149 link $_out $_objs $_libs '|' $_rspfile
150 bind ldlibs @$_rspfile
151 fi
152 }
153
154 lib() {
155 _out=$1
156 shift
157 compile $*
158
159 ar $libdir/$_out $_objs
160 rsp $libdir/$_out.d $libdir/$_out $_rsps
161
162 file reg 0644 '$libdir'/$_out $OUTDIR/$_out
163 }
164
165 compile() {
166 _cflags=
167 _src_prefix=
168
169 _srcs=
170 _objs=
171 _libs=
172 _deps=
173 _hdrs=
174 _rsps=
175
176 while [ $# -gt 0 ] && [ "${1#-}" != "$1" ]; do
177 case $1 in
178 -I*|-W*|-D*|-p*|-m*)
179 _cflags="$_cflags $1"
180 shift
181 ;;
182 -iquote|-include|-isystem)
183 _cflags="$_cflags $1 $2"
184 shift 2
185 ;;
186 --src-prefix)
187 _src_prefix=$2/
188 shift 2
189 ;;
190 -*)
191 error unknown compiler flag $1
192 ;;
193 esac
194 done
195
196 for _src in $*; do
197 case $_src in
198 \$*.[cS]) _srcs="$_srcs $_src";;
199 *.[cS]) _srcs="$_srcs $_src_prefix$_src";;
200 *.o) _objs="$_objs $_src";;
201 *.h) _hdrs="$_hdrs $_src";;
202 *.a) _libs="$_libs $_src"
203 _rsps="$_rsps $_src";;
204 *.a.d) _deps="$_deps $_src"
205 _rsps="$_rsps $_src";;
206 *) error unknown file to compile: $_src;;
207 esac
208 done
209
210 prefix _srcs $srcdir $_srcs
211 prefix _hdrs $hdrdir $_hdrs
212 prefix _objs $objdir $_objs
213 prefix _libs $libdir $_libs
214 prefix _deps $libdir $_deps
215 prefix _rsps $libdir $_rsps
216
217 for _src in $_srcs; do
218 _obj=$objdir/${_src#\$*/}.o
219
220 if has $_obj $OBJS; then
221 _objs="$_objs $_obj"
222 continue
223 fi
224
225 [ "$DEPS" ] && _src="$_src || $dir/deps"
226 [ "$_hdrs" ] && _src="$_src || $_hdrs"
227
228 cc $_obj $_src
229 _objs="$_objs $_obj"
230 OBJS="$OBJS $_obj"
231
232 if [ "$_cflags" ]; then
233 bind cflags $cflags $_cflags
234 fi
235 done
236 }
237
238 binfiles() {
239 files --prefix binfiles $*
240 for _file in $_files; do
241 _out=${_file#*/}
242 file reg 0755 '$bindir'/${_out#binfiles/} $OUTDIR/$_out
243 done
244 }
245
246 libfiles() {
247 files $*
248 for _file in $_files; do
249 _out=${_file#*/}
250 file reg 0644 '$libdir'/$_out $OUTDIR/$_out
251 done
252 }
253
254 share() {
255 files --prefix $datdir $*
256
257 for _file in $_files; do
258 _out=${_file#*/}
259 file reg 0644 '$datadir'/$_out $OUTDIR/share/$_out
260 done
261 }
262
263 include() {
264 files --prefix $hdrdir $*
265
266 for _file in $_files; do
267 _out=${_file#*/}
268 file reg 0644 '$includedir'/$_out $OUTDIR/include/$_out
269 HDRS="$HDRS $_file"
270 done
271 }
272
273 files() {
274 _prefix=$outdir
275 _src_prefix=$srcdir
276 _keep_path=false
277
278 while [ $# -gt 0 ]; do
279 case "$1" in
280 --keep-path)
281 _keep_path=true
282 shift
283 ;;
284 --prefix)
285 case $2 in
286 \$*) _prefix=$2;;
287 *) _prefix=$_prefix/$2;;
288 esac
289 shift 2
290 ;;
291 --src-prefix)
292 case $2 in
293 \$*) _src_prefix=$2;;
294 *) _src_prefix=$_src_prefix/$2;;
295 esac
296 shift 2
297 ;;
298 *)
299 break
300 ;;
301 esac
302 done
303
304 prefix _srcs $_src_prefix $*
305 _files=
306
307 for _src in $_srcs; do
308 case $_src in
309 $_prefix/*) _out=$_src;;
310 $srcdir/*|$outdir/*|$dir/*)
311 $_keep_path && _prefix_src=${_src#$_src_prefix/} || _prefix_src=${_src##*/}
312 prefix _out $_prefix $_prefix_src
313 copy $_out $_src
314 ;;
315 *) error files cannot handle $_src;;
316 esac
317 _files="$_files $_out"
318 done
319 }
320
321 git() {
322 [ ! "${1-}" ] && error missing git ref || _ref=$1
323 fetch_git ${_ref}_fetched
324 bind ref $_ref
325 FTCH="$FTCH $outdir/${_ref}_fetched"
326 }
327
328 curl() {
329 _replstr=',^[^/]*,$srcdir,'
330
331 while [ $# -gt 0 ] && [ ${1#--} != $1 ]; do
332 case $1 in
333 --replstr) _replstr="$2";;
334 *) error unknown curl flag $1;;
335 esac
336 shift 2
337 done
338
339 [ ! "${1-}" ] && error missing curl url || _url=$1
340 [ ! "${2-}" ] && error missing curl sha256sum || _sha=$2
341 shift 2
342
343 _srcs=$*
344 _name=${_url##*/}
345
346 fetch_curl $_name
347 bind url $_url
348
349 sha256sum ${_name}_checked $outdir/$_name
350 bind sha256 $_sha
351
352 case $_name in
353 *.tar.gz|*.tgz) _tool=gzip;;
354 *.tar.xz) _tool=xz;;
355 *.tar.bz2) _tool=bzip2;;
356 *) error unknown archive type $_name;;
357 esac
358
359 extract ${_name}_extracted $outdir/$_name '|' $outdir/${_name}_checked
360 bind tool $_tool
361 bind srcs $_srcs
362 bind replstr \"$_replstr\"
363
364 if ! grep -qE "^${DIR#./}/src$" .git/info/exclude; then
365 printf "%s/src\n" ${DIR#./} >> .git/info/exclude
366 fi
367
368 FTCH="$FTCH $outdir/${_name}_extracted"
369 }
370
371 fetch_complete() {
372 if [ ! "$FTCH" ]; then
373 return
374 fi
375
376 _patches=
377 phony fetch $FTCH
378
379 if [ -d $DIR/patch ]; then
380 case "$FTCH" in
381 *extracted) _rule=git_apply;;
382 *) _rule=git_patch;;
383 esac
384
385 for _v in $DIR/patch/*.patch; do
386 _out=$outdir/${_v##*/}
387 _in=$dir/${_v#"$DIR"/}
388 $_rule $_out $_in '|' $dir/fetch $_patches
389 _patches="$_patches $_out"
390 done
391 fi
392
393 if [ "$SRCS" ]; then
394 phony "$(printf '%s\n' $SRCS | sort | uniq | xargs)" $dir/fetch "$_patches"
395 fi
396 }
397
398 man() {
399 _src=$1
400 _sec=${2-}
401 _out=${_src##*/}
402
403 if [ $_sec ]; then
404 _out=${_out%.*}.$_sec
405 else
406 _sec=${_out##*.}
407 fi
408
409 gzip $_out.gz $_src
410 file reg 0644 '$mandir'/man$_sec/$_out.gz $OUTDIR/$_out.gz
411 }
412
413 sym() {
414 case ${1%%/*} in
415 bin) _prefix='$bindir';;
416 man) _prefix='$mandir';;
417 share) _prefix='$datadir';;
418 *) error sym cannot handles prefix $_prefix;;
419 esac
420
421 file sym 0777 $_prefix/${1#*/} $2
422 }
423
424 file() {
425 if persist; then
426 printf '%s\n' "$*" >> $DIR/files.tmp
427 fi
428 }
429
430 init_files() {
431 if persist && [ -e $DIR/files.tmp ]; then
432 rm -f $DIR/files.tmp
433 fi
434 }
435
436 fini_files() {
437 _f=$DIR/files
438 if persist && [ -e $_f.tmp ]; then
439 if cmp -s $_f.tmp $_f; then
440 rm -f $_f.tmp
441 else
442 mv $_f.tmp $_f
443 fi
444 GEN_OUTS="$GEN_OUTS $DIR/files"
445 fi
446 }
447
448 waylandproto() {
449 _proto=$1
450 shift 1
451
452 while [ $# -gt 1 ]; do
453 wayland_proto $2 $_proto
454 case $1 in
455 --client) bind type client-header;;
456 --server) bind type server-header;;
457 --code)
458 bind type public-code
459 cc $outdir/$2.o $outdir/$2 '||' ./pkg/wayland/headers
460 bind cflags $cflags -isystem $pkgdir/wayland/include
461 ;;
462 *) error unknown waylandproto flag $1
463 esac
464 shift 2
465 done
466 }
467
468 has_video_driver() {
469 has $1 $VIDEO_DRIVERS
470 }