From 4f27d2d9d1d66b1b1c063ccd8ff2e39cc67b1d30 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 12 Apr 2026 12:28:27 +0700 Subject: [PATCH 1/6] add ext-decimal --- config/ext.json | 8 +++++ config/lib.json | 12 +++++++ config/source.json | 18 +++++++++++ src/SPC/builder/extension/decimal.php | 34 ++++++++++++++++++++ src/SPC/builder/freebsd/library/libmpdec.php | 12 +++++++ src/SPC/builder/linux/library/libmpdec.php | 12 +++++++ src/SPC/builder/macos/library/libmpdec.php | 12 +++++++ src/SPC/builder/unix/library/libmpdec.php | 17 ++++++++++ src/SPC/builder/windows/library/libmpdec.php | 31 ++++++++++++++++++ src/globals/ext-tests/decimal.php | 10 ++++++ src/globals/test-extensions.php | 12 +++---- 11 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 src/SPC/builder/extension/decimal.php create mode 100644 src/SPC/builder/freebsd/library/libmpdec.php create mode 100644 src/SPC/builder/linux/library/libmpdec.php create mode 100644 src/SPC/builder/macos/library/libmpdec.php create mode 100644 src/SPC/builder/unix/library/libmpdec.php create mode 100644 src/SPC/builder/windows/library/libmpdec.php create mode 100644 src/globals/ext-tests/decimal.php diff --git a/config/ext.json b/config/ext.json index 16a71c212..573d7623c 100644 --- a/config/ext.json +++ b/config/ext.json @@ -74,6 +74,14 @@ "qdbm" ] }, + "decimal": { + "type": "external", + "source": "ext-decimal", + "arg-type": "custom", + "lib-depends": [ + "libmpdec" + ] + }, "dio": { "support": { "BSD": "wip" diff --git a/config/lib.json b/config/lib.json index 4792a9329..17258b771 100644 --- a/config/lib.json +++ b/config/lib.json @@ -528,6 +528,18 @@ "maxminddb_config.h" ] }, + "libmpdec": { + "source": "libmpdec", + "static-libs-unix": [ + "libmpdec.a" + ], + "static-libs-windows": [ + "libmpdec_a.lib" + ], + "headers": [ + "mpdecimal.h" + ] + }, "libmemcached": { "source": "libmemcached", "cpp-library": true, diff --git a/config/source.json b/config/source.json index 18bca217b..b304b4ce9 100644 --- a/config/source.json +++ b/config/source.json @@ -84,6 +84,16 @@ "path": "COPYING" } }, + "ext-decimal": { + "type": "ghtagtar", + "repo": "php-decimal/ext-decimal", + "match": "v2\\.\\d.*", + "path": "php-src/ext/decimal", + "license": { + "type": "file", + "path": "LICENSE" + } + }, "dio": { "type": "url", "url": "https://pecl.php.net/get/dio", @@ -681,6 +691,14 @@ "path": "LICENSE" } }, + "libmpdec": { + "type": "url", + "url": "https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-4.0.1.tar.gz", + "license": { + "type": "file", + "path": "COPYRIGHT.txt" + } + }, "libmemcached": { "type": "ghtagtar", "repo": "awesomized/libmemcached", diff --git a/src/SPC/builder/extension/decimal.php b/src/SPC/builder/extension/decimal.php new file mode 100644 index 000000000..72a694ff9 --- /dev/null +++ b/src/SPC/builder/extension/decimal.php @@ -0,0 +1,34 @@ +source_dir . '/php_decimal.c', + 'zend_module_entry decimal_module_entry', + 'zend_module_entry php_decimal_module_entry' + ); + return true; + } + + public function getUnixConfigureArg(bool $shared = false): string + { + return '--enable-decimal --with-libmpdec-path="' . BUILD_ROOT_PATH . '"'; + } + + public function getWindowsConfigureArg(bool $shared = false): string + { + return '--with-decimal'; + } +} diff --git a/src/SPC/builder/freebsd/library/libmpdec.php b/src/SPC/builder/freebsd/library/libmpdec.php new file mode 100644 index 000000000..9fd38eca8 --- /dev/null +++ b/src/SPC/builder/freebsd/library/libmpdec.php @@ -0,0 +1,12 @@ +configure('--disable-cxx --disable-shared --enable-static') + ->make(); + } +} diff --git a/src/SPC/builder/windows/library/libmpdec.php b/src/SPC/builder/windows/library/libmpdec.php new file mode 100644 index 000000000..3468c58e8 --- /dev/null +++ b/src/SPC/builder/windows/library/libmpdec.php @@ -0,0 +1,31 @@ +source_dir . '\libmpdec'; + $nmake = $this->builder->makeSimpleWrapper('nmake /nologo'); + + cmd()->cd($makefile_dir) + ->exec('copy /y Makefile.vc Makefile') + ->execWithWrapper($nmake, 'clean') + ->execWithWrapper($nmake, 'MACHINE=x64'); + + // Copy static lib (rename from versioned name to libmpdec_a.lib) + $libs = glob($makefile_dir . '\libmpdec-*.lib'); + foreach ($libs as $lib) { + if (!str_contains($lib, '.dll.')) { + copy($lib, BUILD_LIB_PATH . '\libmpdec_a.lib'); + break; + } + } + copy($makefile_dir . '\mpdecimal.h', BUILD_INCLUDE_PATH . '\mpdecimal.h'); + } +} diff --git a/src/globals/ext-tests/decimal.php b/src/globals/ext-tests/decimal.php new file mode 100644 index 000000000..54f660fbb --- /dev/null +++ b/src/globals/ext-tests/decimal.php @@ -0,0 +1,10 @@ + 'curl,swoole', - 'Windows' => 'intl', + 'Linux', 'Darwin' => 'decimal', + 'Windows' => 'decimal', }; // If you want to test shared extensions, add them below (comma separated, example `bcmath,openssl`). From 93f68b209f5ec677520734651db893d94fef6801 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 12 Apr 2026 12:32:26 +0700 Subject: [PATCH 2/6] fix merge --- config/ext.json | 1 + 1 file changed, 1 insertion(+) diff --git a/config/ext.json b/config/ext.json index b839a6939..3134ab7bb 100644 --- a/config/ext.json +++ b/config/ext.json @@ -81,6 +81,7 @@ "lib-depends": [ "libmpdec" ] + }, "deepclone": { "type": "external", "source": "deepclone", From f43e9153411987943edbd8e7259a3c7269575c97 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 12 Apr 2026 12:44:21 +0700 Subject: [PATCH 3/6] don't scan the test --- phpstan.neon | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon b/phpstan.neon index a8c1c72c5..482f97d78 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -14,6 +14,7 @@ parameters: - PHP_OS_FAMILY excludePaths: analyseAndScan: + - ./src/globals/ext-tests/decimal.php - ./src/globals/ext-tests/swoole.php - ./src/globals/ext-tests/swoole.phpt - ./src/globals/test-extensions.php From f585cc446a545716082a4c6610e59188aeb0aeeb Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 12 Apr 2026 13:30:22 +0700 Subject: [PATCH 4/6] attempt --- src/SPC/builder/windows/library/libmpdec.php | 10 ++++++++++ src/globals/test-extensions.php | 16 ++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/SPC/builder/windows/library/libmpdec.php b/src/SPC/builder/windows/library/libmpdec.php index 3468c58e8..eda5f5c8e 100644 --- a/src/SPC/builder/windows/library/libmpdec.php +++ b/src/SPC/builder/windows/library/libmpdec.php @@ -4,6 +4,8 @@ namespace SPC\builder\windows\library; +use SPC\store\FileSystem; + class libmpdec extends WindowsLibraryBase { public const NAME = 'libmpdec'; @@ -27,5 +29,13 @@ protected function build(): void } } copy($makefile_dir . '\mpdecimal.h', BUILD_INCLUDE_PATH . '\mpdecimal.h'); + + // Disable dllimport for static linking: the header defaults to + // __declspec(dllimport) when _DLL is defined, idk if php builds with /MD + FileSystem::replaceFileStr( + BUILD_INCLUDE_PATH . '\mpdecimal.h', + '#elif defined(_DLL)', + '#elif 0' + ); } } diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index b69d7052f..cbcecb0ee 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -15,7 +15,7 @@ $test_php_version = [ // '8.1', // '8.2', - '8.3', + // '8.3', // '8.4', '8.5', // 'git', @@ -23,13 +23,13 @@ // test os (macos-15-intel, macos-15, ubuntu-latest, windows-latest are available) $test_os = [ - 'macos-15-intel', // bin/spc for x86_64 - 'macos-15', // bin/spc for arm64 - 'ubuntu-latest', // bin/spc-alpine-docker for x86_64 - 'ubuntu-22.04', // bin/spc-gnu-docker for x86_64 - 'ubuntu-24.04', // bin/spc for x86_64 - 'ubuntu-22.04-arm', // bin/spc-gnu-docker for arm64 - 'ubuntu-24.04-arm', // bin/spc for arm64 + // 'macos-15-intel', // bin/spc for x86_64 + // 'macos-15', // bin/spc for arm64 + // 'ubuntu-latest', // bin/spc-alpine-docker for x86_64 + // 'ubuntu-22.04', // bin/spc-gnu-docker for x86_64 + // 'ubuntu-24.04', // bin/spc for x86_64 + // 'ubuntu-22.04-arm', // bin/spc-gnu-docker for arm64 + // 'ubuntu-24.04-arm', // bin/spc for arm64 'windows-2022', // .\bin\spc.ps1 'windows-2025', ]; From a0c2fefd24f1651fe45454ce9d432164521178a8 Mon Sep 17 00:00:00 2001 From: henderkes Date: Sun, 12 Apr 2026 15:55:57 +0700 Subject: [PATCH 5/6] fix windows crash --- src/SPC/builder/extension/decimal.php | 6 ++++++ src/SPC/builder/windows/library/libmpdec.php | 8 -------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/SPC/builder/extension/decimal.php b/src/SPC/builder/extension/decimal.php index 72a694ff9..795bce2d2 100644 --- a/src/SPC/builder/extension/decimal.php +++ b/src/SPC/builder/extension/decimal.php @@ -19,6 +19,12 @@ public function patchBeforeBuildconf(): bool 'zend_module_entry decimal_module_entry', 'zend_module_entry php_decimal_module_entry' ); + FileSystem::replaceFileStr( + $this->source_dir . '/config.w32', + 'ARG_WITH("decimal", "for decimal support", "no");', + 'ARG_WITH("decimal", "for decimal support", "no");' . "\n" . + 'ADD_EXTENSION_DEP("decimal", "json");' + ); return true; } diff --git a/src/SPC/builder/windows/library/libmpdec.php b/src/SPC/builder/windows/library/libmpdec.php index eda5f5c8e..1493b69a3 100644 --- a/src/SPC/builder/windows/library/libmpdec.php +++ b/src/SPC/builder/windows/library/libmpdec.php @@ -29,13 +29,5 @@ protected function build(): void } } copy($makefile_dir . '\mpdecimal.h', BUILD_INCLUDE_PATH . '\mpdecimal.h'); - - // Disable dllimport for static linking: the header defaults to - // __declspec(dllimport) when _DLL is defined, idk if php builds with /MD - FileSystem::replaceFileStr( - BUILD_INCLUDE_PATH . '\mpdecimal.h', - '#elif defined(_DLL)', - '#elif 0' - ); } } From f48961c72d0a3a49e6eca8deee1722a7570bde96 Mon Sep 17 00:00:00 2001 From: Marc Date: Sun, 12 Apr 2026 16:09:55 +0700 Subject: [PATCH 6/6] Remove unused import in libmpdec.php Removed unused import of FileSystem. --- src/SPC/builder/windows/library/libmpdec.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SPC/builder/windows/library/libmpdec.php b/src/SPC/builder/windows/library/libmpdec.php index 1493b69a3..3468c58e8 100644 --- a/src/SPC/builder/windows/library/libmpdec.php +++ b/src/SPC/builder/windows/library/libmpdec.php @@ -4,8 +4,6 @@ namespace SPC\builder\windows\library; -use SPC\store\FileSystem; - class libmpdec extends WindowsLibraryBase { public const NAME = 'libmpdec';