Description
Building PHP 8.6.0RC1 with the bundled libgd and --with-freetype fails on systems with older FreeType (e.g. 2.9.1 on RHEL/AlmaLinux/CloudLinux 8):
In file included from ext/gd/libgd/gdft.c:94:
/usr/include/freetype2/freetype/freetype.h:24:2: error: #error "`ft2build.h' hasn't been included yet!"
/usr/include/freetype2/freetype/freetype.h:25:2: error: #error "Please always use macros to include FreeType header files."
...
make: *** [Makefile:1429: ext/gd/libgd/gdft.lo] Error 1
In PHP 8.4/8.5, ext/gd/libgd/gdft.c included FreeType unconditionally:
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
In 8.6 (after the bundled libgd sync) the includes became conditional:
#ifdef HAVE_FT2BUILD_H
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_SIZES_H
#else
#include <freetype/freetype.h>
#include <freetype/ftglyph.h>
#include <freetype/ftsizes.h>
#endif
However, ext/gd/config.m4 never defines HAVE_FT2BUILD_H, so on Unix builds the #else branch is always used. Direct <freetype/freetype.h> includes work with FreeType >= 2.10 (which is why the build succeeds on EL9 with FreeType 2.10.4), but FreeType 2.9.x still contains a guard in freetype.h that errors out unless ft2build.h was included first.
Note: commit f17c5ad ("Windows build: Add new function CHECK_HEADER()", #21191), which is included in PHP-8.6 and php-8.6.0RC1, also removed the implicit HAVE_FT2BUILD_H definition from the Windows build, so Windows builds may now be taking the #else branch as well.
Steps to reproduce
On an EL8-based system with freetype-devel 2.9.1:
./buildconf --force
./configure --enable-gd --with-freetype
make
Expected result: gd builds with FreeType support, as in 8.5.
Actual result: compilation of ext/gd/libgd/gdft.c fails with the errors above.
The installation fails unless you add export CPPFLAGS="${CPPFLAGS} -DHAVE_FT2BUILD_H"
Suggested fix
Define HAVE_FT2BUILD_H when FreeType is found:
--- a/ext/gd/config.m4
+++ b/ext/gd/config.m4
@@ -181,6 +181,9 @@ AC_DEFUN([PHP_GD_FREETYPE2],[
PHP_EVAL_LIBLINE([$FREETYPE2_LIBS], [GD_SHARED_LIBADD])
AC_DEFINE([HAVE_LIBFREETYPE], [1],
[Define to 1 if you have the FreeType library.])
+ AC_DEFINE([HAVE_FT2BUILD_H], [1],
+ [Define to 1 if you have the <ft2build.h> header file.])
AC_DEFINE([HAVE_GD_FREETYPE], [1],
[Define to 1 if gd extension has FreeType support.])
])
ft2build.h has been part of every FreeType 2 release, so defining it unconditionally when FreeType is enabled is safe. Alternatively, gdft.c could include <ft2build.h> unconditionally, as it did in 8.5. Adding -DHAVE_FT2BUILD_H to CPPFLAGS works around the problem.
PHP Version
PHP 8.6.0RC1
Operating System
CloudLinux 8 (RHEL 8 based), FreeType 2.9.1; builds fine on CloudLinux 9 (FreeType 2.10.4)
PHP Version
PHP 8.6.0RC1 (cli) (built: Sep 23 2026 08:57:38) (NTS)
Copyright © The PHP Group and Contributors
Zend Engine v4.6.0RC1, Copyright © Zend by Perforce
with Zend OPcache v8.6.0RC1, Copyright ©, by Zend by Perforce
Operating System
CL8
Description
Building PHP 8.6.0RC1 with the bundled libgd and
--with-freetypefails on systems with older FreeType (e.g. 2.9.1 on RHEL/AlmaLinux/CloudLinux 8):In PHP 8.4/8.5,
ext/gd/libgd/gdft.cincluded FreeType unconditionally:In 8.6 (after the bundled libgd sync) the includes became conditional:
However,
ext/gd/config.m4never definesHAVE_FT2BUILD_H, so on Unix builds the#elsebranch is always used. Direct<freetype/freetype.h>includes work with FreeType >= 2.10 (which is why the build succeeds on EL9 with FreeType 2.10.4), but FreeType 2.9.x still contains a guard infreetype.hthat errors out unlessft2build.hwas included first.Note: commit f17c5ad ("Windows build: Add new function CHECK_HEADER()", #21191), which is included in
PHP-8.6andphp-8.6.0RC1, also removed the implicitHAVE_FT2BUILD_Hdefinition from the Windows build, so Windows builds may now be taking the#elsebranch as well.Steps to reproduce
On an EL8-based system with
freetype-devel2.9.1:Expected result: gd builds with FreeType support, as in 8.5.
Actual result: compilation of
ext/gd/libgd/gdft.cfails with the errors above.The installation fails unless you add
export CPPFLAGS="${CPPFLAGS} -DHAVE_FT2BUILD_H"Suggested fix
Define
HAVE_FT2BUILD_Hwhen FreeType is found:ft2build.hhas been part of every FreeType 2 release, so defining it unconditionally when FreeType is enabled is safe. Alternatively,gdft.ccould include<ft2build.h>unconditionally, as it did in 8.5. Adding-DHAVE_FT2BUILD_HtoCPPFLAGSworks around the problem.PHP Version
PHP 8.6.0RC1
Operating System
CloudLinux 8 (RHEL 8 based), FreeType 2.9.1; builds fine on CloudLinux 9 (FreeType 2.10.4)
PHP Version
Operating System
CL8