From 03731570cf2b2abdb0a01d4d30d7d320b886bb66 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 2 Dec 2024 12:56:54 +0100 Subject: [PATCH] Fix GH-16843: Windows phpize builds ignore source subfolders phpize builds on Windows ignore the paths of extension sources, and build all object files in the same folder. This can't work if there are multiple source files with the same base name stored in separate folders and registered as such (e.g. cls/worker.c and src/worker.c). While extension authors can work around by avoiding duplicate base names, they may not even be aware of the problem because on POSIX systems, the object files are usually placed right besides the sources. Thus we take the relative path (from `configure_module_dirname`) of the source files into account even for phpize builds. Since this may break some extension builds (especially those which use Makefile fragments), we do not apply this fix to stable branches. Closes GH-17016. --- NEWS | 1 + UPGRADING | 4 ++++ win32/build/confutils.js | 11 +++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 171a437f53c..b723e8a1166 100644 --- a/NEWS +++ b/NEWS @@ -81,6 +81,7 @@ PHP NEWS - Windows: . Fixed bug GH-10992 (Improper long path support for relative paths). (cmb, nielsdos) + . Fixed bug GH-16843 (Windows phpize builds ignore source subfolders). (cmb) - XMLWriter: . Improved performance and reduce memory consumption. (nielsdos) diff --git a/UPGRADING b/UPGRADING index 37538739d6a..4b37e3e41a4 100644 --- a/UPGRADING +++ b/UPGRADING @@ -166,6 +166,10 @@ PHP 8.5 UPGRADE NOTES PHP_RELEASE_VERSION are now always numbers. Previously, they have been strings for buildconf builds. +* phpize builds now reflect the source tree in the build dir (like that already + worked for in-tree builds); some extension builds (especially when using + Makefile.frag.w32) may need adjustments. + * --enable-sanitzer is now supported for MSVC builds. This enables ASan and debug assertions, and is supported as of MSVC 16.10 and Windows 10. diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 438eb1d239c..cf1010266f2 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -1616,8 +1616,15 @@ function ADD_SOURCES(dir, file_list, target, obj_dir) if (obj_dir == null) { if (MODE_PHPIZE) { /* In the phpize mode, the subdirs are always relative to BUID_DIR. - No need to differentiate by extension, only one gets built. */ - var build_dir = (dirname ? dirname : "").replace(new RegExp("^..\\\\"), ""); + No need to differentiate by extension, only one gets built. + We still need to cater to subfolders, though. */ + if (dir.charAt(configure_module_dirname.length) === "\\" && + dir.substr(0, configure_module_dirname.length) === configure_module_dirname) { + var reldir = dir.substr(configure_module_dirname.length + 1); + var build_dir = (dirname ? (reldir + "\\" + dirname) : reldir).replace(new RegExp("^..\\\\"), ""); + } else { + var build_dir = (dirname ? dirname : "").replace(new RegExp("^..\\\\"), ""); + } } else { var build_dir = (dirname ? (dir + "\\" + dirname) : dir).replace(new RegExp("^..\\\\"), ""); }