python3: Centralize config file adjustments in Build/Install
[feed/packages.git] / lang / python / python3 / Makefile
index 7fbc84aa10aa96297280cdecfcbbb8d6912a2d8d..6e364e45eadbc733b0df9e8f39a5f0e9be5310f9 100644 (file)
@@ -16,7 +16,7 @@ PKG_VERSION:=$(PYTHON3_VERSION).$(PYTHON3_VERSION_MICRO)
 
 PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://www.python.org/ftp/python/$(PKG_VERSION)
-PKG_HASH:=8437efd5b106ef0a75aabfbf23d880625120a73a86a22ade4d2e2e68d7b74486
+PKG_HASH:=2f0e409df2ab57aa9fc4cbddfb976af44e4e55bf6f619eee6bc5c2297264a7f6
 
 PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
 PKG_LICENSE:=PSF-2.0
@@ -31,18 +31,16 @@ PYTHON3_PKG_BUILD:=0
 include ../python3-package.mk
 
 PKG_FIXUP:=autoreconf
-PKG_INSTALL:=1
 PKG_BUILD_PARALLEL:=1
 HOST_BUILD_PARALLEL:=1
+# LTO is handled here individually, see --with-lto below
+# "no-lto" prevents CONFIG_USE_LTO to add additional and interfering flags
+PKG_BUILD_FLAGS:=no-lto
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/Python-$(PKG_VERSION)
 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/Python-$(PKG_VERSION)
 
-PKG_CONFIG_DEPENDS:= \
-       CONFIG_PACKAGE_python3-pkg-resources \
-       CONFIG_PACKAGE_python3-setuptools CONFIG_PACKAGE_python3-pip
-
-PKG_BUILD_DEPENDS:=bluez python3/host
+PKG_BUILD_DEPENDS:=bluez python3/host python-build/host python-installer/host python-wheel/host
 HOST_BUILD_DEPENDS:=bzip2/host libffi/host
 
 include $(INCLUDE_DIR)/host-build.mk
@@ -52,45 +50,53 @@ define Package/python3/Default
   SUBMENU:=Python
   SECTION:=lang
   CATEGORY:=Languages
-  TITLE:=Python $(PYTHON3_VERSION) programming language
+  TITLE:=Python $(PYTHON3_VERSION)
   URL:=https://www.python.org/
 endef
 
 define Package/python3/Default/description
- Python is a dynamic object-oriented programming language that can be used
- for many kinds of software development. It offers strong support for
- integration with other languages and tools, comes with extensive standard
- libraries, and can be learned in a few days. Many Python programmers
- report substantial productivity gains and feel the language encourages
- the development of higher quality, more maintainable code.
+Python is an interpreted, interactive, object-oriented programming
+language. It incorporates modules, exceptions, dynamic typing, very high
+level dynamic data types, and classes. It supports multiple programming
+paradigms beyond object-oriented programming, such as procedural and
+functional programming. Python combines remarkable power with very clear
+syntax. It has interfaces to many system calls and libraries, as well as
+to various window systems, and is extensible in C or C++. It is also
+usable as an extension language for applications that need a
+programmable interface. Finally, Python is portable: it runs on many
+Unix variants including Linux and macOS, and on Windows.
 endef
 
 define Package/libpython3
 $(call Package/python3/Default)
-  TITLE:=Python $(PYTHON3_VERSION) core library
-  DEPENDS:=+libpthread +zlib
+  TITLE+= core library
+  DEPENDS:=+libpthread
   ABI_VERSION:=$(PYTHON3_VERSION)
 endef
 
 define Package/libpython3/description
-  This package contains only core Python library.
+$(call Package/python3/Default/description)
+
+This package contains only core Python library.
 endef
 
 define Package/python3-base
 $(call Package/python3/Default)
-  TITLE:=Python $(PYTHON3_VERSION) interpreter
-  DEPENDS:=+libpthread +zlib +libpython3
+  TITLE+= base interpreter
+  DEPENDS:=+libpython3
 endef
 
 define Package/python3-base/description
-  This package contains only the interpreter and the bare minimum
-  for the interpreter to start.
+$(call Package/python3/Default/description)
+
+This package contains only the interpreter and the bare minimum for the
+interpreter to start.
 endef
 
 define Package/python3-light
 $(call Package/python3/Default)
-  TITLE:=Python $(PYTHON3_VERSION) light installation
-  DEPENDS:=+python3-base +libffi +libbz2
+  TITLE+= light installation
+  DEPENDS:=+python3-base +libbz2 +zlib
 endef
 
 define Package/python3-light/config
@@ -98,9 +104,10 @@ define Package/python3-light/config
 endef
 
 define Package/python3-light/description
