summaryrefslogtreecommitdiff
path: root/setup.rc
diff options
context:
space:
mode:
Diffstat (limited to 'setup.rc')
-rwxr-xr-xsetup.rc117
1 files changed, 117 insertions, 0 deletions
diff --git a/setup.rc b/setup.rc
new file mode 100755
index 00000000..590a8d72
--- /dev/null
+++ b/setup.rc
@@ -0,0 +1,117 @@
+#!/bin/rc
+
+flag e +
+
+while(~ $1 -*) switch($1) {
+case -d
+ cd $2
+ shift 2
+}
+if(~ $#* 0) outdir=out
+if not outdir=$1
+
+mkdir -p $outdir
+
+ifs=() {
+ abs_srcdir=`{readlink -f . | head -c -1}
+ abs_outdir=`{readlink -f $outdir | head -c -1}
+}
+
+# find relative path from outdir to srcdir
+ifs=/ {
+ srcdir=`{printf %s $abs_srcdir}
+ outdir=`{printf %s $abs_outdir}
+}
+
+if(~ $#outdir 0) ifs=() { rel_srcdir=`{ifs=() pwd | head -c -1} }
+if not n=() {
+ for(i in `{awk 'BEGIN {for (i = 1; i <= '$#outdir'; i++) print i}'}) {
+ if(~$#n 0 && ! ~ $srcdir($i) $outdir($i)) {
+ ifs=() { rel_srcdir=`{printf /%s $srcdir($i-) | tail -c +2} }
+ n=$i
+ }
+ if(~ $#n 1) {
+ if(~ $#rel_srcdir 0) rel_srcdir=..
+ if not rel_srcdir=../$rel_srcdir
+ }
+ }
+}
+
+root_srcdir=$abs_srcdir
+root_outdir=$abs_outdir
+setup_outs=( build.ninja )
+setup_ins=()
+
+fn set {
+ var=$1 {
+ shift
+ printf '%s = %s\n' $var $"*
+ }
+}
+
+fn subninja {
+ echo subninja $*
+}
+
+fn include {
+ echo include $*
+}
+
+fn rule {
+ name=$1 {
+ shift
+ echo rule $name
+ for(var in 'command = '$* $ninja_vars) {
+ echo ' '$var
+ }
+ }
+}
+
+fn build {
+ out=$1 rule=$2 {
+ shift 2
+ echo build $out: $rule $*
+ }
+ for(var in $ninja_vars) echo ' '$var
+}
+
+fn subgen {
+ olddir=$dir
+ dir=$1
+ srcdir=$root_srcdir/$dir
+ outdir=$root_outdir/$dir
+
+ printf 'generating in %s\n' $dir >[1=2]
+
+ setup_outs=( $setup_outs $dir/local.ninja )
+ setup_ins=( $setup_ins '$root_srcdir'/$dir/gen.rc )
+
+ mkdir -p $outdir
+ cd $srcdir
+ {
+ echo 'outdir = '$dir
+ echo 'srcdir = $root_srcdir/'$dir
+ . ./gen.rc
+ } >$outdir/local.ninja
+ cd $root_srcdir
+
+ dir=$olddir
+ srcdir=$root_srcdir/$dir
+ outdir=$root_outdir/$dir
+}
+
+subgen .
+
+{
+ set root_srcdir $rel_srcdir
+ set root_outdir .
+
+ include '$root_srcdir/config.ninja'
+ include '$root_srcdir/rules.ninja'
+
+ ninja_vars='generator = 1' build $"setup_outs gen '$root_srcdir/setup.rc' '|' $setup_ins
+
+ subninja local.ninja
+} >$root_outdir/build.ninja.tmp
+
+mv $root_outdir/^( build.ninja.tmp build.ninja )