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