summaryrefslogtreecommitdiff
path: root/setup.rc
blob: cb58eec68cfa24611af3edd789d02b124ec9e1b5 (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
#!/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=()

. ./ninja.rc

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'

	let 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 )