summaryrefslogtreecommitdiff
path: root/stdlib/test-errno-constants.py
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-06-22 18:28:45 -0400
committerZack Weinberg <zackw@panix.com>2017-06-22 18:28:45 -0400
commit09e65f085e8491db0ada73c558ffe8dc296ade47 (patch)
treec31ff4f8f871bab4762248bffc9c3c508037ef61 /stdlib/test-errno-constants.py
parentbf7aa82eab0f1f9c78d39cf57a3f6b25eefc47c1 (diff)
downloadglibc-zack/errno-prettyprint.tar.gz
Add pretty-printer for errno.zack/errno-prettyprint
This patch adds the actual pretty-printer for errno. I could have used Python's built-in errno module to get the symbolic names for the constants, but it seemed better to do something entirely under our control, so there's a .pysym file generated from errnos.texi, with a hook that allows the Hurd to add additional constants. Then a .py module is generated from that plus errno.h in the usual manner; many thanks to the authors of the .pysym mechanism. There is also a test which verifies that the .py file (not the .pysym file) covers all of the constants defined in errno.h. hurd-add-errno-constants.awk has been manually tested, but the makefile logic that runs it has not been tested. * stdlib/errno-printer.py: New pretty-printer. * stdlib/test-errno-constants.py: New special test. * stdlib/test-errno-printer.c, stdlib/test-errno-printer.py: New pretty-printer test. * stdlib/make-errno-constants.awk: New script to generate the .pysym file needed by errno-printer.py. * stdlib/Makefile: Install, run, and test all of the above, as appropriate. * sysdeps/mach/hurd/hurd-add-errno-constants.awk: New script to add Mach/Hurd-specific errno constants to the .pysym file used by stdlib/errno-printer.py. * sysdeps/mach/hurd/Makefile: Hook hurd-add-errno-constants.awk into the generation of that .pysym file.
Diffstat (limited to 'stdlib/test-errno-constants.py')
-rw-r--r--stdlib/test-errno-constants.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/stdlib/test-errno-constants.py b/stdlib/test-errno-constants.py
new file mode 100644
index 0000000000..a79df97625
--- /dev/null
+++ b/stdlib/test-errno-constants.py
@@ -0,0 +1,58 @@
+# Test that errno_constants.py includes every error number defined by errno.h.
+# Copyright (C) 2017 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# Usage: test-errno-constants.py $(common-objpfx)stdlib $(CC) $(CFLAGS) $(CPPFLAGS)
+
+import os
+import sys
+import subprocess
+
+sys.path.append(sys.argv[1])
+import errno_constants
+
+def main():
+ cc_cmd = sys.argv[2:]
+ cc_cmd.extend(["-E", "-dM", "-xc", "-"])
+ cc_proc = subprocess.Popen(cc_cmd,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+ cc_proc.stdin.write(b"#define _GNU_SOURCE\n"
+ b"#include <errno.h>\n")
+ cc_proc.stdin.close()
+
+ cc_output = cc_proc.stdout.read()
+ status = cc_proc.wait()
+ if status:
+ sys.stderr.write("{}\nunsuccessful exit, status {:04x}"
+ .format(" ".join(cc_cmd), status))
+ sys.exit(1)
+
+ ok = True
+ for line in cc_output.decode("utf-8").splitlines():
+ if not line.startswith("#define E"):
+ continue
+ emacro = line.split()[1]
+ if not hasattr(errno_constants, emacro):
+ if ok:
+ sys.stderr.write("*** Missing constants:\n")
+ ok = False
+ sys.stderr.write(emacro + "\n")
+
+ sys.exit(0 if ok else 1)
+
+main()