os161/mk/fixdepends.sh
2015-12-23 00:50:04 +00:00

84 lines
1.8 KiB
Bash
Executable File

#!/bin/sh
# fixdepends.sh - munge gcc -M output
# usage: gcc -M foo.c | fixdepends.sh INSTALLTOP host|native > .depend
# (where INSTALLTOP is $(INSTALLTOP) from the build makefiles)
if [ $# != 2 ]; then
echo "$0: Usage: $0 INSTALLTOP host|native" 1>&2
exit 1
fi
INSTALLTOP="$1"
MODE="$2"
case "$MODE" in
host|native) ;;
*) echo "$0: invalid mode $MODE; should be host or native" 1>&2
exit 1
;;
esac
awk '
# Any blank lines appear between object files.
/^$/ {
printit();
next;
}
# A line beginning with a space is a second or subsequent line of
# depends.
/^ / {
for (i=1;i<=NF;i++) {
if ($i != "\\") {
deps[++ndeps] = $i;
}
}
next;
}
# Any other line begins a new object file.
{
# Print the object file we already have, if any.
printit();
# Trim the colon after the object file name.
object = $1;
sub(":$", "", object);
# If in host mode, change .o to .ho.
if (mode == "host") {
sub("\\.o$", ".ho", object);
}
# Anything else on the line is a depend.
for (i=2;i<=NF;i++) {
if ($i != "\\") {
deps[++ndeps] = $i;
}
}
next;
}
END {
# Print the object file we have, if any, so as to not lose the
# last one.
printit();
}
function printit() {
if (ndeps == 0) {
# We have no object file in progress, so do nothing.
return;
}
# Insert MYBUILDDIR before the object file name.
printf "$(MYBUILDDIR)/%s: \\\n", object;
for (i=1;i<=ndeps;i++) {
printf " %s", deps[i];
# Lines before the last need continuation.
if (i < ndeps) {
printf " \\";
}
printf "\n";
}
# We no longer have anything to print.
ndeps = 0;
object = "/WRONG";
}
# Afterwards run sed to substitute INSTALLTOP.
' "mode=$MODE" | sed '
s,'"$INSTALLTOP"',$(INSTALLTOP),
'