1################################################################################ 2# 3# python3 4# 5################################################################################ 6 7PYTHON3_VERSION_MAJOR = 3.11 8PYTHON3_VERSION = $(PYTHON3_VERSION_MAJOR).8 9PYTHON3_SOURCE = Python-$(PYTHON3_VERSION).tar.xz 10PYTHON3_SITE = https://python.org/ftp/python/$(PYTHON3_VERSION) 11PYTHON3_LICENSE = Python-2.0, others 12PYTHON3_LICENSE_FILES = LICENSE 13PYTHON3_CPE_ID_VENDOR = python 14PYTHON3_CPE_ID_PRODUCT = python 15 16# This host Python is installed in $(HOST_DIR), as it is needed when 17# cross-compiling third-party Python modules. 18 19HOST_PYTHON3_CONF_OPTS += \ 20 --without-ensurepip \ 21 --without-cxx-main \ 22 --disable-sqlite3 \ 23 --disable-tk \ 24 --with-expat=system \ 25 --disable-codecs-cjk \ 26 --disable-nis \ 27 --enable-unicodedata \ 28 --disable-test-modules \ 29 --disable-idle3 \ 30 --disable-uuid \ 31 --disable-ossaudiodev 32 33# Make sure that LD_LIBRARY_PATH overrides -rpath. 34# This is needed because libpython may be installed at the same time that 35# python is called. 36# Make python believe we don't have 'hg', so that it doesn't try to 37# communicate over the network during the build. 38HOST_PYTHON3_CONF_ENV += \ 39 LDFLAGS="$(HOST_LDFLAGS) -Wl,--enable-new-dtags" \ 40 ac_cv_prog_HAS_HG=/bin/false 41 42PYTHON3_DEPENDENCIES = host-python3 libffi 43 44HOST_PYTHON3_DEPENDENCIES = \ 45 host-autoconf-archive \ 46 host-expat \ 47 host-libffi \ 48 host-pkgconf \ 49 host-zlib 50 51ifeq ($(BR2_PACKAGE_HOST_PYTHON3_BZIP2),y) 52HOST_PYTHON3_DEPENDENCIES += host-bzip2 53else 54HOST_PYTHON3_CONF_OPTS += --disable-bzip2 55endif 56 57ifeq ($(BR2_PACKAGE_HOST_PYTHON3_CURSES),y) 58HOST_PYTHON3_DEPENDENCIES += host-ncurses 59else 60HOST_PYTHON3_CONF_OPTS += --disable-curses 61endif 62 63ifeq ($(BR2_PACKAGE_HOST_PYTHON3_SSL),y) 64HOST_PYTHON3_DEPENDENCIES += host-openssl 65else 66HOST_PYTHON3_CONF_OPTS += --disable-openssl 67endif 68 69PYTHON3_INSTALL_STAGING = YES 70 71ifeq ($(BR2_PACKAGE_PYTHON3_2TO3),y) 72PYTHON3_CONF_OPTS += --enable-lib2to3 73else 74PYTHON3_CONF_OPTS += --disable-lib2to3 75endif 76 77ifeq ($(BR2_PACKAGE_PYTHON3_BERKELEYDB),y) 78PYTHON3_DEPENDENCIES += berkeleydb 79else 80PYTHON3_CONF_OPTS += --disable-berkeleydb 81endif 82 83ifeq ($(BR2_PACKAGE_PYTHON3_READLINE),y) 84PYTHON3_DEPENDENCIES += readline 85else 86PYTHON3_CONF_OPTS += --disable-readline 87endif 88 89ifeq ($(BR2_PACKAGE_PYTHON3_CURSES),y) 90PYTHON3_DEPENDENCIES += ncurses 91else 92PYTHON3_CONF_OPTS += --disable-curses 93endif 94 95ifeq ($(BR2_PACKAGE_PYTHON3_DECIMAL),y) 96PYTHON3_DEPENDENCIES += mpdecimal 97PYTHON3_CONF_OPTS += --with-libmpdec=system 98else 99PYTHON3_CONF_OPTS += --with-libmpdec=none 100endif 101 102ifeq ($(BR2_PACKAGE_PYTHON3_PYEXPAT),y) 103PYTHON3_DEPENDENCIES += expat 104PYTHON3_CONF_OPTS += --with-expat=system 105else 106PYTHON3_CONF_OPTS += --with-expat=none 107endif 108 109ifeq ($(BR2_PACKAGE_PYTHON3_SQLITE),y) 110PYTHON3_DEPENDENCIES += sqlite 111else 112PYTHON3_CONF_OPTS += --disable-sqlite3 113endif 114 115ifeq ($(BR2_PACKAGE_PYTHON3_SSL),y) 116PYTHON3_DEPENDENCIES += openssl 117PYTHON3_CONF_OPTS += --with-openssl=$(STAGING_DIR)/usr 118else 119PYTHON3_CONF_OPTS += --disable-openssl 120endif 121 122ifneq ($(BR2_PACKAGE_PYTHON3_CODECSCJK),y) 123PYTHON3_CONF_OPTS += --disable-codecs-cjk 124endif 125 126ifneq ($(BR2_PACKAGE_PYTHON3_UNICODEDATA),y) 127PYTHON3_CONF_OPTS += --disable-unicodedata 128endif 129 130# Disable auto-detection of uuid.h (util-linux) 131# which would add _uuid module support, instead 132# default to the pure python implementation 133PYTHON3_CONF_OPTS += --disable-uuid 134 135ifeq ($(BR2_PACKAGE_PYTHON3_BZIP2),y) 136PYTHON3_DEPENDENCIES += bzip2 137else 138PYTHON3_CONF_OPTS += --disable-bzip2 139endif 140 141ifeq ($(BR2_PACKAGE_PYTHON3_XZ),y) 142PYTHON3_DEPENDENCIES += xz 143else 144PYTHON3_CONF_OPTS += --disable-xz 145endif 146 147ifeq ($(BR2_PACKAGE_PYTHON3_ZLIB),y) 148PYTHON3_DEPENDENCIES += zlib 149else 150PYTHON3_CONF_OPTS += --disable-zlib 151endif 152 153ifeq ($(BR2_PACKAGE_PYTHON3_OSSAUDIODEV),y) 154PYTHON3_CONF_OPTS += --enable-ossaudiodev 155else 156PYTHON3_CONF_OPTS += --disable-ossaudiodev 157endif 158 159# Make python believe we don't have 'hg', so that it doesn't try to 160# communicate over the network during the build. 161PYTHON3_CONF_ENV += \ 162 ac_cv_have_long_long_format=yes \ 163 ac_cv_file__dev_ptmx=yes \ 164 ac_cv_file__dev_ptc=yes \ 165 ac_cv_working_tzset=yes \ 166 ac_cv_prog_HAS_HG=/bin/false 167 168# GCC is always compliant with IEEE754 169ifeq ($(BR2_ENDIAN),"LITTLE") 170PYTHON3_CONF_ENV += ac_cv_little_endian_double=yes 171else 172PYTHON3_CONF_ENV += ac_cv_big_endian_double=yes 173endif 174 175# uClibc is known to have a broken wcsftime() implementation, so tell 176# Python 3 to fall back to strftime() instead. 177ifeq ($(BR2_TOOLCHAIN_USES_UCLIBC),y) 178PYTHON3_CONF_ENV += ac_cv_func_wcsftime=no 179endif 180 181ifeq ($(BR2_PACKAGE_GETTEXT_PROVIDES_LIBINTL),y) 182PYTHON3_DEPENDENCIES += gettext 183endif 184 185PYTHON3_CONF_OPTS += \ 186 --without-ensurepip \ 187 --without-cxx-main \ 188 --with-build-python=$(HOST_DIR)/bin/python3 \ 189 --with-system-ffi \ 190 --disable-pydoc \ 191 --disable-test-modules \ 192 --disable-tk \ 193 --disable-nis \ 194 --disable-idle3 \ 195 --disable-pyc-build 196 197# 198# Remove useless files. In the config/ directory, only the Makefile 199# and the pyconfig.h files are needed at runtime. 200# 201define PYTHON3_REMOVE_USELESS_FILES 202 rm -f $(TARGET_DIR)/usr/bin/python$(PYTHON3_VERSION_MAJOR)-config 203 rm -f $(TARGET_DIR)/usr/bin/python$(PYTHON3_VERSION_MAJOR)m-config 204 rm -f $(TARGET_DIR)/usr/bin/python3-config 205 rm -f $(TARGET_DIR)/usr/bin/smtpd.py.3 206 rm -f $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/distutils/command/wininst*.exe 207 for i in `find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/config-$(PYTHON3_VERSION_MAJOR)*/ \ 208 -type f -not -name Makefile` ; do \ 209 rm -f $$i ; \ 210 done 211 rm -rf $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/__pycache__/ 212 rm -rf $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/lib-dynload/sysconfigdata/__pycache__ 213 rm -rf $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/collections/__pycache__ 214 rm -rf $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/importlib/__pycache__ 215endef 216 217PYTHON3_POST_INSTALL_TARGET_HOOKS += PYTHON3_REMOVE_USELESS_FILES 218 219# 220# Make sure libpython gets stripped out on target 221# 222define PYTHON3_ENSURE_LIBPYTHON_STRIPPED 223 chmod u+w $(TARGET_DIR)/usr/lib/libpython$(PYTHON3_VERSION_MAJOR)*.so 224endef 225 226PYTHON3_POST_INSTALL_TARGET_HOOKS += PYTHON3_ENSURE_LIBPYTHON_STRIPPED 227 228PYTHON3_AUTORECONF = YES 229PYTHON3_AUTORECONF_OPTS = --include=$(HOST_DIR)/share/autoconf-archive 230 231define PYTHON3_INSTALL_SYMLINK 232 ln -fs python3 $(TARGET_DIR)/usr/bin/python 233endef 234 235PYTHON3_POST_INSTALL_TARGET_HOOKS += PYTHON3_INSTALL_SYMLINK 236 237define HOST_PYTHON3_INSTALL_SYMLINK 238 ln -fs python3 $(HOST_DIR)/bin/python 239 ln -fs python3-config $(HOST_DIR)/bin/python-config 240endef 241 242HOST_PYTHON3_POST_INSTALL_HOOKS += HOST_PYTHON3_INSTALL_SYMLINK 243 244# Provided to other packages 245PYTHON3_PATH = $(STAGING_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/ 246 247# Support for socket.AF_BLUETOOTH 248ifeq ($(BR2_PACKAGE_BLUEZ5_UTILS_HEADERS),y) 249PYTHON3_DEPENDENCIES += bluez5_utils-headers 250endif 251 252$(eval $(autotools-package)) 253$(eval $(host-autotools-package)) 254 255ifeq ($(BR2_REPRODUCIBLE),y) 256define PYTHON3_FIX_TIME 257 find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) -name '*.py' -print0 | \ 258 xargs -0 --no-run-if-empty touch -d @$(SOURCE_DATE_EPOCH) 259endef 260endif 261 262define PYTHON3_CREATE_PYC_FILES 263 $(PYTHON3_FIX_TIME) 264 PYTHONPATH="$(PYTHON3_PATH)" \ 265 $(HOST_DIR)/bin/python$(PYTHON3_VERSION_MAJOR) \ 266 $(PYTHON3_DIR)/Lib/compileall.py \ 267 $(if $(VERBOSE),,-q) \ 268 $(if $(BR2_PACKAGE_PYTHON3_PYC_ONLY),-b) \ 269 -s $(TARGET_DIR) \ 270 -p / \ 271 $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) 272endef 273 274ifeq ($(BR2_PACKAGE_PYTHON3_PYC_ONLY)$(BR2_PACKAGE_PYTHON3_PY_PYC),y) 275PYTHON3_TARGET_FINALIZE_HOOKS += PYTHON3_CREATE_PYC_FILES 276endif 277 278ifeq ($(BR2_PACKAGE_PYTHON3_PYC_ONLY),y) 279define PYTHON3_REMOVE_PY_FILES 280 find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) -name '*.py' \ 281 $(if $(strip $(KEEP_PYTHON_PY_FILES)),-not \( $(call finddirclauses,$(TARGET_DIR),$(KEEP_PYTHON_PY_FILES)) \) ) \ 282 -print0 | \ 283 xargs -0 --no-run-if-empty rm -f 284endef 285PYTHON3_TARGET_FINALIZE_HOOKS += PYTHON3_REMOVE_PY_FILES 286endif 287 288# Normally, *.pyc files should not have been compiled, but just in 289# case, we make sure we remove all of them. 290ifeq ($(BR2_PACKAGE_PYTHON3_PY_ONLY),y) 291define PYTHON3_REMOVE_PYC_FILES 292 find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) -name '*.pyc' -print0 | \ 293 xargs -0 --no-run-if-empty rm -f 294endef 295PYTHON3_TARGET_FINALIZE_HOOKS += PYTHON3_REMOVE_PYC_FILES 296endif 297 298# In all cases, we don't want to keep the optimized .opt-1.pyc and 299# .opt-2.pyc files, since they can't work without their non-optimized 300# variant. 301define PYTHON3_REMOVE_OPTIMIZED_PYC_FILES 302 find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR) -name '*.opt-1.pyc' -print0 -o -name '*.opt-2.pyc' -print0 | \ 303 xargs -0 --no-run-if-empty rm -f 304endef 305PYTHON3_TARGET_FINALIZE_HOOKS += PYTHON3_REMOVE_OPTIMIZED_PYC_FILES 306