-  This package is essentially the python3-base package plus
-  a few of the rarely used (and big) libraries stripped out
-  into separate packages.
+$(call Package/python3/Default/description)
+
+This package installs the base interpreter package and contains the most
+commonly used parts of the standard library.
 endef
 
 PYTHON3_LIB_FILES_DEL:=
@@ -113,13 +120,15 @@ define Py3BasePackage
     PYTHON3_PACKAGES_DEPENDS+=$(1)
   endif
   PYTHON3_LIB_FILES_DEL+=$(2)
-  define Py3Package/$(1)/filespec
-    ifneq ($(2),)
-      $(subst $(space),$(newline),$(foreach lib_file,$(2),+|$(lib_file)))
-      -|/usr/lib/python$(PYTHON3_VERSION)/*/test
-      -|/usr/lib/python$(PYTHON3_VERSION)/*/tests
-    endif
-  endef
+  ifeq ($(2),)
+    Py3Package/$(1)/filespec=
+  else
+    define Py3Package/$(1)/filespec
+      $(foreach lib_file,$(2),
+        +|$(lib_file)
+      )
+    endef
+  endif
   Py3Package/$(1)/install?=:
 endef
 
@@ -127,18 +136,43 @@ include ./files/python3-package-*.mk
 
 define Package/python3
 $(call Package/python3/Default)
+  TITLE+= programming language
   DEPENDS:=+python3-light $(foreach package,$(PYTHON3_PACKAGES_DEPENDS),+$(package))
 endef
 
 define Package/python3/description
-  This package contains the (almost) full Python install.
-  It's python3-light + all other packages.
+$(call Package/python3/Default/description)
+
+This package installs almost all parts of the standard Python
+installation.
 endef
 
+# Set READELF here so that the exact same readelf program name can be
+# replaced in _sysconfigdata.py (in Build/Install)
+TARGET_CONFIGURE_OPTS+= \
+       READELF="$(TARGET_CROSS)readelf"
+
 EXTRA_LDFLAGS+= \
        -L$(PKG_BUILD_DIR) \
        -L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib
 
+# Bypass configure tests for cross compilation
+CONFIGURE_VARS += \
+       ac_cv_buggy_getaddrinfo=no \
+       ac_cv_file__dev_ptc=no \
+       ac_cv_file__dev_ptmx=yes
+
+# Do not link with libbsd for flock
+# https://github.com/openwrt/packages/issues/21161
+CONFIGURE_VARS += \
+       ac_cv_lib_bsd_flock=no
+
+# Disable stdlib modules
+# Check for a better way in the future: https://github.com/python/cpython/issues/98558
+CONFIGURE_VARS += \
+       py_cv_module__tkinter=n/a \
+       py_cv_module_nis=n/a
+
 # Workaround for hardfloat mips
 # https://bugs.python.org/issue46265
 ifneq ($(findstring mips,$(CONFIG_ARCH)),)
@@ -151,73 +185,23 @@ endif
 MAKE_VARS += \
        PYTHONSTRICTEXTENSIONBUILD=1
 
-CONFIGURE_ARGS+= \
+CONFIGURE_ARGS += \
        --enable-optimizations \
        --enable-shared \
+       --disable-test-modules \
+       --with-build-python \
        --with-system-ffi \
        --without-cxx-main \
        --without-ensurepip \
-       --without-pymalloc \
-       --disable-test-modules \
        $(if $(CONFIG_IPV6),--enable-ipv6) \
-       $(if $(findstring mips,$(CONFIG_ARCH)),,--with-lto) \
-       CONFIG_SITE="$(PKG_BUILD_DIR)/config.site" \
-       OPT="$(TARGET_CFLAGS)"
-
-define Build/Prepare
-       $(call Build/Prepare/Default)
-       $(CP) ./files/config.site $(PKG_BUILD_DIR)/config.site
-endef
-
-ifdef CONFIG_PACKAGE_python3-setuptools
-PYTHON3_SETUPTOOLS_BUILD:=1
-endif
-
-ifdef CONFIG_PACKAGE_python3-pkg-resources
-PYTHON3_SETUPTOOLS_BUILD:=1
-endif
+       $(if $(findstring mips,$(CONFIG_ARCH)),,--with-lto)
 
