summaryrefslogtreecommitdiff
path: root/ninja.rc
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2016-04-12 22:34:23 -0700
committerMichael Forney <mforney@mforney.org>2016-04-15 02:10:08 -0700
commit9c2e14cc8a64b62f0ee607ec924ce76a4f2a04ac (patch)
treeb324a4faffa057f48078aadcf054374d83784213 /ninja.rc
parentb88023a0c8cced80c765ac47c731627e837f2652 (diff)
Move ninja helpers to ninja.rc
Diffstat (limited to 'ninja.rc')
-rw-r--r--ninja.rc137
1 files changed, 137 insertions, 0 deletions
diff --git a/ninja.rc b/ninja.rc
new file mode 100644
index 00000000..13d83ec1
--- /dev/null
+++ b/ninja.rc
@@ -0,0 +1,137 @@
+# ninja constructs
+
+fn set {
+ var=$1 {
+ shift
+ printf '%s = %s\n' $var $"*
+ }
+}
+
+fn let {
+ vars=() {
+ while(! ~ $1 --) {
+ vars=( $vars $1' = '$2 )
+ shift 2
+ }
+ shift
+ $*
+ printf ' %s\n' $vars
+ }
+}
+
+fn subninja {
+ echo subninja $*
+}
+
+fn include {
+ echo include $*
+}
+
+fn rule {
+ name=$1 {
+ shift
+ let command $"* -- echo rule $name
+ }
+}
+
+fn build {
+ out=$1 rule=$2 {
+ shift 2
+ echo build $out: $rule $*
+ }
+}
+
+# higher-level rules
+
+fn stamp {
+ build '$outdir/stamp' stamp '$outdir'/$*
+}
+
+fn cflags {
+ set cflags '$cflags' $*
+}
+
+fn cc {
+ src=$1 obj=$src.o {
+ shift
+ if(! ~ $src '$'*) {
+ src='$srcdir'/src/$src
+ obj='$outdir'/$obj
+ }
+ build $obj cc $src $*
+ }
+}
+
+fn link {
+ out='$outdir'/$1 objs=() {
+ shift
+ for(obj in $*) {
+ if(! ~ $obj '$'*) obj='$outdir'/$obj
+ objs=( $objs $obj )
+ }
+ build $out link $objs
+ }
+}
+
+fn ar {
+ out='$outdir'/$1 objs=() {
+ shift
+ for(obj in $*) {
+ if(! ~ $obj '$'*) obj='$outdir'/$obj
+ objs=( $objs $obj )
+ }
+ build $out ar $objs
+ }
+}
+
+fn static_lib {
+ out=$1 {
+ shift
+ for(src) cc $src
+ ar $out $*.o
+ }
+}
+
+fn exe {
+ out=$1 objs=() {
+ shift
+ for(src) {
+ if(~ $src *.c) {
+ cc $src
+ obj=$src.o
+ }
+ if not obj=$src
+ objs=( $objs $obj )
+ }
+ link $out $objs
+ }
+}
+
+fn yacc {
+ outs='$outdir'/$1.tab.^( c h ) {
+ let yaccflags '-d -b '$1 -- build $"outs yacc $2
+ }
+}
+
+# packaging rules
+
+fn file {
+ out='$repo.hash'/$1
+ let args 100$3' '$1 --\
+ build $out githash $2 '|' '$repo.stamp' '$root_srcdir/scripts/hash.rc'
+ root_inputs=( $root_inputs $out )
+
+ if(! ~ $3 755 644) root_perms=( $root_perms 100$3' '$1 )
+ status=()
+}
+
+fn dir {
+ root_perms=( $root_perms '010'$2' '$1 )
+}
+
+fn sym {
+ out='$repo.hash'/$1
+ let args 120000' '$1' '$2 --\
+ build $out githash '| $repo.stamp' '$root_srcdir/scripts/hash.rc'
+ root_inputs=( $root_inputs $out )
+}