1################################################################################
2#
3# php
4#
5################################################################################
6
7PHP_VERSION = 8.3.7
8PHP_SITE = https://www.php.net/distributions
9PHP_SOURCE = php-$(PHP_VERSION).tar.xz
10PHP_INSTALL_STAGING = YES
11PHP_INSTALL_STAGING_OPTS = INSTALL_ROOT=$(STAGING_DIR) install
12PHP_INSTALL_TARGET_OPTS = INSTALL_ROOT=$(TARGET_DIR) install
13PHP_DEPENDENCIES = host-pkgconf pcre2
14PHP_LICENSE = PHP-3.01
15PHP_LICENSE_FILES = LICENSE
16PHP_CPE_ID_VENDOR = php
17
18PHP_CONF_OPTS = \
19	--mandir=/usr/share/man \
20	--infodir=/usr/share/info \
21	--with-config-file-scan-dir=/etc/php.d \
22	--disable-all \
23	--with-external-pcre \
24	--without-pear \
25	--with-config-file-path=/etc \
26	--disable-phpdbg \
27	--disable-rpath
28PHP_CONF_ENV = \
29	EXTRA_LIBS="$(PHP_EXTRA_LIBS)"
30
31ifeq ($(BR2_STATIC_LIBS),y)
32PHP_CONF_ENV += LIBS="$(PHP_STATIC_LIBS)"
33endif
34
35ifeq ($(BR2_STATIC_LIBS)$(BR2_TOOLCHAIN_HAS_THREADS),yy)
36PHP_STATIC_LIBS += -lpthread
37endif
38
39ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y)
40PHP_EXTRA_LIBS += -latomic
41endif
42
43ifeq ($(BR2_PACKAGE_LIBUCONTEXT),y)
44PHP_DEPENDENCIES += libucontext
45PHP_EXTRA_LIBS += -lucontext
46endif
47
48ifeq ($(call qstrip,$(BR2_TARGET_LOCALTIME)),)
49PHP_LOCALTIME = UTC
50else
51# Not q-stripping this value, as we need quotes in the php.ini file
52PHP_LOCALTIME = $(BR2_TARGET_LOCALTIME)
53endif
54
55# PHP can't be AUTORECONFed the standard way unfortunately
56PHP_DEPENDENCIES += host-autoconf host-automake host-libtool
57define PHP_BUILDCONF
58	cd $(@D) ; $(TARGET_MAKE_ENV) ./buildconf --force
59endef
60PHP_PRE_CONFIGURE_HOOKS += PHP_BUILDCONF
61
62ifeq ($(BR2_ENDIAN),"BIG")
63PHP_CONF_ENV += ac_cv_c_bigendian_php=yes
64else
65PHP_CONF_ENV += ac_cv_c_bigendian_php=no
66endif
67PHP_CONFIG_SCRIPTS = php-config
68
69PHP_CFLAGS = $(TARGET_CFLAGS)
70PHP_CXXFLAGS = $(TARGET_CXXFLAGS)
71
72# The OPcache extension isn't cross-compile friendly
73# Throw some defines here to avoid patching heavily
74ifeq ($(BR2_PACKAGE_PHP_EXT_OPCACHE),y)
75PHP_CONF_OPTS += --enable-opcache --disable-opcache-jit
76PHP_CONF_ENV += ac_cv_func_mprotect=yes
77PHP_CFLAGS += \
78	-DHAVE_SHM_IPC \
79	-DHAVE_SHM_MMAP_ANON \
80	-DHAVE_SHM_MMAP_ZERO \
81	-DHAVE_SHM_MMAP_POSIX \
82	-DHAVE_SHM_MMAP_FILE
83endif
84
85# We need to force dl "detection"
86ifeq ($(BR2_STATIC_LIBS),)
87PHP_CONF_ENV += ac_cv_func_dlopen=yes ac_cv_lib_dl_dlopen=yes
88PHP_EXTRA_LIBS += -ldl
89else
90PHP_CONF_ENV += ac_cv_func_dlopen=no ac_cv_lib_dl_dlopen=no
91endif
92
93# php has some assembly function that is not present in Thumb mode:
94# Error: selected processor does not support `umlal r2,r1,r0,r3' in Thumb mode
95# so, we desactivate Thumb mode
96ifeq ($(BR2_ARM_INSTRUCTIONS_THUMB),y)
97PHP_CFLAGS += -marm
98endif
99
100PHP_CONF_OPTS += $(if $(BR2_PACKAGE_PHP_SAPI_CLI),--enable-cli,--disable-cli)
101PHP_CONF_OPTS += $(if $(BR2_PACKAGE_PHP_SAPI_CGI),--enable-cgi,--disable-cgi)
102PHP_CONF_OPTS += $(if $(BR2_PACKAGE_PHP_SAPI_FPM),--enable-fpm,--disable-fpm)
103
104ifeq ($(BR2_PACKAGE_PHP_SAPI_APACHE),y)
105PHP_DEPENDENCIES += apache
106PHP_CONF_OPTS += --with-apxs2=$(STAGING_DIR)/usr/bin/apxs
107
108# Enable thread safety option if Apache MPM is event or worker
109ifeq ($(BR2_PACKAGE_APACHE_MPM_EVENT)$(BR2_PACKAGE_APACHE_MPM_WORKER),y)
110PHP_CONF_OPTS += --enable-zts
111endif
112endif
113
114### Extensions
115PHP_CONF_OPTS += \
116	$(if $(BR2_PACKAGE_PHP_EXT_SOCKETS),--enable-sockets) \
117	$(if $(BR2_PACKAGE_PHP_EXT_POSIX),--enable-posix) \
118	$(if $(BR2_PACKAGE_PHP_EXT_SESSION),--enable-session) \
119	$(if $(BR2_PACKAGE_PHP_EXT_DOM),--enable-dom) \
120	$(if $(BR2_PACKAGE_PHP_EXT_SIMPLEXML),--enable-simplexml) \
121	$(if $(BR2_PACKAGE_PHP_EXT_SOAP),--enable-soap) \
122	$(if $(BR2_PACKAGE_PHP_EXT_XML),--enable-xml) \
123	$(if $(BR2_PACKAGE_PHP_EXT_XMLREADER),--enable-xmlreader) \
124	$(if $(BR2_PACKAGE_PHP_EXT_XMLWRITER),--enable-xmlwriter) \
125	$(if $(BR2_PACKAGE_PHP_EXT_EXIF),--enable-exif) \
126	$(if $(BR2_PACKAGE_PHP_EXT_FTP),--enable-ftp) \
127	$(if $(BR2_PACKAGE_PHP_EXT_TOKENIZER),--enable-tokenizer) \
128	$(if $(BR2_PACKAGE_PHP_EXT_PCNTL),--enable-pcntl) \
129	$(if $(BR2_PACKAGE_PHP_EXT_SHMOP),--enable-shmop) \
130	$(if $(BR2_PACKAGE_PHP_EXT_SYSVMSG),--enable-sysvmsg) \
131	$(if $(BR2_PACKAGE_PHP_EXT_SYSVSEM),--enable-sysvsem) \
132	$(if $(BR2_PACKAGE_PHP_EXT_SYSVSHM),--enable-sysvshm) \
133	$(if $(BR2_PACKAGE_PHP_EXT_ZIP),--with-zip) \
134	$(if $(BR2_PACKAGE_PHP_EXT_CTYPE),--enable-ctype) \
135	$(if $(BR2_PACKAGE_PHP_EXT_FILTER),--enable-filter) \
136	$(if $(BR2_PACKAGE_PHP_EXT_CALENDAR),--enable-calendar) \
137	$(if $(BR2_PACKAGE_PHP_EXT_FILEINFO),--enable-fileinfo) \
138	$(if $(BR2_PACKAGE_PHP_EXT_BCMATH),--enable-bcmath) \
139	$(if $(BR2_PACKAGE_PHP_EXT_PHAR),--enable-phar)
140
141ifeq ($(BR2_PACKAGE_PHP_EXT_LIBARGON2),y)
142PHP_CONF_OPTS += --with-password-argon2=$(STAGING_DIR)/usr
143PHP_DEPENDENCIES += libargon2
144endif
145
146ifeq ($(BR2_PACKAGE_PHP_EXT_LIBSODIUM),y)
147PHP_CONF_OPTS += --with-sodium=$(STAGING_DIR)/usr
148PHP_DEPENDENCIES += libsodium
149endif
150
151ifeq ($(BR2_PACKAGE_PHP_EXT_MBSTRING),y)
152PHP_CONF_OPTS += --enable-mbstring
153PHP_DEPENDENCIES += oniguruma
154endif
155
156ifeq ($(BR2_PACKAGE_PHP_EXT_OPENSSL),y)
157PHP_CONF_OPTS += --with-openssl=$(STAGING_DIR)/usr
158PHP_DEPENDENCIES += openssl
159# openssl needs zlib, but the configure script forgets to link against
160# it causing detection failures with static linking
161PHP_STATIC_LIBS += `$(PKG_CONFIG_HOST_BINARY) --libs openssl`
162endif
163
164ifeq ($(BR2_PACKAGE_PHP_EXT_LIBXML2),y)
165PHP_CONF_ENV += php_cv_libxml_build_works=yes
166PHP_CONF_OPTS += --with-libxml
167PHP_DEPENDENCIES += libxml2
168endif
169
170ifeq ($(BR2_PACKAGE_PHP_EXT_ZIP),y)
171PHP_DEPENDENCIES += libzip
172endif
173
174ifneq ($(BR2_PACKAGE_PHP_EXT_ZLIB)$(BR2_PACKAGE_PHP_EXT_ZIP),)
175PHP_CONF_OPTS += --with-zlib=$(STAGING_DIR)/usr
176PHP_DEPENDENCIES += zlib
177else
178PHP_CONF_OPTS += --disable-mysqlnd_compression_support
179endif
180
181ifeq ($(BR2_PACKAGE_PHP_EXT_GETTEXT),y)
182PHP_CONF_OPTS += --with-gettext=$(STAGING_DIR)/usr
183PHP_DEPENDENCIES += $(TARGET_NLS_DEPENDENCIES)
184endif
185
186ifeq ($(BR2_PACKAGE_PHP_EXT_ICONV),y)
187ifeq ($(BR2_PACKAGE_LIBICONV),y)
188PHP_CONF_OPTS += --with-iconv=$(STAGING_DIR)/usr
189PHP_DEPENDENCIES += libiconv
190else
191PHP_CONF_OPTS += --with-iconv
192endif
193endif
194
195ifeq ($(BR2_PACKAGE_PHP_EXT_INTL),y)
196PHP_CONF_OPTS += --enable-intl
197PHP_DEPENDENCIES += icu
198endif
199
200ifeq ($(BR2_PACKAGE_PHP_EXT_GMP),y)
201PHP_CONF_OPTS += --with-gmp=$(STAGING_DIR)/usr
202PHP_DEPENDENCIES += gmp
203endif
204
205ifeq ($(BR2_PACKAGE_PHP_EXT_READLINE),y)
206PHP_CONF_OPTS += --with-readline=$(STAGING_DIR)/usr
207PHP_DEPENDENCIES += readline
208endif
209
210### Native SQL extensions
211ifeq ($(BR2_PACKAGE_PHP_EXT_MYSQLI),y)
212PHP_CONF_OPTS += --with-mysqli
213endif
214
215ifeq ($(BR2_PACKAGE_PHP_EXT_PGSQL),y)
216PHP_CONF_OPTS += --with-pgsql=$(STAGING_DIR)/usr
217PHP_DEPENDENCIES += postgresql
218endif
219
220ifeq ($(BR2_PACKAGE_PHP_EXT_SQLITE),y)
221PHP_CONF_OPTS += --with-sqlite3=$(STAGING_DIR)/usr
222PHP_DEPENDENCIES += sqlite
223PHP_STATIC_LIBS += `$(PKG_CONFIG_HOST_BINARY) --libs sqlite3`
224endif
225
226### PDO
227ifeq ($(BR2_PACKAGE_PHP_EXT_PDO),y)
228PHP_CONF_OPTS += --enable-pdo
229ifeq ($(BR2_PACKAGE_PHP_EXT_PDO_SQLITE),y)
230PHP_CONF_OPTS += --with-pdo-sqlite=$(STAGING_DIR)/usr
231PHP_DEPENDENCIES += sqlite
232PHP_CFLAGS += -DSQLITE_OMIT_LOAD_EXTENSION
233endif
234ifeq ($(BR2_PACKAGE_PHP_EXT_PDO_MYSQL),y)
235PHP_CONF_OPTS += --with-pdo-mysql
236endif
237ifeq ($(BR2_PACKAGE_PHP_EXT_PDO_POSTGRESQL),y)
238PHP_CONF_OPTS += --with-pdo-pgsql=$(STAGING_DIR)/usr
239PHP_DEPENDENCIES += postgresql
240endif
241ifeq ($(BR2_PACKAGE_PHP_EXT_PDO_UNIXODBC),y)
242PHP_CONF_OPTS += --with-pdo-odbc=unixODBC,$(STAGING_DIR)/usr
243PHP_DEPENDENCIES += unixodbc
244endif
245endif
246
247ifneq ($(BR2_PACKAGE_PHP_EXT_MYSQLI)$(BR2_PACKAGE_PHP_EXT_PDO_MYSQL),)
248# Set default MySQL unix socket to what the MySQL server is using by default
249PHP_CONF_OPTS += --with-mysql-sock=$(MYSQL_SOCKET)
250endif
251
252define PHP_DISABLE_VALGRIND
253	$(SED) '/^#define HAVE_VALGRIND/d' $(@D)/main/php_config.h
254endef
255PHP_POST_CONFIGURE_HOOKS += PHP_DISABLE_VALGRIND
256
257ifeq ($(BR2_PACKAGE_PCRE2_JIT),y)
258PHP_CONF_OPTS += --with-pcre-jit=yes
259PHP_CONF_ENV += ac_cv_have_pcre2_jit=yes
260else
261PHP_CONF_OPTS += --with-pcre-jit=no
262PHP_CONF_ENV += ac_cv_have_pcre2_jit=no
263endif
264
265ifeq ($(BR2_PACKAGE_PHP_EXT_CURL),y)
266PHP_CONF_OPTS += --with-curl
267PHP_DEPENDENCIES += libcurl
268endif
269
270ifeq ($(BR2_PACKAGE_PHP_EXT_XSL),y)
271PHP_CONF_OPTS += --with-xsl=$(STAGING_DIR)/usr
272PHP_DEPENDENCIES += libxslt
273endif
274
275ifeq ($(BR2_PACKAGE_PHP_EXT_BZIP2),y)
276PHP_CONF_OPTS += --with-bz2=$(STAGING_DIR)/usr
277PHP_DEPENDENCIES += bzip2
278endif
279
280### DBA
281ifeq ($(BR2_PACKAGE_PHP_EXT_DBA),y)
282PHP_CONF_OPTS += --enable-dba
283ifneq ($(BR2_PACKAGE_PHP_EXT_DBA_CDB),y)
284PHP_CONF_OPTS += --without-cdb
285endif
286ifneq ($(BR2_PACKAGE_PHP_EXT_DBA_FLAT),y)
287PHP_CONF_OPTS += --without-flatfile
288endif
289ifneq ($(BR2_PACKAGE_PHP_EXT_DBA_INI),y)
290PHP_CONF_OPTS += --without-inifile
291endif
292ifeq ($(BR2_PACKAGE_PHP_EXT_DBA_DB4),y)
293PHP_CONF_OPTS += --with-db4=$(STAGING_DIR)/usr
294PHP_DEPENDENCIES += berkeleydb
295endif
296endif
297
298ifeq ($(BR2_PACKAGE_PHP_EXT_SNMP),y)
299PHP_CONF_OPTS += --with-snmp=$(STAGING_DIR)/usr
300PHP_DEPENDENCIES += netsnmp
301endif
302
303ifeq ($(BR2_PACKAGE_PHP_EXT_GD),y)
304PHP_CONF_OPTS += \
305	--enable-gd \
306	--with-jpeg \
307	--with-freetype
308PHP_DEPENDENCIES += jpeg libpng freetype zlib
309endif
310
311ifeq ($(BR2_PACKAGE_PHP_EXT_FFI),y)
312PHP_CONF_OPTS += --with-ffi
313PHP_DEPENDENCIES += libffi
314endif
315
316ifeq ($(BR2_PACKAGE_PHP_SAPI_FPM),y)
317define PHP_INSTALL_INIT_SYSV
318	$(INSTALL) -D -m 0755 $(@D)/sapi/fpm/init.d.php-fpm \
319		$(TARGET_DIR)/etc/init.d/S49php-fpm
320endef
321
322define PHP_INSTALL_INIT_SYSTEMD
323	$(INSTALL) -D -m 0644 $(@D)/sapi/fpm/php-fpm.service \
324		$(TARGET_DIR)/usr/lib/systemd/system/php-fpm.service
325endef
326
327define PHP_INSTALL_FPM_CONF
328	$(INSTALL) -D -m 0644 package/php/php-fpm.conf \
329		$(TARGET_DIR)/etc/php-fpm.conf
330	rm -f $(TARGET_DIR)/etc/php-fpm.d/www.conf.default
331	# remove unused sample status page /usr/php/php/fpm/status.html
332	rm -rf $(TARGET_DIR)/usr/php
333endef
334
335PHP_POST_INSTALL_TARGET_HOOKS += PHP_INSTALL_FPM_CONF
336endif
337
338define PHP_EXTENSIONS_FIXUP
339	$(SED) "/prefix/ s:/usr:$(STAGING_DIR)/usr:" \
340		$(STAGING_DIR)/usr/bin/phpize
341	$(SED) "/extension_dir/ s:/usr:$(TARGET_DIR)/usr:" \
342		$(STAGING_DIR)/usr/bin/php-config
343endef
344
345PHP_POST_INSTALL_TARGET_HOOKS += PHP_EXTENSIONS_FIXUP
346
347define PHP_INSTALL_FIXUP
348	rm -rf $(TARGET_DIR)/usr/lib/php/build
349	rm -f $(TARGET_DIR)/usr/bin/phpize
350	$(INSTALL) -D -m 0755 $(PHP_DIR)/php.ini-production \
351		$(TARGET_DIR)/etc/php.ini
352	$(SED) 's%;date.timezone =.*%date.timezone = $(PHP_LOCALTIME)%' \
353		$(TARGET_DIR)/etc/php.ini
354	$(if $(BR2_PACKAGE_PHP_EXT_OPCACHE),
355		$(SED) '/;extension=php_xsl.dll/azend_extension=opcache.so' \
356		$(TARGET_DIR)/etc/php.ini)
357endef
358
359PHP_POST_INSTALL_TARGET_HOOKS += PHP_INSTALL_FIXUP
360
361PHP_CONF_ENV += CFLAGS="$(PHP_CFLAGS)" CXXFLAGS="$(PHP_CXXFLAGS)"
362
363HOST_PHP_CONF_OPTS = \
364	--disable-all \
365	--without-pear \
366	--with-config-file-path=$(HOST_DIR)/etc \
367	--disable-phpdbg \
368	--with-external-pcre \
369	--enable-phar \
370	--enable-json \
371	--enable-filter \
372	--enable-mbstring \
373	--enable-tokenizer \
374	--with-openssl=$(HOST_DIR)
375
376HOST_PHP_DEPENDENCIES = \
377	host-oniguruma \
378	host-openssl \
379	host-pcre2 \
380	host-pkgconf
381
382$(eval $(autotools-package))
383$(eval $(host-autotools-package))
384