]> granicus.if.org Git - python/commitdiff
Issue #15298: ensure _sysconfigdata is generated in build directory,
authorTrent Nelson <trent@trent.me>
Tue, 16 Oct 2012 12:13:12 +0000 (08:13 -0400)
committerTrent Nelson <trent@trent.me>
Tue, 16 Oct 2012 12:13:12 +0000 (08:13 -0400)
not source directory.

Patch by Richard Oudkerk (sbt).

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

index ba4024fe8898045ce02cfd83193ea83c2712004a..41a233bb6f9f88015f780cdb47e9b413e7888223 100644 (file)
@@ -390,13 +390,22 @@ def _generate_posix_vars():
     if _PYTHON_BUILD:
         vars['LDSHARED'] = vars['BLDSHARED']
 
-    destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py')
+    pybuilddir = 'build/lib.%s-%s' % (get_platform(), sys.version[:3])
+    if hasattr(sys, "gettotalrefcount"):
+        pybuilddir += '-pydebug'
+    os.makedirs(pybuilddir, exist_ok=True)
+    destfile = os.path.join(pybuilddir, '_sysconfigdata.py')
+
     with open(destfile, 'w', encoding='utf8') as f:
         f.write('# system configuration generated and used by'
                 ' the sysconfig module\n')
         f.write('build_time_vars = ')
         pprint.pprint(vars, stream=f)
 
+    # Create file used for sys.path fixup -- see Modules/getpath.c
+    with open('pybuilddir.txt', 'w', encoding='ascii') as f:
+        f.write(pybuilddir)
+
 def _init_posix(vars):
     """Initialize the module as appropriate for POSIX systems."""
     # _sysconfigdata is generated at build time, see _generate_posix_vars()
index af4fd81d4a71b50cfbe267723bc9e6c34ba2b2d1..10ad381be232c9c3decef5ef509df398f53addcd 100644 (file)
@@ -410,8 +410,6 @@ OBJECT_OBJS=        \
                Objects/unicodectype.o \
                Objects/weakrefobject.o
 
-SYSCONFIGDATA=$(srcdir)/Lib/_sysconfigdata.py
-
 ##########################################################################
 # objects that get linked into the Python library
 LIBRARY_OBJS_OMIT_FROZEN=      \
@@ -432,7 +430,7 @@ LIBRARY_OBJS=       \
 
 # Default target
 all:           build_all
-build_all:     $(BUILDPYTHON) $(SYSCONFIGDATA) oldsharedmods sharedmods gdbhooks Modules/_testembed
+build_all:     $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed
 
 # Compile a binary with gcc profile guided optimization.
 profile-opt:
@@ -466,17 +464,19 @@ coverage:
 $(BUILDPYTHON):        Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
        $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
 
-platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
+platform: $(BUILDPYTHON) pybuilddir.txt
        $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
 
-# Generate the sysconfig build-time data
-$(SYSCONFIGDATA): $(BUILDPYTHON)
+# Create build directory and generate the sysconfig build-time data there.
+# pybuilddir.txt contains the name of the build dir and is used for
+# sys.path fixup -- see Modules/getpath.c.
+pybuilddir.txt: $(BUILDPYTHON)
        $(RUNSHARED) $(PYTHON_FOR_BUILD) -S -m sysconfig --generate-posix-vars
 
 # Build the shared modules
 # MAKEFLAGS are sorted and normalized. Under GNU make the 's' for
 # -s, --silent or --quiet is always the first char.
-sharedmods: $(BUILDPYTHON) $(SYSCONFIGDATA)
+sharedmods: $(BUILDPYTHON) pybuilddir.txt
        @case "$$MAKEFLAGS" in \
            s*) quiet="-q";; \
            *) quiet="";; \
@@ -1043,7 +1043,7 @@ libinstall:       build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
                else    true; \
                fi; \
        done
