diff options
| -rw-r--r-- | ninja.rc | 26 | ||||
| -rw-r--r-- | rules.ninja | 5 | ||||
| -rw-r--r-- | scripts/rsp.awk | 34 |
3 files changed, 61 insertions, 4 deletions
@@ -74,24 +74,42 @@ fn cc { } fn link { - out='$outdir'/$1 objs=() { + out='$outdir'/$1 objs=() deps=() { shift for(obj in $*) { if(! ~ $obj '$'*) obj='$outdir'/$obj - objs=($objs $obj) + switch($obj) { + case *.d + deps=($deps $obj) + case * + objs=($objs $obj) + } + } + if(! ~ $#deps 0) { + build $out.rsp awk $deps '|' scripts/rsp.awk ; with expr '-f scripts/rsp.awk' + objs=($objs '|' $out.rsp) } build $out link $objs + if(! ~ $#deps 0) + with ldlibs @$out.rsp + status=() } } fn ar { - out='$outdir'/$1 objs=() { + out='$outdir'/$1 objs=() deps=() { shift for(obj in $*) { if(! ~ $obj '$'*) obj='$outdir'/$obj - objs=($objs $obj) + switch($obj) { + case *.[ad] + deps=($deps $obj) + case * + objs=($objs $obj) + } } build $out ar $objs + build $out.d lines $out $deps } } diff --git a/rules.ninja b/rules.ninja index 45821074..6ab2b0da 100644 --- a/rules.ninja +++ b/rules.ninja @@ -17,6 +17,11 @@ rule link rule ar command = rm -f $out && $ar crs $out $in +rule lines + command = ln -f $rspfile $out + rspfile = $out.tmp + rspfile_content = $in_newline + rule nasm command = nasm $nasmflags -o $out $in diff --git a/scripts/rsp.awk b/scripts/rsp.awk new file mode 100644 index 00000000..d157e249 --- /dev/null +++ b/scripts/rsp.awk @@ -0,0 +1,34 @@ +function line() { + if (match($0, /\.d$/)) + read($0) + else + libs[++n] = $0 +} + +function read(name) { + for (;;) { + ret = getline < name + if (ret < 0) { + print "failed to read line from " name > "/proc/self/fd/2" + exit(1) + } + if (ret == 0) + break + line() + } + close(name) +} + +{line()} + +END { + for (i = n; i > 0; --i) { + lib = libs[i] + if (lib in seen) + continue + seen[lib] = 1 + uniq[++m] = lib + } + for (i = m; i > 0; --i) + print uniq[i] +} |
