# DP: Change the interpreter to build and install python extensions # DP: built with the python-dbg interpreter with a different name into # DP: the same path (by appending `_d' to the extension name). --- a/Lib/distutils/command/build.py +++ b/Lib/distutils/command/build.py @@ -91,7 +91,8 @@ # 'lib.' under the base build directory. We only use one of # them for a given distribution, though -- if self.build_purelib is None: - self.build_purelib = os.path.join(self.build_base, 'lib') + self.build_purelib = os.path.join(self.build_base, + 'lib' + plat_specifier) if self.build_platlib is None: self.build_platlib = os.path.join(self.build_base, 'lib' + plat_specifier) --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -85,7 +85,7 @@ # Include is located in the srcdir inc_dir = os.path.join(srcdir, "Include") return inc_dir - return os.path.join(prefix, "include", "python" + get_python_version()) + return os.path.join(prefix, "include", "python" + get_python_version())+(sys.pydebug and "_d" or "") elif os.name == "nt": return os.path.join(prefix, "include") elif os.name == "os2": @@ -216,7 +216,7 @@ if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") lib_dir = get_python_lib(plat_specific=1, standard_lib=1) - return os.path.join(lib_dir, "config", "Makefile") + return os.path.join(lib_dir, "config"+(sys.pydebug and "_d" or ""), "Makefile") def parse_config_h(fp, g=None): --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -299,7 +299,7 @@ def _get_makefile_filename(): if _PYTHON_BUILD: return os.path.join(_PROJECT_BASE, "Makefile") - return os.path.join(get_path('platstdlib').replace("/usr/local","/usr",1), "config", "Makefile") + return os.path.join(get_path('platstdlib').replace("/usr/local","/usr",1), "config" + (sys.pydebug and "_d" or ""), "Makefile") def _init_posix(vars): @@ -384,7 +384,7 @@ else: inc_dir = _PROJECT_BASE else: - inc_dir = get_path('platinclude').replace("/usr/local","/usr",1) + inc_dir = get_path('platinclude').replace("/usr/local","/usr",1)+(sys.pydebug and "_d" or "") return os.path.join(inc_dir, 'pyconfig.h') def get_scheme_names(): --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -108,8 +108,8 @@ # Detailed destination directories BINLIBDEST= $(LIBDIR)/python$(VERSION) LIBDEST= $(SCRIPTDIR)/python$(VERSION) -INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) -CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION) +INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)$(DEBUG_EXT) +CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)$(DEBUG_EXT) LIBP= $(LIBDIR)/python$(VERSION) # Symbols used for using shared libraries @@ -123,6 +123,8 @@ EXE= @EXEEXT@ BUILDEXE= @BUILDEXEEXT@ +DEBUG_EXT= @DEBUG_EXT@ + # Short name and location for Mac OS X Python framework UNIVERSALSDK=@UNIVERSALSDK@ PYTHONFRAMEWORK= @PYTHONFRAMEWORK@ @@ -429,7 +431,7 @@ $(AR) $(ARFLAGS) $@ $(MODOBJS) $(RANLIB) $@ -libpython$(VERSION).so: $(LIBRARY_OBJS) +libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS) if test $(INSTSONAME) != $(LDLIBRARY); then \ $(BLDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ $(LN) -f $(INSTSONAME) $@; \ @@ -990,8 +992,8 @@ $(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h # Install the library and miscellaneous stuff needed for extending/embedding -# This goes into $(exec_prefix) -LIBPL= $(LIBP)/config +# This goes into $(exec_prefix)$(DEBUG_EXT) +LIBPL= $(LIBP)/config$(DEBUG_EXT) # pkgconfig directory LIBPC= $(LIBDIR)/pkgconfig --- a/Misc/python-config.in +++ b/Misc/python-config.in @@ -45,7 +45,7 @@ elif opt in ('--libs', '--ldflags'): libs = getvar('LIBS').split() + getvar('SYSLIBS').split() - libs.append('-lpython'+pyver) + libs.append('-lpython' + pyver + (sys.pydebug and "_d" or "")) # add the prefix/lib/pythonX.Y/config dir, but only if there is no # shared library in prefix/lib/. if opt == '--ldflags': --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -46,6 +46,10 @@ {"module.exe", "rb", C_EXTENSION}, {"MODULE.EXE", "rb", C_EXTENSION}, #else +#ifdef Py_DEBUG + {"_d.so", "rb", C_EXTENSION}, + {"module_d.so", "rb", C_EXTENSION}, +#endif {".so", "rb", C_EXTENSION}, {"module.so", "rb", C_EXTENSION}, #endif --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1504,6 +1504,12 @@ PyString_FromString("legacy")); #endif +#ifdef Py_DEBUG + PyDict_SetItemString(sysdict, "pydebug", Py_True); +#else + PyDict_SetItemString(sysdict, "pydebug", Py_False); +#endif + #undef SET_SYS_FROM_STRING if (PyErr_Occurred()) return NULL; --- a/configure.ac +++ b/configure.ac @@ -634,7 +634,7 @@ AC_MSG_CHECKING(LIBRARY) if test -z "$LIBRARY" then - LIBRARY='libpython$(VERSION).a' + LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a' fi AC_MSG_RESULT($LIBRARY) @@ -779,8 +779,8 @@ INSTSONAME="$LDLIBRARY".$SOVERSION ;; Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*) - LDLIBRARY='libpython$(VERSION).so' - BLDLIBRARY='-L. -lpython$(VERSION)' + LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so' + BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)' RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH} case $ac_sys_system in FreeBSD*) @@ -904,6 +904,12 @@ fi], [AC_MSG_RESULT(no)]) +if test "$Py_DEBUG" = 'true' +then + DEBUG_EXT=_d +fi +AC_SUBST(DEBUG_EXT) + # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be # merged with this chunk of code? @@ -1759,7 +1765,7 @@ esac ;; CYGWIN*) SO=.dll;; - *) SO=.so;; + *) SO=$DEBUG_EXT.so;; esac else # this might also be a termcap variable, see #610332 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -287,8 +287,8 @@ finally: os.chdir(old_wd) self.assertTrue(os.path.exists(so_file)) - self.assertEqual(os.path.splitext(so_file)[-1], - sysconfig.get_config_var('SO')) + so_ext = sysconfig.get_config_var('SO') + self.assertEqual(so_file[len(so_file)-len(so_ext):], so_ext) so_dir = os.path.dirname(so_file) self.assertEqual(so_dir, other_tmp_dir) cmd.compiler = None @@ -296,8 +296,7 @@ cmd.run() so_file = cmd.get_outputs()[0] self.assertTrue(os.path.exists(so_file)) - self.assertEqual(os.path.splitext(so_file)[-1], - sysconfig.get_config_var('SO')) + self.assertEqual(so_file[len(so_file)-len(so_ext):], so_ext) so_dir = os.path.dirname(so_file) self.assertEqual(so_dir, cmd.build_lib) --- a/Lib/distutils/tests/test_build.py +++ b/Lib/distutils/tests/test_build.py @@ -20,10 +20,6 @@ # if not specified, plat_name gets the current platform self.assertEqual(cmd.plat_name, get_platform()) - # build_purelib is build + lib - wanted = os.path.join(cmd.build_base, 'lib') - self.assertEqual(cmd.build_purelib, wanted) - # build_platlib is 'build/lib.platform-x.x[-pydebug]' # examples: # build/lib.macosx-10.3-i386-2.7 @@ -34,6 +30,10 @@ wanted = os.path.join(cmd.build_base, 'lib' + plat_spec) self.assertEqual(cmd.build_platlib, wanted) + # build_purelib is build + lib + wanted = os.path.join(cmd.build_base, 'lib' + plat_spec) + self.assertEqual(cmd.build_purelib, wanted) + # by default, build_lib = build_purelib self.assertEqual(cmd.build_lib, cmd.build_purelib)