-       @for i in $(srcdir)/Lib/*.py ; \
+       @for i in $(srcdir)/Lib/*.py `cat pybuilddir.txt`/_sysconfigdata.py; \
        do \
                if test -x $$i; then \
                        $(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \
@@ -1203,6 +1203,8 @@ sharedinstall: sharedmods
                --install-scripts=$(BINDIR) \
                --install-platlib=$(DESTSHARED) \
                --root=$(DESTDIR)/
+       -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py
+       -rm -r $(DESTDIR)$(DESTSHARED)/__pycache__
 
 # Here are a couple of targets for MacOSX again, to install a full
 # framework-based Python. frameworkinstall installs everything, the
@@ -1348,9 +1350,10 @@ clean: pycremoval
        find . -name '*.s[ol]' -exec rm -f {} ';'
        find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';'
        find build -name 'fficonfig.h' -exec rm -f {} ';' || true
-       find build -name 'fficonfig.py' -exec rm -f {} ';' || true
+       find build -name '*.py' -exec rm -f {} ';' || true
+       find build -name '*.py[co]' -exec rm -f {} ';' || true
+       -rm -f pybuilddir.txt
        -rm -f Lib/lib2to3/*Grammar*.pickle
-       -rm -f $(SYSCONFIGDATA)
        -rm -f Modules/_testembed Modules/_freeze_importlib
 
 profile-removal:
@@ -1374,7 +1377,6 @@ distclean: clobber
                Modules/Setup Modules/Setup.local Modules/Setup.config \
                Modules/ld_so_aix Modules/python.exp Misc/python.pc
        -rm -f python*-gdb.py
-       -rm -f pybuilddir.txt
        find $(srcdir) '(' -name '*.fdc' -o -name '*~' \
                           -o -name '[@,#]*' -o -name '*.old' \
                           -o -name '*.orig' -o -name '*.rej' \
index d747af56e3ea92f8819d7dc9361df2534674f480..f779e02e00a2d884d087420c500ce74b5c471106 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -127,6 +127,9 @@ Tests
 Build
 -----
 
+- Issue #15298: ensure _sysconfigdata is generated in build directory, not
+  source directory.
+
 - Issue #15833: Fix a regression in 3.3 that resulted in exceptions being
   raised if importlib failed to write byte-compiled files.  This affected
   attempts to build Python out-of-tree from a read-only source directory.
@@ -134,8 +137,8 @@ Build
 - Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
   after 2801bf875a24 (see #15801).
 
-- Issue #15819: Make sure we can build Python out-of-tree from a readonly source
-  directory.  (Somewhat related to issue #9860.)
+- Issue #15819: Make sure we can build Python out-of-tree from a read-only
+  source directory.  (Somewhat related to issue #9860.)
 
 Documentation
 -------------
index 4dc58c84927425bcf544be56c0f15bff56ae1409..8a9ba5f4276eb08edb4ad9edf03936e1c7474e66 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -33,10 +33,6 @@ COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_AR
 # This global variable is used to hold the list of modules to be disabled.
 disabled_module_list = []
 
-# File which contains the directory for shared mods (for sys.path fixup
-# when running from the build dir, see Modules/getpath.c)
-_BUILDDIR_COOKIE = "pybuilddir.txt"
-
 def add_dir_to_list(dirlist, dir):
     """Add the directory 'dir' to the list 'dirlist' (after any relative
     directories) if:
@@ -252,16 +248,6 @@ class PyBuildExt(build_ext):
             args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
         self.compiler.set_executables(**args)
 
-        # Not only do we write the builddir cookie, but we manually install
-        # the shared modules directory if it isn't already in sys.path.
-        # Otherwise trying to import the extensions after building them
-        # will fail.
-        with open(_BUILDDIR_COOKIE, "wb") as f:
-            f.write(self.build_lib.encode('utf-8', 'surrogateescape'))
-        abs_build_lib = os.path.join(os.getcwd(), self.build_lib)
-        if abs_build_lib not in sys.path:
-            sys.path.append(abs_build_lib)
-
         build_ext.build_extensions(self)
 
         longest = max([len(e.name) for e in self.extensions])