linux-qubasis

linux oasis port as a qubes template

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

commit f005a6c1fa9eab56d1db1800db4110693d6c3f52
parent b1071cad183ea3c747147e53b5b3c202f5b61477
Author: Jul <jul@9o.is>
Date:   Thu, 21 Aug 2025 02:08:05 -0400

refactor ninja functions

Diffstat:
Mninja/functions.sh | 318+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
1 file changed, 182 insertions(+), 136 deletions(-)

diff --git a/ninja/functions.sh b/ninja/functions.sh @@ -1,21 +1,6 @@ -ninja_dir=$BUILD_DIR/ninja -ninja_gen_files='$basedir/config.sh $basedir/ninja/functions.sh $dir/gen.sh' - -ninja_queue_subgen= -ninja_buffer_subninja= -ninja_buffer_builds= -ninja_buffer_exe= -ninja_buffer_exe_srcs= -ninja_buffer_exe_objs= -ninja_buffer_lib= -ninja_buffer_lib_srcs= -ninja_buffer_dep= -ninja_buffer_dep_srcs= -ninja_buffer_sync_srcs= - setv() { local v=$1; shift; - printf '%s = %s\n' "$v" "$*" >> "$ninja_fullpath" + printf '%s = %s\n' "$v" "$*" >> "$_ninja_fullpath" } bind() { @@ -24,15 +9,15 @@ bind() { } include() { - printf 'include %s\n' "$1" >> "$ninja_fullpath" + printf 'include %s\n' "$1" >> "$_ninja_fullpath" } subninja() { - printf 'subninja $ninjadir/%s.ninja\n' "$1" >> "$ninja_fullpath" + printf 'subninja $ninjadir/%s.ninja\n' "$1" >> "$_ninja_fullpath" } rule() { - printf 'rule %s\n' "$1" >> "$ninja_fullpath" + printf 'rule %s\n' "$1" >> "$_ninja_fullpath" bind 'command' "$2" } @@ -41,7 +26,7 @@ build() { local out="$1"; shift; local value="$*" - printf 'build %s: %s %s\n' "$out" "$rule" "$value" >> "$ninja_fullpath" + printf 'build %s: %s %s\n' "$out" "$rule" "$value" >> "$_ninja_fullpath" } cflags() { @@ -50,140 +35,236 @@ cflags() { copy() { local src="$1" - local dst="${2-$src}" + local out="${2-$src}" + + _ninja_prefix out '$outdir' $out + _ninja_prefix src '$srcdir' $src - build copy "\$outdir/$dst" "\$srcdir/$src" + _ninja_sync $src + _ninja_build $out - ninja_buffer_builds="$ninja_buffer_builds \$outdir/$dst" - ninja_buffer_sync_srcs="$ninja_buffer_sync_srcs \$srcdir/$src" + build copy "$out" "$src" } exe() { - if [ "$ninja_buffer_exe" ]; then - ninja_flush_exe - fi + _ninja_flush_exe + + local out="$1"; shift + local srcs="$*" - ninja_buffer_exe="\$outdir/$1"; shift; - ninja_buffer_exe_srcs="$*" + _ninja_prefix out '$outdir' $out + _ninja_prefix srcs '$srcdir' $srcs + _ninja_sync $srcs + _ninja_build $out - ninja_buffer_builds="$ninja_buffer_builds $ninja_buffer_exe" + _ninja_buffer_exe="$out $srcs" } lib() { - if [ "$ninja_buffer_lib" ]; then - ninja_flush_lib - fi + _ninja_flush_lib + + local out="$1"; shift + local srcs="$*" + + _ninja_prefix out '$outdir' $out + _ninja_prefix srcs '$srcdir' $srcs + _ninja_sync $srcs - ninja_buffer_lib="\$outdir/lib/$1"; shift; - ninja_buffer_lib_srcs="$*" + _ninja_buffer_lib="$out $srcs" } dep() { - ninja_buffer_dep="\$outdir/$1"; shift; - ninja_buffer_dep_srcs="$*" + _ninja_buffer_dep="\$outdir/$1"; shift; + _ninja_buffer_dep_srcs="$*" } subgen() { - ninja_queue_subgen="$ninja_queue_subgen $subgendir$1" - ninja_buffer_subninja="$ninja_buffer_subninja $1" + _ninja_queue_subgen="$_ninja_queue_subgen $_subgendir$1" + _ninja_buffer_subninja="$_ninja_buffer_subninja $1" } -ninja_flush_exe() { - local objs='' - local val='' - local src='' +gen() { + dir="$basedir"/$1 - for src in $ninja_buffer_exe_srcs; do - case $src in - *.c) - val="\$srcdir/$src" - ninja_buffer_sync_srcs="$ninja_buffer_sync_srcs $val" + if [ "$1" = '.' ]; then + _subgendir= + _ninja_file=root.ninja + else + _subgendir="$1/" + _ninja_file=$1.ninja + fi - if [ "$ninja_buffer_exe" = "$ninja_buffer_dep" ]; then - val="$val || $ninja_buffer_dep_srcs" - fi + _ninja_fullpath="$basedir"/$_ninja_dir/$_ninja_file + mkdir -p "$basedir"/$_ninja_dir/pkg + printf '' > "$_ninja_fullpath" - build cc "\$outdir/o/$src.o" "$val" - objs="$objs \$outdir/o/$src.o" - ;; - *.a) - objs="$objs \$outdir/lib/$src" - ;; - *) - printf "Error gen $ninja_file: unknown file to compile: %s" "$src" - exit 1 - esac - done + setv 'gendir' "$1" - if [ "$objs" ]; then - build link $ninja_buffer_exe $objs + if [ "$1" != '.' ]; then + setv 'dir' '$basedir/$gendir' + setv 'outdir' '$builddir/$gendir' + setv 'srcdir' '$dir/repo' fi - ninja_buffer_exe= - ninja_buffer_exe_srcs= + . "$dir"/gen.sh + + _ninja_flush + build gen "\$ninjadir/$_ninja_file" "| $_ninja_gen_files" - if [ "$ninja_buffer_exe" = "$ninja_buffer_dep" ]; then - ninja_buffer_dep= - ninja_buffer_dep_srcs= + if [ "$_ninja_queue_subgen" ]; then + set -- $_ninja_queue_subgen + local pkg=$1; shift; + _ninja_queue_subgen="$@" + gen $pkg fi } -ninja_flush_lib() { - # build $outdir/libutil.a.d: rsp $outdir/libutil.a ???? - local objs='' - local val='' +## +## Internal ninja global variables and functions +## + +_ninja_dir=$BUILD_DIR/ninja +_ninja_gen_files='$basedir/config.sh $basedir/ninja/functions.sh $dir/gen.sh' + +_ninja_queue_subgen= +_ninja_buffer_subninja= +_ninja_buffer_builds= +_ninja_buffer_exe= +_ninja_buffer_lib= +_ninja_buffer_dep= +_ninja_buffer_dep_srcs= +_ninja_buffer_sync= + + +_ninja_prefix() { + local variable="$1"; shift + local prefix="$1"; shift + local vs='' + local v='' + + for v in $*; do + case $v in + \$*) ;; + *) v="$prefix/$v";; + esac + vs="$vs $v" + done + + eval "$variable='$vs'" +} + +_ninja_sync() { + local src='' + + for src in $@; do + case $src in + \$srcdir/*.c) + _ninja_buffer_sync="$_ninja_buffer_sync $src" + esac + done +} + +_ninja_build() { + local out="$1" + + case $out in + \$outdir/*) + _ninja_buffer_builds="$_ninja_buffer_builds $out" + esac +} + +_ninja_compile() { + local out="$1"; shift + local srcs="$@" local src='' + local obj='' - for src in $ninja_buffer_lib_srcs; do + for src in $srcs; do case $src in *.c) - val="\$srcdir/$src" - ninja_buffer_sync_srcs="$ninja_buffer_sync_srcs $val" + obj="\$outdir/o/${src#\$srcdir/}.o" - if [ "$ninja_buffer_lib" = "$ninja_buffer_dep" ]; then - val="$val || $ninja_buffer_dep_srcs" + if [ "$out" = "$_ninja_buffer_dep" ]; then + src="$src || $_ninja_buffer_dep_srcs" fi - build cc "\$outdir/o/$src.o" "$val" - objs="$objs \$outdir/o/$src.o" + build cc "$obj" "$src" + objs="$objs $obj" + ;; + *.a) + obj="\$outdir/${src#\$srcdir/}" + objs="$objs $obj" ;; *) - printf "Error gen $ninja_file: unknown file to compile: %s" "$src" + printf "Error gen $_ninja_file: unknown file to compile: %s\n" "$src" exit 1 esac done + if [ "$out" = "$_ninja_buffer_dep" ]; then + _ninja_buffer_dep= + _ninja_buffer_dep_srcs= + fi +} + +_ninja_flush_exe() { + if [ ! "$_ninja_buffer_exe" ]; then + return + fi + + set -- $_ninja_buffer_exe + + local out="$1"; shift; + local srcs="$@" + local objs='' + + _ninja_compile "$out" $srcs + if [ "$objs" ]; then - build ar $ninja_buffer_lib $objs + build link $out $objs fi - ninja_buffer_lib= - ninja_buffer_lib_srcs= + _ninja_buffer_exe= +} - if [ "$ninja_buffer_lib" = "$ninja_buffer_dep" ]; then - ninja_buffer_dep= - ninja_buffer_dep_srcs= +_ninja_flush_lib() { + if [ ! "$_ninja_buffer_lib" ]; then + return fi + + set -- $_ninja_buffer_lib + + local out="$1"; shift; + local srcs="$@" + local objs='' + + _ninja_compile "$out" $srcs + + if [ "$objs" ]; then + build ar $out $objs + fi + + _ninja_buffer_lib= } -ninja_flush_subninja() { +_ninja_flush_subninja() { local subbuilds='' local pkg='' - for pkg in $ninja_buffer_subninja; do + for pkg in $_ninja_buffer_subninja; do subbuilds="$subbuilds \$gendir/$pkg/build" subninja $pkg done - build phony '$gendir/configure' "\$ninjadir/$ninja_file" - build phony '$gendir/build' "$ninja_buffer_builds" "$subbuilds" + build phony '$gendir/configure' "\$ninjadir/$_ninja_file" + build phony '$gendir/build' "$_ninja_buffer_builds" "$subbuilds" - ninja_buffer_subninja= - ninja_buffer_builds= + _ninja_buffer_subninja= + _ninja_buffer_builds= } -ninja_flush_sync() { +_ninja_flush_sync() { local verfile="$dir"/version if [ ! -f "$verfile" ]; then @@ -191,50 +272,15 @@ ninja_flush_sync() { fi build sync '$outdir/o/version' '$gendir/version | $basedir/ninja/sync.sh' - build phony "$ninja_buffer_sync_srcs" '$outdir/o/version' + build phony "$_ninja_buffer_sync" '$outdir/o/version' - ninja_buffer_sync_srcs= + _ninja_buffer_sync= } -ninja_flush() { - ninja_flush_lib - ninja_flush_exe - ninja_flush_subninja - ninja_flush_sync +_ninja_flush() { + _ninja_flush_lib + _ninja_flush_exe + _ninja_flush_subninja + _ninja_flush_sync } -gen() { - dir="$basedir"/$1 - - if [ "$1" = '.' ]; then - subgendir= - ninja_file=root.ninja - else - subgendir="$1/" - ninja_file=$1.ninja - fi - - ninja_fullpath="$basedir"/$ninja_dir/$ninja_file - mkdir -p "$basedir"/$ninja_dir/pkg - printf '' > "$ninja_fullpath" - - setv 'gendir' "$1" - - if [ "$1" != '.' ]; then - setv 'dir' '$basedir/$gendir' - setv 'outdir' '$builddir/$gendir' - setv 'srcdir' '$dir/repo' - fi - - . "$dir"/gen.sh - - ninja_flush - build gen "\$ninjadir/$ninja_file" "| $ninja_gen_files" - - if [ "$ninja_queue_subgen" ]; then - set -- $ninja_queue_subgen - local pkg=$1; shift; - ninja_queue_subgen="$@" - gen $pkg - fi -}