The PL/Python build on OS X is currently hardcoded to use the system Python install. If you try to override this when running configure, you get a mysterious mix-and-match build. If you want to build against your own Python build, or MacPorts or Homebrew, you can't.
This is straightforward to fix. In configure, besides checking Python include and library paths, we can also check whether it's a framework build and the right parameters for that. The attached patch does that and does the job for me. Please test it. One constraint, which is explained in the comment in src/pl/plpython/Makefile is that in Python <2.5, there is no official way to detect either framework builds or shared libpython builds, so we can't support those versions on OS X, at least without more hardcoding of things. I'd rather phase some of that out, but if someone needs to continue to use Python 2.4 or earlier on OS X, let me know. (Or more proper fix would be to split DLSUFFIX into two variables, but that seems more work than it's worth right now.)
diff --git a/config/python.m4 b/config/python.m4 index 663ccf9..af4d8d7 100644 --- a/config/python.m4 +++ b/config/python.m4 @@ -48,7 +48,6 @@ AC_MSG_RESULT([$python_includespec]) AC_SUBST(python_majorversion)[]dnl AC_SUBST(python_version)[]dnl -AC_SUBST(python_configdir)[]dnl AC_SUBST(python_includespec)[]dnl ])# _PGAC_CHECK_PYTHON_DIRS @@ -69,8 +68,14 @@ python_libdir=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(N python_ldlibrary=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('LDLIBRARY'))))"` python_so=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('SO'))))"` ldlibrary=`echo "${python_ldlibrary}" | sed "s/${python_so}$//"` +python_framework=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('PYTHONFRAMEWORK'))))"` +python_enable_shared=`${PYTHON} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_vars().get('Py_ENABLE_SHARED',0))"` -if test x"${python_libdir}" != x"" -a x"${python_ldlibrary}" != x"" -a x"${python_ldlibrary}" != x"${ldlibrary}" +if test -n "$python_framework"; then + python_frameworkprefix=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('PYTHONFRAMEWORKPREFIX'))))"` + python_libspec="-F $python_frameworkprefix -framework $python_framework" + python_enable_shared=1 +elif test x"${python_libdir}" != x"" -a x"${python_ldlibrary}" != x"" -a x"${python_ldlibrary}" != x"${ldlibrary}" then # New way: use the official shared library ldlibrary=`echo "${ldlibrary}" | sed "s/^lib//"` @@ -86,13 +91,16 @@ else python_libspec="-L${python_libdir} -lpython${python_ldversion}" fi -python_additional_libs=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('LIBS','LIBC','LIBM','BASEMODLIBS'))))"` +if test -z "$python_framework"; then + python_additional_libs=`${PYTHON} -c "import distutils.sysconfig; print(' '.join(filter(None,distutils.sysconfig.get_config_vars('LIBS','LIBC','LIBM','BASEMODLIBS'))))"` +fi AC_MSG_RESULT([${python_libspec} ${python_additional_libs}]) AC_SUBST(python_libdir)[]dnl AC_SUBST(python_libspec)[]dnl AC_SUBST(python_additional_libs)[]dnl +AC_SUBST(python_enable_shared)[]dnl # threaded python is not supported on OpenBSD AC_MSG_CHECKING(whether Python is compiled with thread support) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 9cc14da..ecfb801 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -175,11 +175,11 @@ enable_dtrace = @enable_dtrace@ enable_coverage = @enable_coverage@ enable_thread_safety = @enable_thread_safety@ +python_enable_shared = @python_enable_shared@ python_includespec = @python_includespec@ python_libdir = @python_libdir@ python_libspec = @python_libspec@ python_additional_libs = @python_additional_libs@ -python_configdir = @python_configdir@ python_majorversion = @python_majorversion@ python_version = @python_version@ diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile index afd8dea..e9b5e3c 100644 --- a/src/pl/plpython/Makefile +++ b/src/pl/plpython/Makefile @@ -5,13 +5,20 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -# On some platforms we can only build PL/Python if libpython is a -# shared library. Since there is no official way to determine this -# (at least not in pre-2.3 Python), we see if there is a file that is -# named like a shared library. +# We need libpython as a shared library. In Python >=2.5, configure +# asks Python directly. But because this has been broken in Debian +# for a long time (http://bugs.debian.org/695979), and to support +# older Python versions, we see if there is a file that is named like +# a shared library as a fallback. (Note that this is wrong on OS X, +# where DLSUFFIX is .so, but libpython is a .dylib. Python <2.5 is +# therefore not supported on OS X.) +ifeq (1,$(python_enable_shared)) +shared_libpython = yes +else ifneq (,$(wildcard $(python_libdir)/libpython*$(DLSUFFIX)*)) shared_libpython = yes endif +endif # Windows needs to convert backslashed paths to normal slashes, # and we have to remove -lpython from the link since we are building our own @@ -21,13 +28,6 @@ python_includespec := $(subst \,/,$(python_includespec)) override python_libspec = endif -# Darwin (OS X) has its own ideas about how to do this. -ifeq ($(PORTNAME), darwin) -shared_libpython = yes -override python_libspec = -framework Python -override python_additional_libs = -endif - # If we don't have a shared library, we have to skip it. ifeq ($(shared_libpython),yes)
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers