summaryrefslogtreecommitdiff
path: root/setup.rc
blob: 84c863cfca4f9923af8b1cfc88da352e635fc0b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/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' 'pool = console' ) {
		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 )