linux-qubasis
linux oasis port as a qubes template
git clone https://9o.is/git/linux-qubasis.git
commit 29fd1f747b170d8c71c72258082c9e89b952f620 parent a65d724d8b8b6176973668f7cef46f4f8911f777 Author: Jul <jul@9o.is> Date: Wed, 27 Aug 2025 14:03:50 +0800 simplify ninja functions Diffstat:
| M | ninja/functions.sh | | | 202 | ++++++++++++++++++++++++++++++++++++++----------------------------------------- |
1 file changed, 98 insertions(+), 104 deletions(-)
diff --git a/ninja/functions.sh b/ninja/functions.sh @@ -35,9 +35,7 @@ copy() { _ninja_prefix out '$outdir' $out _ninja_prefix src '$srcdir' $src - _ninja_sync $src - _ninja_build $out build copy "$out" "$src" } @@ -48,35 +46,33 @@ gzip() { _ninja_prefix out '$outdir' "$out" _ninja_prefix src '$srcdir' $src - _ninja_sync $src - _ninja_build $out build gzip "$out" "$src" } bin() { local src="$1" - _ninja_file /bin/$src reg 0755 $src + _ninja_fspec /bin/$src reg 0755 $src } dir() { local path="$1" local mode="${2-0755}" - _ninja_file $path dir $mode + _ninja_fspec $path dir $mode } sym() { local target="$1" local path="$2" - _ninja_file $path sym 0777 $target + _ninja_fspec $path sym 0777 $target } reg() { local src="$1" local path="$2" local mode="${3-0644}" - _ninja_file $path reg $mode $src + _ninja_fspec $path reg $mode $src } man() { @@ -97,7 +93,7 @@ man() { copy $src $out fi - _ninja_file $MANDIR/man$sec/$out reg 0644 $out + _ninja_fspec $MANDIR/man$sec/$out reg 0644 $out } compile() { @@ -121,7 +117,6 @@ exe() { _ninja_prefix out '$outdir' $out _ninja_prefix srcs '$srcdir' $srcs _ninja_sync $srcs - _ninja_build $out _ninja_buffer_exe="$out $srcs" } @@ -135,7 +130,6 @@ lib() { _ninja_prefix out '$outdir' $out _ninja_prefix srcs '$srcdir' $srcs _ninja_sync $srcs - _ninja_build $out _ninja_buffer_lib="$out $srcs" } @@ -148,20 +142,11 @@ deps() { headers() { _ninja_prefix srcs '$srcdir' $* _ninja_sync $srcs - _ninja_buffer_headers="$srcs" + _ninja_buffer_headers="$_ninja_buffer_headers $srcs" } pkg() { - local name="$1"; shift - - if [ ! "$*" ]; then - _ninja_buffer_pkg="$_ninja_buffer_pkg $pkgdir/$name/fspec/ALL" - return - fi - - for fspec in $*; do - _ninja_buffer_pkg="$_ninja_buffer_pkg $pkgdir/$name/fspec/$fspec" - done + _ninja_fspec_file $* } set_host_platform() { @@ -175,13 +160,11 @@ set_host_platform() { } subgen() { - local subgendir="${_ninja_gendir-}" - - if [ "$subgendir" ]; then - subgendir="$subgendir/" + if [ "$_ninja_type" != 'root' ]; then + local subgendir="$_ninja_gendir/" fi - _ninja_queue_subgen="$_ninja_queue_subgen $subgendir$1" + _ninja_queue_subgen="$_ninja_queue_subgen ${subgendir-}$1" _ninja_buffer_subgen="$_ninja_buffer_subgen $1" } @@ -233,10 +216,13 @@ _ninja_complete() { local gen_files='$basedir/config.sh $basedir/ninja/functions.sh $dir/gen.sh' _ninja_flush + + build phony $gendir/configure$_ninja_sub $ninjadir/$_ninja_file build gen $ninjadir/$_ninja_file '|' $gen_files + mv $_ninja_writepath ${_ninja_writepath%.*} - if [ ! "$_ninja_gendir" ]; then + if [ "$_ninja_type" = 'root' ]; then ln -sf "$_ninja_ninjadir"/$_ninja_file "$_ninja_basedir"/build.ninja fi } @@ -245,49 +231,56 @@ _ninja_initglobals() { local gendir="$1" local suffix="${2-}" - if [ "$gendir" = '.' ]; then - _ninja_gendir= - else - _ninja_gendir="$gendir" - fi - _ninja_basedir="${_ninja_basedir-$basedir}" _ninja_dir="$_ninja_basedir/$gendir" _ninja_ninjadir="$_ninja_basedir"/$BUILDDIR/ninja - if [ "$gendir" = '.' ]; then - _ninja_file=root.ninja - else - _ninja_file=$gendir$suffix.ninja - fi + case "$gendir" in + .) + _ninja_type=root + _ninja_file=root.ninja + ;; + pkg/*|tpl/*) + _ninja_type="${gendir%%/*}" + _ninja_name="${gendir#*/}" + _ninja_gendir="$gendir" + _ninja_file=$gendir$suffix.ninja + ;; + *) + printf "Error gen $_ninja_file: invalid gendir: %s\n" "$gendir" + exit 1 + esac _ninja_writepath="$_ninja_ninjadir"/$_ninja_file.tmp _ninja_sub= _ninja_buffer_subgen= - _ninja_buffer_builds= _ninja_buffer_exe= _ninja_buffer_lib= _ninja_buffer_d= _ninja_buffer_deps= _ninja_buffer_headers= _ninja_buffer_sync= - _ninja_buffer_files= - _ninja_buffer_pkg= + _ninja_buffer_fspec= + _ninja_buffer_fspec_files= } _ninja_setv_init() { setv gendir "$1" - if [ "$1" != '.' ]; then - setv dir '$basedir/$gendir' - setv outdir '$builddir/$gendir' - setv srcdir '$dir/repo' - fi + case $_ninja_type in + pkg) + setv dir '$basedir/$gendir' + setv outdir '$builddir/$gendir' + setv srcdir '$dir/repo' + ;; + tpl) + setv dir '$basedir/$gendir' + setv outdir '$builddir/$gendir' + setv rootdir '$outdir/root' + ;; - if [ ! "${1#tpl/}" = "$1" ]; then - setv rootdir '$outdir/root' - fi + esac basedir='$basedir' builddir='$builddir' @@ -334,13 +327,26 @@ _ninja_sync() { done } -_ninja_build() { - local out="$1" +_ninja_fspec() { + local path="$PREFIX$1" + local type="${2}" + local mode="${3}" + local src="${4-}" - case $out in - \$outdir/*|\$rootdir/*) - _ninja_buffer_builds="$_ninja_buffer_builds $out" - esac + _ninja_buffer_fspec="$_ninja_buffer_fspec$path $type $mode $src\n" +} + +_ninja_fspec_file() { + local name="$1"; shift + + if [ ! "$*" ]; then + _ninja_buffer_fspec_files="$_ninja_buffer_fspec_files $pkgdir/$name/fspec/ALL" + return + fi + + for fspec in $*; do + _ninja_buffer_fspec_files="$_ninja_buffer_fspec_files $pkgdir/$name/fspec/$fspec" + done } _ninja_compile() { @@ -374,15 +380,6 @@ _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 @@ -442,20 +439,26 @@ _ninja_flush_lib() { _ninja_buffer_lib= } -_ninja_flush_builds() { +_ninja_flush_subninjas() { + local pkg='' + for pkg in $_ninja_buffer_subgen; do + printf 'subninja $ninjadir/%s.ninja\n' "$pkg" >> "$_ninja_writepath" + done +} + +_ninja_flush_build() { local subbuilds='' local pkg='' for pkg in $_ninja_buffer_subgen; do subbuilds="$subbuilds \$gendir/$pkg/build$_ninja_sub" - printf 'subninja $ninjadir/%s.ninja\n' "$pkg" >> "$_ninja_writepath" done - build phony $gendir/configure$_ninja_sub $ninjadir/$_ninja_file - build phony $gendir/build$_ninja_sub "$_ninja_buffer_builds" "$subbuilds" $outdir/meta/version - - _ninja_buffer_subgen= - _ninja_buffer_builds= + case $_ninja_type in + root) build phony $gendir/build $subbuilds;; + tpl) build phony $gendir/build $outdir/rootfs.tar.zst;; + pkg) build phony $gendir/build$_ninja_sub $outdir/fspec/ALL $subbuilds;; + esac } _ninja_flush_sync() { @@ -479,36 +482,36 @@ _ninja_flush_sync() { _ninja_dedup _ninja_buffer_sync "$_ninja_buffer_sync" build phony "$_ninja_buffer_sync" $outdir/meta/version fi - - _ninja_buffer_sync= } _ninja_flush_deps() { - if [ "$_ninja_buffer_deps" ]; then - build phony $gendir/deps$_ninja_sub "$_ninja_buffer_deps" + if [ ! "$_ninja_buffer_deps" ]; then + return fi - _ninja_buffer_deps= + + build phony $gendir/deps$_ninja_sub "$_ninja_buffer_deps" } _ninja_flush_headers() { - if [ "$_ninja_buffer_headers" ]; then - local src='' - for src in $_ninja_buffer_headers; do - build copy $outdir/include/${src##*/} $src - done - - build phony $gendir/headers$_ninja_sub "$_ninja_buffer_headers" + if [ ! "$_ninja_buffer_headers" ]; then + return fi - _ninja_buffer_headers= + + local src='' + for src in $_ninja_buffer_headers; do + build copy $outdir/include/${src##*/} $src + done + + build phony $gendir/headers$_ninja_sub "$_ninja_buffer_headers" } -_ninja_flush_files() { - if [ ! "$_ninja_buffer_files" ]; then +_ninja_flush_fspec() { + if [ ! "$_ninja_buffer_fspec" ] && [ ! "$_ninja_buffer_fspec_files" ]; then build touch $outdir/fspec/ALL return fi - local fspecs=$(printf "$_ninja_buffer_files" | while read -r line; do + local fspecs=$(printf "$_ninja_buffer_fspec" | while read -r line; do set -- $line path="$1" type="$2" @@ -535,31 +538,22 @@ _ninja_flush_files() { printf "$out " done) - build cat $outdir/fspec/ALL $fspecs + build cat $outdir/fspec/ALL $fspecs $_ninja_buffer_fspec_files - _ninja_buffer_files= -} - -_ninja_flush_pkg() { - if [ ! "$_ninja_buffer_pkg" ]; then - return + if [ "$_ninja_type" = 'tpl' ]; then + build fspec-tar $outdir/rootfs.tar.zst $outdir/fspec/ALL 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 - _ninja_flush_sync - _ninja_flush_builds + _ninja_flush_subninjas _ninja_flush_deps _ninja_flush_headers - _ninja_flush_files - _ninja_flush_pkg + _ninja_flush_fspec + _ninja_flush_sync + _ninja_flush_build } _ninja_dedup() {