syscall: fix build problem caused by stale tab.h

Recently the script which generates tab.h and the code including it got
incompatibly changed.  People reported problems involving syntax errors
when trying to rebuild the system following a sysupdate.

The problem was with the script being embedded within a mkfile rule,
meaning that mk didn't notice it changing and therefore didn't rebuild
the target file.  For people who were rebuilding the system this meant
that the old tab.h got included, causing syntax errors.

This patch moves the codegen script into a file and tells mk about this
new dependency, so that tab.h will get rebuilt for everyone.  I also
took an opportunity to rewrite the script, hopefuly making it easier to
follow.
This commit is contained in:
kvik 2020-09-23 17:17:52 +02:00
parent 23de6808f7
commit 2968225196
2 changed files with 16 additions and 19 deletions

View file

@ -16,25 +16,8 @@ UPDATE=\
SYSCALL=/sys/src/libc/9syscall/sys.h
tab.h: $SYSCALL
awk '
BEGIN{ print "enum{" }
{ printf "%s, ", $2 }
END{
print "READ, WRITE, NTAB"
print "};"
}' <$SYSCALL >$target
awk '
BEGIN{ print "struct Call tab[] = {" }
{ printf "[%s] \"%s\", (int(*)(...))%s,\n",
$2, tolower($2), tolower($2)
}
END{
print "[READ] \"read\", (int(*)(...))read,"
print "[WRITE] \"write\", (int(*)(...))write,"
print "[NTAB] nil, 0"
print "};"
}' <$SYSCALL >>$target
tab.h: $SYSCALL mktab.awk
mktab.awk $SYSCALL >$target
clean:V:
rm -f *.[$OS] [$OS].out $TARG $HFILES

14
sys/src/cmd/syscall/mktab.awk Executable file
View file

@ -0,0 +1,14 @@
#!/bin/awk -f
{ e = e $2 ", "
s = s sprintf("[%s] \"%s\", (int(*)(...))%s,\n",
$2, tolower($2), tolower($2))
}
END{
e = e "READ, WRITE, NTAB"
s = s "[READ] \"read\", (int(*)(...))read,\n"
s = s "[WRITE] \"write\", (int(*)(...))write,\n"
s = s "[NTAB] nil, 0\n"
print "enum{", e, "};"
print "struct Call tab[] = {\n", s, "};"
}