]> granicus.if.org Git - python/commitdiff
Issue #13150: sysconfig no longer parses the Makefile and config.h files
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 18 Oct 2011 15:52:24 +0000 (17:52 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 18 Oct 2011 15:52:24 +0000 (17:52 +0200)
when imported, instead doing it at build time.  This makes importing
sysconfig faster and reduces Python startup time by 20%.

.hgignore
Lib/sysconfig.py
Makefile.pre.in
Misc/NEWS

index 80ac2eda10a324452eef179cb277b8f36e2fb246..0fd85626334df9e002ca22a6d7b2379b914ef602 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -49,6 +49,7 @@ libpython*.so*
 *.pyd
 *.cover
 *~
+Lib/_sysconfigdata.py
 Lib/lib2to3/*.pickle
 Lib/test/data/*
 Misc/*.wpu
index 6594104e0652d0953cf65f8125e5d9f70caeccaa..36c7aa49a56e0d244f90b0eabafa0e3e0ee31b13 100644 (file)
@@ -319,9 +319,11 @@ def get_makefile_filename():
         config_dir_name = 'config'
     return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')
 
-
-def _init_posix(vars):
-    """Initialize the module as appropriate for POSIX systems."""
+def _generate_posix_vars():
+    """Generate the Python module containing build-time variables."""
+    import pprint
+    vars = {}
+    destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py')
     # load the installed Makefile:
     makefile = get_makefile_filename()
     try:
@@ -346,7 +348,15 @@ def _init_posix(vars):
     # the scripts are in another directory.
     if _PYTHON_BUILD:
         vars['LDSHARED'] = vars['BLDSHARED']
+    with open(destfile, 'w', encoding='utf8') as f:
+        f.write('build_time_vars = ')
+        pprint.pprint(vars, stream=f)
 
+def _init_posix(vars):
+    """Initialize the module as appropriate for POSIX systems."""
+    # _sysconfigdata is generated at build time, see _generate_posix_vars()
+    from _sysconfigdata import build_time_vars
+    vars.update(build_time_vars)
 
 def _init_non_posix(vars):
     """Initialize the module as appropriate for NT"""
@@ -753,6 +763,9 @@ def _print_dict(title, data):
 
 def _main():
     """Display all information sysconfig detains."""
+    if '--generate-posix-vars' in sys.argv:
+        _generate_posix_vars()
+        return
     print('Platform: "%s"' % get_platform())
     print('Python version: "%s"' % get_python_version())
     print('Current installation scheme: "%s"' % _get_default_scheme())
index d35a2fef9b976afcc9f23ee42532150c7b534376..5c30eb39c55289977419cec6aecfa800adfd5067 100644 (file)
@@ -396,7 +396,7 @@ LIBRARY_OBJS=       \
 
 # Default target
 all:           build_all
-build_all:     $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed
+build_all:     $(BUILDPYTHON) sysconfig oldsharedmods sharedmods gdbhooks Modules/_testembed
 
 # Compile a binary with gcc profile guided optimization.
 profile-opt:
@@ -429,12 +429,15 @@ coverage:
 $(BUILDPYTHON):        Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
        $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
 
-platform: $(BUILDPYTHON)
+platform: $(BUILDPYTHON) sysconfig
        $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
 
+# Generate the sysconfig build-time data
+sysconfig: $(BUILDPYTHON)
+       $(RUNSHARED) ./$(BUILDPYTHON) -SE -m sysconfig --generate-posix-vars
 
 # Build the shared modules
-sharedmods: $(BUILDPYTHON)
+sharedmods: $(BUILDPYTHON) sysconfig
        @case $$MAKEFLAGS in \
        *s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \
        *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
@@ -1379,7 +1382,7 @@ patchcheck:
 Python/thread.o: @THREADHEADERS@
 
 # Declare targets that aren't real files
-.PHONY: all build_all sharedmods oldsharedmods test quicktest
+.PHONY: all build_all sysconfig sharedmods oldsharedmods test quicktest
 .PHONY: install altinstall oldsharedinstall bininstall altbininstall
 .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
 .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
index 24fadae6cc8c9eb594cf842daca239738a1ad293..3d77bbfee9ff26f1befa4439ab60a580a6f12691 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -315,6 +315,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #13150: sysconfig no longer parses the Makefile and config.h files
+  when imported, instead doing it at build time.  This makes importing
+  sysconfig faster and reduces Python startup time by 20%.
+
 - Issue #12448: smtplib now flushes stdout while running ``python -m smtplib``
   in order to display the prompt correctly.