]> granicus.if.org Git - python/commitdiff
Issue #19358: "make clinic" now runs the Argument Clinic preprocessor
authorLarry Hastings <larry@hastings.org>
Sat, 23 Nov 2013 22:58:45 +0000 (14:58 -0800)
committerLarry Hastings <larry@hastings.org>
Sat, 23 Nov 2013 22:58:45 +0000 (14:58 -0800)
over all CPython source files.

Makefile.pre.in
Misc/NEWS
Tools/clinic/clinic.py

index 0ccf755768addf870ae0e69bd2e342a3fa3b39b1..bed702ed4a017b46d9fac60ae06bdffd9d7fe3fc 100644 (file)
@@ -526,6 +526,12 @@ coverage-report:
        : # build lcov report
        $(MAKE) coverage-lcov
 
+# Run "Argument Clinic" over all source files
+# (depends on python having already been built)
+.PHONY=clinic
+clinic: $(BUILDPYTHON)
+       $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
+
 # Build the interpreter
 $(BUILDPYTHON):        Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
        $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
index 1e1eab1b8cd4dc06be3c1de04e1e694dd36eb668..17823125a54f28d4594594a524c893a70d5d55a2 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,7 @@ Projected release date: 2013-11-24
 
 Core and Builtins
 -----------------
+
 - Use the repr of a module name in more places in import, especially
   exceptions.
 
@@ -66,6 +67,7 @@ Core and Builtins
 
 Library
 -------
+
 - Issue #19722: Added opcode.stack_effect(), which
   computes the stack effect of bytecode instructions.
 
@@ -403,6 +405,9 @@ Documentation
 Build
 -----
 
+- Issue #19358: "make clinic" now runs the Argument Clinic preprocessor
+  over all CPython source files.
+
 - Update SQLite to 3.8.1, xz to 5.0.5, and Tcl/Tk to 8.6.1 on Windows.
 
 - Issue #16632: Enable DEP and ASLR on Windows.
@@ -449,6 +454,7 @@ Build
 
 Tools/Demos
 -----------
+
 - Issue #19730: Argument Clinic now supports all the existing PyArg
   "format units" as legacy converters, as well as two new features:
   "self converters" and the "version" directive.
index 5b8786ab5a25a2d393e74e6cdf365aa72d422565..d34c3dab6a373927e7f43b73f537553eaefeb4e4 100755 (executable)
@@ -988,7 +988,6 @@ class BlockPrinter:
         dsl_name = block.dsl_name
         write = self.f.write
 
-        assert (not input) or (input.endswith('\n'))
         assert not ((dsl_name == None) ^ (output == None)), "you must specify dsl_name and output together, dsl_name " + repr(dsl_name)
 
         if not dsl_name:
@@ -1122,12 +1121,16 @@ def parse_file(filename, *, verify=True, output=None, encoding='utf-8'):
     clinic = Clinic(language, verify=verify, filename=filename)
 
     with open(filename, 'r', encoding=encoding) as f:
-        text = clinic.parse(f.read())
+        raw = f.read()
+
+    cooked = clinic.parse(raw)
+    if cooked == raw:
+        return
 
     directory = os.path.dirname(filename) or '.'
 
     with tempfile.TemporaryDirectory(prefix="clinic", dir=directory) as tmpdir:
-        bytes = text.encode(encoding)
+        bytes = cooked.encode(encoding)
         tmpfilename = os.path.join(tmpdir, os.path.basename(filename))
         with open(tmpfilename, "wb") as f:
             f.write(bytes)
@@ -2619,6 +2622,7 @@ def main(argv):
     cmdline.add_argument("-f", "--force", action='store_true')
     cmdline.add_argument("-o", "--output", type=str)
     cmdline.add_argument("--converters", action='store_true')
+    cmdline.add_argument("--make", action='store_true')
     cmdline.add_argument("filename", type=str, nargs="*")
     ns = cmdline.parse_args(argv)
 
@@ -2697,6 +2701,23 @@ def main(argv):
         print("All return converters also accept (doc_default=None).")
         sys.exit(0)
 
+    if ns.make:
+        if ns.output or ns.filename:
+            print("Usage error: can't use -o or filenames with --make.")
+            print()
+            cmdline.print_usage()
+            sys.exit(-1)
+        for root, dirs, files in os.walk('.'):
+            for rcs_dir in ('.svn', '.git', '.hg'):
+                if rcs_dir in dirs:
+                    dirs.remove(rcs_dir)
+            for filename in files:
+                if not filename.endswith('.c'):
+                    continue
+                path = os.path.join(root, filename)
+                parse_file(path, verify=not ns.force)
+        return
+
     if not ns.filename:
         cmdline.print_usage()
         sys.exit(-1)