-ifeq ($(PYTHON3_SETUPTOOLS_BUILD),1)
-define Build/Compile/python3-setuptools
-       $(HOST_PYTHON3_PIP) \
-               --disable-pip-version-check \
-               --cache-dir "$(DL_DIR)/pip-cache" \
-               install \
-               --ignore-installed \
-               --root=$(PKG_BUILD_DIR)/install-setuptools \
-               --prefix=/usr \
-               $(PKG_BUILD_DIR)/Lib/ensurepip/_bundled/setuptools-$(PYTHON3_SETUPTOOLS_VERSION)-py3-none-any.whl
-       $(call PatchDir,$(PKG_BUILD_DIR)/install-setuptools/usr/lib/python$(PYTHON3_VERSION)/site-packages,./patches-setuptools,)
-endef
-else
-define Build/Compile/python3-setuptools
-       ls $(PKG_BUILD_DIR)/Lib/ensurepip/_bundled/setuptools-$(PYTHON3_SETUPTOOLS_VERSION)-py3-none-any.whl
-endef
-endif # CONFIG_PACKAGE_python3-setuptools
-
-ifdef CONFIG_PACKAGE_python3-pip
-define Build/Compile/python3-pip
-       $(HOST_PYTHON3_PIP) \
-               --disable-pip-version-check \
-               --cache-dir "$(DL_DIR)/pip-cache" \
-               install \
-               --ignore-installed \
-               --root=$(PKG_BUILD_DIR)/install-pip \
-               --prefix=/usr \
-               $(PKG_BUILD_DIR)/Lib/ensurepip/_bundled/pip-$(PYTHON3_PIP_VERSION)-py3-none-any.whl
-       $(call PatchDir,$(PKG_BUILD_DIR)/install-pip/usr/lib/python$(PYTHON3_VERSION)/site-packages,./patches-pip,)
-endef
-else
-define Build/Compile/python3-pip
-       ls $(PKG_BUILD_DIR)/Lib/ensurepip/_bundled/pip-$(PYTHON3_PIP_VERSION)-py3-none-any.whl
-endef
-endif # CONFIG_PACKAGE_python3-pip
+define Build/Install
+       $(call Build/Install/Default,)
 
-define Build/Compile
-       $(call Build/Compile/Default)
-       # Use host pip to install python-setuptools
-       $(call Build/Compile/python3-setuptools)
-       $(call Build/Compile/python3-pip)
+       $(SED) 's|$(TARGET_AR)|ar|g;s|$(TARGET_CROSS)readelf|readelf|g;s|$(TARGET_CC)|gcc|g;s|$(TARGET_CXX)|g++|g' \
+               $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON3_VERSION)/_sysconfigdata.py \
+               $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON3_VERSION)/config-$(PYTHON3_VERSION)/Makefile
 endef
 
 define Build/InstallDev
@@ -265,25 +249,22 @@ PYTHON3_LIB_FILES_DEL+=$(PYTHON3_BASE_LIB_FILES)
 
 define Py3Package/python3-base/filespec
 +|/usr/bin/python$(PYTHON3_VERSION)
-$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_BASE_LIB_FILES),+|$(lib_file)))
+$(foreach lib_file,$(PYTHON3_BASE_LIB_FILES),
+  +|$(lib_file)
+)
 endef
 
 define Py3Package/python3-light/filespec
 +|/usr/lib/python$(PYTHON3_VERSION)
 -|/usr/lib/python$(PYTHON3_VERSION)/distutils/cygwinccompiler.py
--|/usr/lib/python$(PYTHON3_VERSION)/distutils/command/wininst*
--|/usr/lib/python$(PYTHON3_VERSION)/ensurepip
 -|/usr/lib/python$(PYTHON3_VERSION)/idlelib
 -|/usr/lib/python$(PYTHON3_VERSION)/tkinter
 -|/usr/lib/python$(PYTHON3_VERSION)/turtledemo
--|/usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_test*.so
--|/usr/lib/python$(PYTHON3_VERSION)/pdb.doc
--|/usr/lib/python$(PYTHON3_VERSION)/test
 -|/usr/lib/python$(PYTHON3_VERSION)/webbrowser.py
--|/usr/lib/python$(PYTHON3_VERSION)/*/test
--|/usr/lib/python$(PYTHON3_VERSION)/*/tests
 -|/usr/lib/python$(PYTHON3_VERSION)/_osx_support.py
-$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_LIB_FILES_DEL),-|$(lib_file)))
+$(foreach lib_file,$(filter /usr/lib/python$(PYTHON3_VERSION)/%,$(PYTHON3_LIB_FILES_DEL)),
+  -|$(lib_file)
+)
 endef
 
 define Package/libpython3/install
@@ -296,17 +277,17 @@ define Py3Package/python3-base/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(LN) python$(PYTHON3_VERSION) $(1)/usr/bin/python3
        $(LN) python$(PYTHON3_VERSION) $(1)/usr/bin/python
-  # This depends on being called before filespec is processed
-       $(SED) 's|$(TARGET_AR)|ar|g;s|$(TARGET_CROSS)readelf|readelf|g;s|$(TARGET_CC)|gcc|g;s|$(TARGET_CXX)|g++|g' \
-               $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON3_VERSION)/_sysconfigdata.py
 endef
 
 Py3Package/python3-light/install:=:
-Py3Package/python3/install:=:
+Package/python3/install:=:
 
