linux-qubasis

linux oasis port as a qubes template

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

commit c185f1c77c0d4d1e38296a4f874c47dc06ac8b17
parent dc2643760d489610b09b396530335b78b4d4e740
Author: Jul <jul@9o.is>
Date:   Mon, 17 Nov 2025 06:17:07 -0500

qubes fspec support with static pkg files

Diffstat:
Mgen.sh | 5+++++
Mpkg/gen.sh | 5-----
Apkg/netbsd-curses/files | 14++++++++++++++
Mpkg/netbsd-curses/gen.sh | 3+++
Aqubes/example/gen.sh | 6++++++
Aqubes/fspec.awk | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aqubes/gen.sh | 40++++++++++++++++++++++++++++++++++++++++
Aqubes/genfn.sh | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 195 insertions(+), 5 deletions(-)

diff --git a/gen.sh b/gen.sh @@ -6,11 +6,16 @@ var ninja_required_version 1.8 var builddir out var dir . var outdir $builddir +var hostdir $outdir/host rule gen './gen.sh $dir' bind description 'GEN $dir' bind generator 1 subgen pkg +subgen qubes phony build.ninja $dir/ninja +phony build qubes/build + +default build diff --git a/pkg/gen.sh b/pkg/gen.sh @@ -9,9 +9,7 @@ var ld $TARGET_ARCH-linux-musl-ld var objcopy $TARGET_ARCH-linux-musl-objcopy var cflags -Os -fPIE -pipe -Wall -Werror -Wextra -pedantic var ldflags -s -static-pie - var pkgdir $outdir -var hostdir $outdir/host rule cc '$cc -MD -MF $out.d $cflags -c -o $out $in' bind description 'CC $out' @@ -49,9 +47,6 @@ bind description 'CAT $out' rule sed 'sed $expr $in >$out' bind description 'SED $out' -rule touch 'touch $out' -bind description 'TOUCH $out' - rule fetch_git 'git submodule update --init --filter=blob:none $srcdir 1>/dev/null && git -C $srcdir checkout $ref 1>/dev/null 2>&1 && touch $out' bind description 'FETCH GIT $dir $ref' bind generator 1 diff --git a/pkg/netbsd-curses/files b/pkg/netbsd-curses/files @@ -0,0 +1,14 @@ +reg 0644 terminfo.cdb $datadir/misc +reg 0644 libcurses.a $libdir +reg 0644 libterminfo.a $libdir +reg 0755 infocmp $bindir +reg 0755 tabs $bindir +reg 0755 tic $bindir +reg 0755 tput $bindir +reg 0755 tset $bindir +sym tset $bindir/reset +reg 0644 infocmp.1.gz $mandir/man1 +reg 0644 tabs.1.gz $mandir/man1 +reg 0644 tic.1.gz $mandir/man1 +reg 0644 tput.1.gz $mandir/man1 +reg 0644 tset.1.gz $mandir/man1 diff --git a/pkg/netbsd-curses/gen.sh b/pkg/netbsd-curses/gen.sh @@ -43,6 +43,9 @@ tic $outdir/compiled_terms.c share/terminfo/terminfo bind ticflags -Sx bind terms dumb +tic terminfo.cdb share/terminfo/terminfo +bind ticflags -x + nbperf $outdir/hash.c lib/libterminfo/genhash lib/libterminfo/term.h nbperf $outdir/termcap_hash.c lib/libterminfo/genthash lib/libterminfo/termcap_map.c diff --git a/qubes/example/gen.sh b/qubes/example/gen.sh @@ -0,0 +1,6 @@ +var prefix /usr + +pkgexclude $libdir/.* +pkgexclude $includedir/.* + +pkg netbsd-curses diff --git a/qubes/fspec.awk b/qubes/fspec.awk @@ -0,0 +1,66 @@ +BEGIN { + gsub(/\//, "\\/", pkgexclude); +} + +function eval_path(path) { + gsub(/\$bindir/, bindir, path); + gsub(/\$datadir/, datadir, path); + gsub(/\$mandir/, mandir, path); + gsub(/\$sysconfdir/, sysconfdir, path); + gsub(/\$libdir/, libdir, path); + gsub(/\$libexecdir/, libexecdir, path); + gsub(/\$includedir/, includedir, path); + gsub(/\$statedir/, statedir, path); + + return path; +} + +function exclude(path) { + pattern = "^(" pkgexclude ")$" + return pkgexclude != "" && path ~ pattern +} + +$1 == "reg" { + filename = $3; + path = eval_path($4 "/" filename); + + if (exclude(path)) { + next + } + + print prefix path; + print "type=" $1; + print "mode=" $2; + print "source=" pkgpath "/" filename; + print ""; + print ""; +} + +$1 == "sym" { + path = eval_path($3); + + if (exclude(path)) { + next + } + + print prefix path; + print "type=" $1; + print "mode=0777"; + print "target=" $2; + print ""; + print ""; +} + +$1 == "dir" { + path = eval_path($3); + + if (exclude(path)) { + next + } + + print prefix path; + print "type=" $1; + print "mode=" $2; + print ""; + print ""; +} diff --git a/qubes/gen.sh b/qubes/gen.sh @@ -0,0 +1,40 @@ +import genfn.sh + +var prefix +var bindir /bin +var libdir /lib +var libexecdir /libexec +var datadir /share +var mandir /share/man +var sysconfdir /etc +var includedir /include +var statedir /var + +var qubesdir $dir + +rule touch 'touch $out' +bind description 'TOUCH $out' + +rule fspec_hash '$hostdir/fspec-hash <$in >$out' +bind description 'FSPEC HASH $out' + +rule fspec_tar '$hostdir/fspec-tar <$in | gzip -c -9 >$out' +bind description 'FSPEC TAR $out' + +rule fspec 'awk -f $qubesdir/fspec.awk $fspecdirs $fspecvars $in >$out 2>/dev/null' +bind description 'FSPEC $out' +bind fspecdirs " + -v prefix=$prefix + -v bindir=$bindir + -v datadir=$datadir + -v mandir=$mandir + -v sysconfdir=$sysconfdir + -v libdir=$libdir + -v libexecdir=$libexecdir + -v includedir=$includedir + -v statedir=$statedir +" + +qvm example + +phony build $BUILDS diff --git a/qubes/genfn.sh b/qubes/genfn.sh @@ -0,0 +1,61 @@ +BUILDS= + +qvm() { + BUILDS="$BUILDS $dir/$1/build" + subgen $1 init_qvm fini_qvm +} + +init_qvm() { + FSPECS= + PKGEXCLUDE= + + var qvm $1 +} + +fini_qvm() { + if [ -e $DIR/files ]; then + fspec fspec/root.fspec $dir/files + fi + + if [ "$FSPECS" ]; then + fspec_hash root.fspec $FSPECS + fspec_tar root.tar.gz $outdir/root.fspec + else + touch root.tar.gz + fi + + phony build $outdir/root.tar.gz +} + +pkg() { + _in=./pkg/$1/files + _out=$outdir/fspec/$1.fspec + + _deps="$(awk -v pkgexclude="${PKGEXCLUDE-}" " + BEGIN { + gsub(/\\//, \"\\\\/\", pkgexclude); + gsub(/\\$/, \"\\\\$\", pkgexclude); + } + + /^reg / { + path = \$4 \"/\" \$3; + pattern = \"^(\" pkgexclude \")$\" + if (pkgexclude != \"\" && path ~ pattern) { next } + print \"\$pkgpath/\" \$3 + } + " $_in 2>/dev/null | xargs)" + + fspec $_out $_in '|' $_deps + bind pkgpath out/pkg/$1 + bind fspecvars -v pkgpath=out/pkg/$1 -v pkgexclude=\'${pkgexclude-}\' + + FSPECS="$FSPECS $_out" + GEN_FILES="$GEN_FILES $_in" +} + +pkgexclude() { + for _v in "$@"; do + PKGEXCLUDE="$PKGEXCLUDE|$_v" + done + var pkgexclude \"$PKGEXCLUDE\" +}