linux-qubasis

linux oasis port as a qubes template

git clone https://9o.is/git/linux-qubasis.git

commit a65d724d8b8b6176973668f7cef46f4f8911f777
parent f3c323de2b452f70f9996fe25fe158a8e16feea2
Author: Jul <jul@9o.is>
Date:   Tue, 26 Aug 2025 23:10:37 +0800

implement fspec

Diffstat:
Mconfig.def.sh | 4+---
Aninja/fspec.sh | 28++++++++++++++++++++++++++++
Mninja/functions.sh | 121++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Mninja/rules.ninja | 13+++++++++++++
Mpkg/abduco/gen.sh | 2++
Mpkg/b3sum/gen.sh | 1+
Mpkg/fspec-sync/gen.sh | 4++++
Mpkg/less/gen.sh | 3++-
Mpkg/mandoc/gen.sh | 11++++++-----
Mpkg/netbsd-curses/gen.sh | 8+++++++-
Mpkg/oksh/gen.sh | 3++-
Mpkg/sbase/gen.sh | 1+
Mscript/chroot | 11+++++++++--
Mtpl/example/gen.sh | 240++++++-------------------------------------------------------------------------
14 files changed, 189 insertions(+), 261 deletions(-)

diff --git a/config.def.sh b/config.def.sh @@ -1,5 +1,5 @@ PREFIX= -MANDIR=${PREFIX}share/man +MANDIR=${PREFIX}/share/man BUILDDIR='out' GZMAN=true @@ -11,5 +11,3 @@ TARGET_LDFLAGS='-s -static-pie' HOST_CFLAGS='-O2 -pipe' HOST_LDFLAGS= - -NINJA_CMD=samu diff --git a/ninja/fspec.sh b/ninja/fspec.sh @@ -0,0 +1,28 @@ +set -eu + +out="$1" +path="$2" +type="$3" +mode="$4" +src="${5-}" + +case $type in + reg) + printf '%s\ntype=reg\nmode=%s\nsource=%s\n\n' \ + "$path" "$mode" "$src" > $out.tmp + out/pkg/fspec-sync/host/fspec-hash <$out.tmp > $out + rm -f $out.tmp + ;; + sym) + printf '%s\ntype=sym\nmode=%s\ntarget=%s\n\n' \ + "$path" "$mode" "$src" > $out + ;; + dir) + printf '%s\ntype=dir\nmode=%s\n\n' \ + "$path" "$mode" > $out + ;; + *) + printf "error: unknown fspec type '$type'" >&2 + exit 1 + ;; +esac diff --git a/ninja/functions.sh b/ninja/functions.sh @@ -46,7 +46,7 @@ gzip() { local src="$1" local out="${2-$src}" - _ninja_prefix out '$outdir' "$out.gz" + _ninja_prefix out '$outdir' "$out" _ninja_prefix src '$srcdir' $src _ninja_sync $src @@ -55,15 +55,28 @@ gzip() { build gzip "$out" "$src" } -sym() { - local out="$1" - local src="$2" +bin() { + local src="$1" + _ninja_file /bin/$src reg 0755 $src +} - _ninja_prefix out '$outdir' $out - _ninja_prefix src '$outdir' $src - _ninja_build $out +dir() { + local path="$1" + local mode="${2-0755}" + _ninja_file $path dir $mode +} - build sym "$out" "$src" +sym() { + local target="$1" + local path="$2" + _ninja_file $path sym 0777 $target +} + +reg() { + local src="$1" + local path="$2" + local mode="${3-0644}" + _ninja_file $path reg $mode $src } man() { @@ -73,13 +86,18 @@ man() { if [ "$sec" ]; then out="${out%.*}.$sec" + else + sec="${src##*.}" fi if [ "$GZMAN" = 'true' ]; then + out="$out.gz" gzip $src $out else copy $src $out fi + + _ninja_file $MANDIR/man$sec/$out reg 0644 $out } compile() { @@ -117,6 +135,7 @@ lib() { _ninja_prefix out '$outdir' $out _ninja_prefix srcs '$srcdir' $srcs _ninja_sync $srcs + _ninja_build $out _ninja_buffer_lib="$out $srcs" } @@ -134,24 +153,14 @@ headers() { pkg() { local name="$1"; shift - local src="${1-}"; shift - local out="${1-}"; shift - while :; do - _ninja_prefix src $pkgdir $name/$src - _ninja_prefix out $rootdir $out - - build copy "$out" "$src" - _ninja_build $out - - src="${1-}" - out="${2-}" + if [ ! "$*" ]; then + _ninja_buffer_pkg="$_ninja_buffer_pkg $pkgdir/$name/fspec/ALL" + return + fi - if [ "$src" ] && [ "$out" ]; then - shift 2 - else - break - fi + for fspec in $*; do + _ninja_buffer_pkg="$_ninja_buffer_pkg $pkgdir/$name/fspec/$fspec" done } @@ -263,6 +272,8 @@ _ninja_initglobals() { _ninja_buffer_deps= _ninja_buffer_headers= _ninja_buffer_sync= + _ninja_buffer_files= + _ninja_buffer_pkg= } _ninja_setv_init() { @@ -363,6 +374,15 @@ _ninja_compile() { done } +_ninja_file() { + local path="$PREFIX$1" + local type="${2}" + local mode="${3}" + local src="${4-}" + + _ninja_buffer_files="$_ninja_buffer_files$path $type $mode $src\n" +} + _ninja_flush_exe() { if [ ! "$_ninja_buffer_exe" ]; then return @@ -432,7 +452,7 @@ _ninja_flush_builds() { done build phony $gendir/configure$_ninja_sub $ninjadir/$_ninja_file - build phony $gendir/build$_ninja_sub "$_ninja_buffer_builds" "$subbuilds" + build phony $gendir/build$_ninja_sub "$_ninja_buffer_builds" "$subbuilds" $outdir/meta/version _ninja_buffer_subgen= _ninja_buffer_builds= @@ -482,6 +502,55 @@ _ninja_flush_headers() { _ninja_buffer_headers= } +_ninja_flush_files() { + if [ ! "$_ninja_buffer_files" ]; then + build touch $outdir/fspec/ALL + return + fi + + local fspecs=$(printf "$_ninja_buffer_files" | while read -r line; do + set -- $line + path="$1" + type="$2" + mode="$3" + src="${4-}" + + out="$outdir/fspec/${path##*/}" + dep='| $basedir/ninja/fspec.sh $pkgdir/fspec-sync/host/fspec-hash' + + if [ "$type" = 'reg' ]; then + build fspec $out $outdir/${path##*/} $dep + else + build fspec $out $dep + fi + + bind path $path + bind type $type + bind mode $mode + + if [ "$type" = 'sym' ]; then + bind target $src + fi + + printf "$out " + done) + + build cat $outdir/fspec/ALL $fspecs + + _ninja_buffer_files= +} + +_ninja_flush_pkg() { + if [ ! "$_ninja_buffer_pkg" ]; then + return + fi + + build cat $outdir/fspec/ALL_TEMPLATE $outdir/fspec/ALL $_ninja_buffer_pkg + build fspec-tar $outdir/rootfs.tar.zst $outdir/fspec/ALL_TEMPLATE + + _ninja_buffer_pkg= +} + _ninja_flush() { _ninja_flush_lib _ninja_flush_exe @@ -489,6 +558,8 @@ _ninja_flush() { _ninja_flush_builds _ninja_flush_deps _ninja_flush_headers + _ninja_flush_files + _ninja_flush_pkg } _ninja_dedup() { diff --git a/ninja/rules.ninja b/ninja/rules.ninja @@ -33,6 +33,11 @@ rule sym rule touch command = touch $out + description = TOUCH $out + +rule cat + command = cat $in >$out + description = CAT $out rule gzip command = gzip -c -9 -n <$in >$out @@ -47,3 +52,11 @@ rule rsp description = RSP $out rspfile = $out.tmp rspfile_content = $in_newline + +rule fspec + command = cd $basedir && sh $basedir/ninja/fspec.sh $out $path $type $mode $in $target >/dev/null + description = FSPEC $out + +rule fspec-tar + command = $builddir/pkg/fspec-sync/host/fspec-tar <$in | zstd >$out + description = FSPEC-TAR $out diff --git a/pkg/abduco/gen.sh b/pkg/abduco/gen.sh @@ -7,4 +7,6 @@ cflags -std=c99 \ -Wno-unused-parameter exe abduco abduco.c + +bin abduco man abduco.1 diff --git a/pkg/b3sum/gen.sh b/pkg/b3sum/gen.sh @@ -33,4 +33,5 @@ lib libblake3.a blake3.c \ exe b3sum b3sum.c \ $outdir/libblake3.a +bin b3sum man b3sum.1 diff --git a/pkg/fspec-sync/gen.sh b/pkg/fspec-sync/gen.sh @@ -47,3 +47,7 @@ exe fspec-sort fspec-sort.c \ exe fspec-tar fspec-tar.c \ $outdir/libcommon.a + +bin fspec-hash +bin fspec-sort +bin fspec-tar diff --git a/pkg/less/gen.sh b/pkg/less/gen.sh @@ -62,7 +62,8 @@ exe lesskey lesskey.c \ $objdir/version.c.o \ $objdir/xbuf.c.o -sym more less +bin less +sym less /bin/more man less.nro 1 man lessecho.nro 1 man lesskey.nro 1 diff --git a/pkg/mandoc/gen.sh b/pkg/mandoc/gen.sh @@ -81,11 +81,12 @@ exe demandoc demandoc.c \ $outdir/libmandoc.a \ $pkgdir/zlib/libz.a -sym apropos mandoc -sym man mandoc -sym whatis mandoc -sym makewhatis mandoc - +bin mandoc +bin demandoc +sym mandoc /bin/apropos +sym mandoc /bin/man +sym mandoc /bin/whatis +sym mandoc /bin/makewhatis man mandoc.1 man demandoc.1 man man.1 diff --git a/pkg/netbsd-curses/gen.sh b/pkg/netbsd-curses/gen.sh @@ -202,7 +202,13 @@ exe tset usr.bin/tset/map.c \ usr.bin/tset/tset.c \ $outdir/libterminfo.a -sym reset tset +bin infocmp +bin tabs +bin tic +bin tput +bin tset +sym tset /bin/reset +reg terminfo /share/misc/terminfo man usr.bin/infocmp/infocmp.1 man usr.bin/tabs/tabs.1 man usr.bin/tic/tic.1 diff --git a/pkg/oksh/gen.sh b/pkg/oksh/gen.sh @@ -49,6 +49,7 @@ exe ksh alloc.c \ vi.c \ vis.c +bin ksh +sym ksh /bin/sh man sh.1 man ksh.1 -sym sh ksh diff --git a/pkg/sbase/gen.sh b/pkg/sbase/gen.sh @@ -82,6 +82,7 @@ deps $outdir/include/getconf.h exes() { for src in "$@"; do exe $src $src.c $outdir/libutil.a $outdir/libutf.a + bin $src man $src.1 done } diff --git a/script/chroot b/script/chroot @@ -11,7 +11,8 @@ cd $basedir template="tpl/$1" shell="$2" -rootdir=out/$template/root +outdir=out/$template +rootdir=$outdir/rootfs if [ ! -d "$basedir/$template" ]; then echo 'error: template does not exist' >&2 @@ -21,6 +22,7 @@ fi cleanup() { sudo umount $rootdir/dev sudo umount $rootdir/tmp + sudo rm -rf $rootdir } trap 'cleanup' EXIT ERR @@ -28,7 +30,12 @@ trap 'cleanup' EXIT ERR samu $template/configure samu $template/build -mkdir -p $rootdir/dev $rootdir/tmp +if [ -e $rootdir ]; then + rm -rf $rootdir +fi + +mkdir -p $rootdir +tar -I zstd -xf $outdir/rootfs.tar.zst -C $rootdir sudo mount --bind /dev $rootdir/dev sudo mount -t tmpfs tmpfs $rootdir/tmp diff --git a/tpl/example/gen.sh b/tpl/example/gen.sh @@ -1,225 +1,19 @@ +dir /dev +dir /tmp -pkg oksh ksh bin/ksh \ - sh bin/sh \ - ksh.1.gz $MANDIR/man1/ksh.1.gz \ - sh.1.gz $MANDIR/man1/sh.1.gz +pkg oksh +pkg sbase +pkg mandoc apropos \ + makewhatis \ + man \ + mandoc \ + whatis \ + apropos.1.gz \ + makewhatis.8.gz \ + man.1.gz \ + man.conf.5.gz \ + mandoc.1.gz \ + mandoc.db.5.gz -pkg sbase basename bin/basename \ - cal bin/cal \ - cat bin/cat \ - chgrp bin/chgrp \ - chmod bin/chmod \ - chown bin/chown \ - chroot bin/chroot \ - cksum bin/cksum \ - cmp bin/cmp \ - cols bin/cols \ - comm bin/comm \ - cp bin/cp \ - cron bin/cron \ - cut bin/cut \ - date bin/date \ - dd bin/dd \ - dirname bin/dirname \ - du bin/du \ - echo bin/echo \ - ed bin/ed \ - env bin/env \ - expand bin/expand \ - expr bin/expr \ - false bin/false \ - find bin/find \ - flock bin/flock \ - fold bin/fold \ - getconf bin/getconf \ - grep bin/grep \ - head bin/head \ - hostname bin/hostname \ - join bin/join \ - kill bin/kill \ - link bin/link \ - ln bin/ln \ - logger bin/logger \ - logname bin/logname \ - ls bin/ls \ - md5sum bin/md5sum \ - mkdir bin/mkdir \ - mkfifo bin/mkfifo \ - mknod bin/mknod \ - mktemp bin/mktemp \ - mv bin/mv \ - nice bin/nice \ - nl bin/nl \ - nohup bin/nohup \ - od bin/od \ - paste bin/paste \ - pathchk bin/pathchk \ - printenv bin/printenv \ - printf bin/printf \ - pwd bin/pwd \ - readlink bin/readlink \ - renice bin/renice \ - rev bin/rev \ - rm bin/rm \ - rmdir bin/rmdir \ - sed bin/sed \ - seq bin/seq \ - setsid bin/setsid \ - sha1sum bin/sha1sum \ - sha224sum bin/sha224sum \ - sha256sum bin/sha256sum \ - sha384sum bin/sha384sum \ - sha512sum bin/sha512sum \ - sha512-224sum bin/sha512-224sum \ - sha512-256sum bin/sha512-256sum \ - sleep bin/sleep \ - sort bin/sort \ - split bin/split \ - sponge bin/sponge \ - strings bin/strings \ - sync bin/sync \ - tail bin/tail \ - tar bin/tar \ - tee bin/tee \ - test bin/test \ - tftp bin/tftp \ - time bin/time \ - touch bin/touch \ - tr bin/tr \ - true bin/true \ - tsort bin/tsort \ - tty bin/tty \ - uname bin/uname \ - unexpand bin/unexpand \ - uniq bin/uniq \ - unlink bin/unlink \ - uudecode bin/uudecode \ - uuencode bin/uuencode \ - wc bin/wc \ - which bin/which \ - whoami bin/whoami \ - xargs bin/xargs \ - xinstall bin/xinstall \ - yes bin/yes \ - basename.1.gz $MANDIR/man1/basename.1.gz \ - cal.1.gz $MANDIR/man1/cal.1.gz \ - cat.1.gz $MANDIR/man1/cat.1.gz \ - chgrp.1.gz $MANDIR/man1/chgrp.1.gz \ - chmod.1.gz $MANDIR/man1/chmod.1.gz \ - chown.1.gz $MANDIR/man1/chown.1.gz \ - chroot.1.gz $MANDIR/man1/chroot.1.gz \ - cksum.1.gz $MANDIR/man1/cksum.1.gz \ - cmp.1.gz $MANDIR/man1/cmp.1.gz \ - cols.1.gz $MANDIR/man1/cols.1.gz \ - comm.1.gz $MANDIR/man1/comm.1.gz \ - cp.1.gz $MANDIR/man1/cp.1.gz \ - cron.1.gz $MANDIR/man1/cron.1.gz \ - cut.1.gz $MANDIR/man1/cut.1.gz \ - date.1.gz $MANDIR/man1/date.1.gz \ - dd.1.gz $MANDIR/man1/dd.1.gz \ - dirname.1.gz $MANDIR/man1/dirname.1.gz \ - du.1.gz $MANDIR/man1/du.1.gz \ - echo.1.gz $MANDIR/man1/echo.1.gz \ - ed.1.gz $MANDIR/man1/ed.1.gz \ - env.1.gz $MANDIR/man1/env.1.gz \ - expand.1.gz $MANDIR/man1/expand.1.gz \ - expr.1.gz $MANDIR/man1/expr.1.gz \ - false.1.gz $MANDIR/man1/false.1.gz \ - find.1.gz $MANDIR/man1/find.1.gz \ - flock.1.gz $MANDIR/man1/flock.1.gz \ - fold.1.gz $MANDIR/man1/fold.1.gz \ - getconf.1.gz $MANDIR/man1/getconf.1.gz \ - grep.1.gz $MANDIR/man1/grep.1.gz \ - head.1.gz $MANDIR/man1/head.1.gz \ - hostname.1.gz $MANDIR/man1/hostname.1.gz \ - join.1.gz $MANDIR/man1/join.1.gz \ - kill.1.gz $MANDIR/man1/kill.1.gz \ - link.1.gz $MANDIR/man1/link.1.gz \ - ln.1.gz $MANDIR/man1/ln.1.gz \ - logger.1.gz $MANDIR/man1/logger.1.gz \ - logname.1.gz $MANDIR/man1/logname.1.gz \ - ls.1.gz $MANDIR/man1/ls.1.gz \ - md5sum.1.gz $MANDIR/man1/md5sum.1.gz \ - mkdir.1.gz $MANDIR/man1/mkdir.1.gz \ - mkfifo.1.gz $MANDIR/man1/mkfifo.1.gz \ - mknod.1.gz $MANDIR/man1/mknod.1.gz \ - mktemp.1.gz $MANDIR/man1/mktemp.1.gz \ - mv.1.gz $MANDIR/man1/mv.1.gz \ - nice.1.gz $MANDIR/man1/nice.1.gz \ - nl.1.gz $MANDIR/man1/nl.1.gz \ - nohup.1.gz $MANDIR/man1/nohup.1.gz \ - od.1.gz $MANDIR/man1/od.1.gz \ - paste.1.gz $MANDIR/man1/paste.1.gz \ - pathchk.1.gz $MANDIR/man1/pathchk.1.gz \ - printenv.1.gz $MANDIR/man1/printenv.1.gz \ - printf.1.gz $MANDIR/man1/printf.1.gz \ - pwd.1.gz $MANDIR/man1/pwd.1.gz \ - readlink.1.gz $MANDIR/man1/readlink.1.gz \ - renice.1.gz $MANDIR/man1/renice.1.gz \ - rev.1.gz $MANDIR/man1/rev.1.gz \ - rm.1.gz $MANDIR/man1/rm.1.gz \ - rmdir.1.gz $MANDIR/man1/rmdir.1.gz \ - sed.1.gz $MANDIR/man1/sed.1.gz \ - seq.1.gz $MANDIR/man1/seq.1.gz \ - setsid.1.gz $MANDIR/man1/setsid.1.gz \ - sha1sum.1.gz $MANDIR/man1/sha1sum.1.gz \ - sha224sum.1.gz $MANDIR/man1/sha224sum.1.gz \ - sha256sum.1.gz $MANDIR/man1/sha256sum.1.gz \ - sha384sum.1.gz $MANDIR/man1/sha384sum.1.gz \ - sha512sum.1.gz $MANDIR/man1/sha512sum.1.gz \ - sha512-224sum.1.gz $MANDIR/man1/sha512-224sum.1.gz \ - sha512-256sum.1.gz $MANDIR/man1/sha512-256sum.1.gz \ - sleep.1.gz $MANDIR/man1/sleep.1.gz \ - sort.1.gz $MANDIR/man1/sort.1.gz \ - split.1.gz $MANDIR/man1/split.1.gz \ - sponge.1.gz $MANDIR/man1/sponge.1.gz \ - strings.1.gz $MANDIR/man1/strings.1.gz \ - sync.1.gz $MANDIR/man1/sync.1.gz \ - tail.1.gz $MANDIR/man1/tail.1.gz \ - tar.1.gz $MANDIR/man1/tar.1.gz \ - tee.1.gz $MANDIR/man1/tee.1.gz \ - test.1.gz $MANDIR/man1/test.1.gz \ - tftp.1.gz $MANDIR/man1/tftp.1.gz \ - time.1.gz $MANDIR/man1/time.1.gz \ - touch.1.gz $MANDIR/man1/touch.1.gz \ - tr.1.gz $MANDIR/man1/tr.1.gz \ - true.1.gz $MANDIR/man1/true.1.gz \ - tsort.1.gz $MANDIR/man1/tsort.1.gz \ - tty.1.gz $MANDIR/man1/tty.1.gz \ - uname.1.gz $MANDIR/man1/uname.1.gz \ - unexpand.1.gz $MANDIR/man1/unexpand.1.gz \ - uniq.1.gz $MANDIR/man1/uniq.1.gz \ - unlink.1.gz $MANDIR/man1/unlink.1.gz \ - uudecode.1.gz $MANDIR/man1/uudecode.1.gz \ - uuencode.1.gz $MANDIR/man1/uuencode.1.gz \ - wc.1.gz $MANDIR/man1/wc.1.gz \ - which.1.gz $MANDIR/man1/which.1.gz \ - whoami.1.gz $MANDIR/man1/whoami.1.gz \ - xargs.1.gz $MANDIR/man1/xargs.1.gz \ - xinstall.1.gz $MANDIR/man1/xinstall.1.gz \ - yes.1.gz $MANDIR/man1/yes.1.gz - -pkg mandoc apropos bin/apropos \ - demandoc bin/demandoc \ - makewhatis bin/makewhatis \ - man bin/man \ - mandoc bin/mandoc \ - whatis bin/whatis \ - apropos.1.gz $MANDIR/man1/apropos.1.gz \ - demandoc.1.gz $MANDIR/man1/demandoc.1.gz \ - eqn.7.gz $MANDIR/man7/eqn.7.gz \ - makewhatis.8.gz $MANDIR/man8/makewhatis.8.gz \ - man.1.gz $MANDIR/man1/man.1.gz \ - man.7.gz $MANDIR/man7/man.7.gz \ - man.conf.5.gz $MANDIR/man5/man.conf.5.gz \ - mandoc.1.gz $MANDIR/man1/mandoc.1.gz \ - mandoc.db.5.gz $MANDIR/man5/mandoc.db.5.gz \ - mandoc_char.7.gz $MANDIR/man7/mandoc_char.7.gz \ - mdoc.7.gz $MANDIR/man7/mdoc.7.gz \ - roff.7.gz $MANDIR/man7/roff.7.gz \ - tbl.7.gz $MANDIR/man7/tbl.7.gz - -pkg netbsd-curses terminfo share/misc/terminfo - -pkg less less bin/less \ - less.1.gz $MANDIR/man1/less.1.gz +pkg netbsd-curses terminfo +pkg less less less.1.gz