-define Py3Package/python3/filespec
--|$(PYTHON3_PKG_DIR)
-endef
+# libuuid is provided by e2fsprogs and uuid/uuid.h is moved into
+# $(STAGING_DIR_HOST)/include/e2fsprogs
+HOST_CFLAGS += \
+       -I$(STAGING_DIR_HOST)/include/e2fsprogs
+HOST_CPPFLAGS += \
+       -I$(STAGING_DIR_HOST)/include/e2fsprogs
 
 HOST_LDFLAGS += \
        -Wl$(comma)-rpath$(comma)$(STAGING_DIR_HOSTPKG)/lib
@@ -320,6 +301,10 @@ endif
 # HOST_MAKE_VARS += \
 #      PYTHONSTRICTEXTENSIONBUILD=1
 
+# Bypass configure test
+HOST_CONFIGURE_VARS += \
+       ac_cv_working_openssl_hashlib=yes
+
 ifeq ($(HOST_OS),Darwin)
 HOST_CONFIGURE_VARS += \
        ac_cv_header_libintl_h=no
@@ -327,28 +312,19 @@ HOST_MAKE_VARS += \
        USE_PYTHON_CONFIG_PY=1
 endif
 
-# FIXME: remove when removing patch '028-host-python-support-ssl-with-libressl.patch'
-HOST_CFLAGS += \
-       -DOPENWRT_HOST_BUILD
-
-HOST_CONFIGURE_ARGS+= \
+HOST_CONFIGURE_ARGS += \
        --enable-optimizations \
+       --disable-test-modules \
        --with-ensurepip=upgrade \
-       --with-system-expat=$(STAGING_DIR_HOSTPKG) \
        --with-ssl-default-suites=openssl \
-       --without-cxx-main \
-       --without-pymalloc \
-       --disable-test-modules \
-       CONFIG_SITE=
+       --with-system-expat \
+       --without-cxx-main
 
 define Host/Configure
        $(SED) 's/^ENABLE_USER_SITE = None$$$$/ENABLE_USER_SITE = False/' $(HOST_BUILD_DIR)/Lib/site.py
        $(call Host/Configure/Default)
-endef
-
-define Host/Compile
-       $(call Host/Compile/Default,python)
-       $(call Host/Compile/Default,sharedmods)
+       ls $(HOST_BUILD_DIR)/Lib/ensurepip/_bundled/setuptools-$(PYTHON3_SETUPTOOLS_VERSION)-py3-none-any.whl
+       ls $(HOST_BUILD_DIR)/Lib/ensurepip/_bundled/pip-$(PYTHON3_PIP_VERSION)-py3-none-any.whl
 endef
 
 define Host/Install
@@ -369,11 +345,11 @@ define Host/Install
        )
        $(call Host/Install/Default)
        $(if $(wildcard $(HOST_PYTHON3_PKG_DIR)/.setuptools_installed_$(PYTHON3_SETUPTOOLS_VERSION)-$(PYTHON3_SETUPTOOLS_PKG_RELEASE)),,
-               $(call HostPatchDir,$(HOST_PYTHON3_PKG_DIR),./patches-setuptools,)
+               $(call HostPatchDir,$(HOST_PYTHON3_PKG_DIR),./patches-host-setuptools,)
                touch $(HOST_PYTHON3_PKG_DIR)/.setuptools_installed_$(PYTHON3_SETUPTOOLS_VERSION)-$(PYTHON3_SETUPTOOLS_PKG_RELEASE)
        )
        $(if $(wildcard $(HOST_PYTHON3_PKG_DIR)/.pip_installed_$(PYTHON3_PIP_VERSION)-$(PYTHON3_PIP_PKG_RELEASE)),,
-               $(call HostPatchDir,$(HOST_PYTHON3_PKG_DIR),./patches-pip,)
+               $(call HostPatchDir,$(HOST_PYTHON3_PKG_DIR),./patches-host-pip,)
                touch $(HOST_PYTHON3_PKG_DIR)/.pip_installed_$(PYTHON3_PIP_VERSION)-$(PYTHON3_PIP_PKG_RELEASE)
        )
 endef
@@ -387,14 +363,13 @@ $(foreach package, $(PYTHON3_PACKAGES),  \
 )
 
 $(eval $(call BuildPackage,libpython3))
+$(eval $(call BuildPackage,python3))
 
 $(eval $(call Py3Package,python3-base))
 $(eval $(call Py3Package,python3-light))
-$(eval $(call Py3Package,python3))
 
 $(eval $(call BuildPackage,python3-base))
 $(eval $(call BuildPackage,python3-light))
-$(eval $(call BuildPackage,python3))
 
 $(eval $(call BuildPackage,python3-base-src))
 $(eval $(call BuildPackage,python3-light-src))