From 1e73a2467f312f7b5ebef515cca6d3a16cf36f97 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 18 Oct 2011 17:52:24 +0200 Subject: [PATCH] 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%. --- .hgignore | 1 + Lib/sysconfig.py | 19 ++++++++++++++++--- Makefile.pre.in | 11 +++++++---- Misc/NEWS | 4 ++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.hgignore b/.hgignore index 80ac2eda10a..0fd85626334 100644 --- a/.hgignore +++ b/.hgignore @@ -49,6 +49,7 @@ libpython*.so* *.pyd *.cover *~ +Lib/_sysconfigdata.py Lib/lib2to3/*.pickle Lib/test/data/* Misc/*.wpu diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 6594104e065..36c7aa49a56 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -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()) diff --git a/Makefile.pre.in b/Makefile.pre.in index d35a2fef9b9..5c30eb39c55 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index 24fadae6cc8..3d77bbfee9f 100644 --- 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.