mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-07 00:17:29 +08:00
The PL/Python build on OS X was previously hardcoded to use the system installation of Python, ignoring whatever was specified to configure. Except that it would use the header files from configure, which could lead to mismatches. It was not possible to build against a custom Python installation. Now, we check in configure how the specified Python installation was built and use that, supporting framework and non-framework builds.
209 lines
6.1 KiB
Makefile
209 lines
6.1 KiB
Makefile
# src/pl/plpython/Makefile
|
|
|
|
subdir = src/pl/plpython
|
|
top_builddir = ../../..
|
|
include $(top_builddir)/src/Makefile.global
|
|
|
|
|
|
# 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
|
|
ifeq ($(PORTNAME), win32)
|
|
shared_libpython = yes
|
|
python_includespec := $(subst \,/,$(python_includespec))
|
|
override python_libspec =
|
|
endif
|
|
|
|
# If we don't have a shared library, we have to skip it.
|
|
ifeq ($(shared_libpython),yes)
|
|
|
|
override CPPFLAGS := -I. -I$(srcdir) $(python_includespec) $(CPPFLAGS)
|
|
|
|
rpathdir = $(python_libdir)
|
|
|
|
NAME = plpython$(python_majorversion)
|
|
|
|
OBJS = \
|
|
plpy_cursorobject.o \
|
|
plpy_elog.o \
|
|
plpy_exec.o \
|
|
plpy_main.o \
|
|
plpy_planobject.o \
|
|
plpy_plpymodule.o \
|
|
plpy_procedure.o \
|
|
plpy_resultobject.o \
|
|
plpy_spi.o \
|
|
plpy_subxactobject.o \
|
|
plpy_typeio.o \
|
|
plpy_util.o
|
|
|
|
DATA = $(NAME)u.control $(NAME)u--1.0.sql $(NAME)u--unpackaged--1.0.sql
|
|
ifeq ($(python_majorversion),2)
|
|
DATA += plpythonu.control plpythonu--1.0.sql plpythonu--unpackaged--1.0.sql
|
|
endif
|
|
|
|
|
|
# Python on win32 ships with import libraries only for Microsoft Visual C++,
|
|
# which are not compatible with mingw gcc. Therefore we need to build a
|
|
# new import library to link with.
|
|
ifeq ($(PORTNAME), win32)
|
|
pytverstr=$(subst .,,${python_version})
|
|
OBJS += libpython${pytverstr}.a
|
|
libpython${pytverstr}.a: python${pytverstr}.def
|
|
dlltool --dllname python${pytverstr}.dll --def python${pytverstr}.def --output-lib libpython${pytverstr}.a
|
|
WD=$(subst \,/,$(WINDIR))
|
|
python${pytverstr}.def: $(WD)/system32/python${pytverstr}.dll
|
|
pexports $(WD)/system32/python${pytverstr}.dll > python${pytverstr}.def
|
|
endif
|
|
|
|
|
|
SHLIB_LINK = $(python_libspec) $(python_additional_libs) $(filter -lintl,$(LIBS))
|
|
|
|
REGRESS_OPTS = --dbname=$(PL_TESTDB)
|
|
# Only load plpythonu with Python 2. The test files themselves load
|
|
# the versioned language plpython(2|3)u.
|
|
ifeq ($(python_majorversion),2)
|
|
REGRESS_OPTS += --load-extension=plpythonu
|
|
endif
|
|
|
|
REGRESS = \
|
|
plpython_schema \
|
|
plpython_populate \
|
|
plpython_test \
|
|
plpython_do \
|
|
plpython_global \
|
|
plpython_import \
|
|
plpython_spi \
|
|
plpython_newline \
|
|
plpython_void \
|
|
plpython_params \
|
|
plpython_setof \
|
|
plpython_record \
|
|
plpython_trigger \
|
|
plpython_types \
|
|
plpython_error \
|
|
plpython_unicode \
|
|
plpython_quote \
|
|
plpython_composite \
|
|
plpython_subtransaction \
|
|
plpython_drop
|
|
|
|
REGRESS_PLPYTHON3_MANGLE := $(REGRESS)
|
|
|
|
# where to find psql for running the tests
|
|
PSQLDIR = $(bindir)
|
|
|
|
include $(top_srcdir)/src/Makefile.shlib
|
|
|
|
all: all-lib
|
|
|
|
|
|
install: all install-lib install-data
|
|
|
|
installdirs: installdirs-lib
|
|
$(MKDIR_P) '$(DESTDIR)$(datadir)/extension'
|
|
|
|
uninstall: uninstall-lib uninstall-data
|
|
|
|
install-data: installdirs
|
|
$(INSTALL_DATA) $(addprefix $(srcdir)/, $(DATA)) '$(DESTDIR)$(datadir)/extension/'
|
|
|
|
uninstall-data:
|
|
rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA)))
|
|
|
|
.PHONY: install-data uninstall-data
|
|
|
|
|
|
ifeq ($(python_majorversion),3)
|
|
# Adjust regression tests for Python 3 compatibility
|
|
#
|
|
# Mention those regression test files that need to be mangled in the
|
|
# variable REGRESS_PLPYTHON3_MANGLE. They will be copied to a
|
|
# subdirectory python3/ and have their Python syntax and other bits
|
|
# adjusted to work with Python 3.
|
|
|
|
# Note that the order of the tests needs to be preserved in this
|
|
# expression.
|
|
REGRESS := $(foreach test,$(REGRESS),$(if $(filter $(test),$(REGRESS_PLPYTHON3_MANGLE)),python3/$(test),$(test)))
|
|
|
|
.PHONY: pgregress-python3-mangle
|
|
pgregress-python3-mangle:
|
|
$(MKDIR_P) sql/python3 expected/python3 results/python3
|
|
for file in $(patsubst %,$(srcdir)/sql/%.sql,$(REGRESS_PLPYTHON3_MANGLE)) $(patsubst %,$(srcdir)/expected/%*.out,$(REGRESS_PLPYTHON3_MANGLE)); do \
|
|
sed -e 's/except \([[:alpha:]][[:alpha:].]*\), *\([[:alpha:]][[:alpha:]]*\):/except \1 as \2:/g' \
|
|
-e "s/<type 'exceptions\.\([[:alpha:]]*\)'>/<class '\1'>/g" \
|
|
-e "s/<type 'long'>/<class 'int'>/g" \
|
|
-e "s/\([0-9][0-9]*\)L/\1/g" \
|
|
-e 's/\([ [{]\)u"/\1"/g' \
|
|
-e "s/\([ [{]\)u'/\1'/g" \
|
|
-e "s/def next/def __next__/g" \
|
|
-e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \
|
|
-e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \
|
|
-e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \
|
|
-e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \
|
|
$$file >`echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \
|
|
done
|
|
|
|
check installcheck: pgregress-python3-mangle
|
|
|
|
pg_regress_clean_files += sql/python3/ expected/python3/ results/python3/
|
|
|
|
endif # Python 3
|
|
|
|
|
|
check: all submake
|
|
$(pg_regress_check) $(REGRESS_OPTS) $(REGRESS)
|
|
|
|
installcheck: submake
|
|
$(pg_regress_installcheck) $(REGRESS_OPTS) $(REGRESS)
|
|
|
|
|
|
.PHONY: submake
|
|
submake:
|
|
$(MAKE) -C $(top_builddir)/src/test/regress pg_regress$(X)
|
|
|
|
clean distclean: clean-lib
|
|
rm -f $(OBJS)
|
|
rm -rf $(pg_regress_clean_files)
|
|
ifeq ($(PORTNAME), win32)
|
|
rm -f python${pytverstr}.def
|
|
endif
|
|
|
|
else # can't build
|
|
|
|
all:
|
|
@echo ""; \
|
|
echo "*** Cannot build PL/Python because libpython is not a shared library." ; \
|
|
echo "*** You might have to rebuild your Python installation. Refer to"; \
|
|
echo "*** the documentation for details."; \
|
|
echo ""
|
|
|
|
endif # can't build
|
|
|
|
# distprep and maintainer-clean rules should be run even if we can't build.
|
|
|
|
# Force this dependency to be known even without dependency info built:
|
|
plpy_plpymodule.o: spiexceptions.h
|
|
|
|
spiexceptions.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-spiexceptions.pl
|
|
$(PERL) $(srcdir)/generate-spiexceptions.pl $< > $@
|
|
|
|
distprep: spiexceptions.h
|
|
|
|
maintainer-clean: distclean
|
|
rm -f spiexceptions.h
|