From df8b2dbf163ab6cfdb84fb624d16b61da5d4e3ce Mon Sep 17 00:00:00 2001 From: Marc Henderkes Date: Tue, 16 Sep 2025 13:06:33 +0200 Subject: [PATCH] better patching for libstdc++ when extensions forget they need it --- config/ext.json | 8 ++++++++ src/SPC/builder/Extension.php | 23 +++++++++++++++++++++-- src/SPC/builder/extension/memcached.php | 4 ++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/config/ext.json b/config/ext.json index 8e02b118..188aea58 100644 --- a/config/ext.json +++ b/config/ext.json @@ -414,9 +414,17 @@ "libmemcached", "fastlz" ], + "lib-suggests": [ + "zstd" + ], "ext-depends": [ "session", "zlib" + ], + "ext-suggests": [ + "igbinary", + "msgpack", + "session" ] }, "mongodb": { diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index 71bbf9d4..ac7efd1e 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -5,11 +5,14 @@ declare(strict_types=1); namespace SPC\builder; use SPC\exception\EnvironmentException; +use SPC\exception\FileSystemException; use SPC\exception\SPCException; use SPC\exception\ValidationException; use SPC\exception\WrongUsageException; use SPC\store\Config; use SPC\store\FileSystem; +use SPC\toolchain\ClangNativeToolchain; +use SPC\toolchain\GccNativeToolchain; use SPC\toolchain\ToolchainManager; use SPC\toolchain\ZigToolchain; use SPC\util\SPCConfigUtil; @@ -418,8 +421,24 @@ class Extension 'LIBS' => clean_spaces("{$preStatic} {$staticLibs} {$postStatic} {$sharedLibs}"), 'LD_LIBRARY_PATH' => BUILD_LIB_PATH, ]; - if (ToolchainManager::getToolchainClass() === ZigToolchain::class && SPCTarget::getTargetOS() === 'Linux') { - $env['SPC_COMPILER_EXTRA'] = '-lstdc++'; + if (str_contains($env['LIBS'], '-lstdc++') && SPCTarget::getTargetOS() === 'Linux') { + if (ToolchainManager::getToolchainClass() === ZigToolchain::class) { + $env['SPC_COMPILER_EXTRA'] = '-lstdc++'; + } elseif (ToolchainManager::getToolchainClass() === GccNativeToolchain::class || ToolchainManager::getToolchainClass() === ClangNativeToolchain::class) { + try { + $content = FileSystem::readFile($this->source_dir . '/config.m4'); + if ($content && !str_contains($content, 'PHP_ADD_LIBRARY(stdc++')) { + $pattern = '/(PHP_NEW_EXTENSION\(' . $this->name . ',.*\))/m'; + $replacement = "$1\nPHP_ADD_LIBRARY(stdc++, 1, " . strtoupper($this->name) . '_SHARED_LIBADD)'; + FileSystem::replaceFileRegex( + $this->source_dir . '/config.m4', + $pattern, + $replacement + ); + } + } catch (FileSystemException) { + } + } } if ($this->patchBeforeSharedPhpize()) { diff --git a/src/SPC/builder/extension/memcached.php b/src/SPC/builder/extension/memcached.php index a1b88ac6..983b5b64 100644 --- a/src/SPC/builder/extension/memcached.php +++ b/src/SPC/builder/extension/memcached.php @@ -17,6 +17,10 @@ class memcached extends Extension '--with-libmemcached-dir=' . BUILD_ROOT_PATH . ' ' . '--disable-memcached-sasl ' . '--enable-memcached-json ' . + ($this->builder->getLib('zstd') ? '--with-zstd ' : '') . + ($this->builder->getExt('igbinary') ? '--enable-memcached-igbinary ' : '') . + ($this->builder->getExt('session') ? '--enable-memcached-session ' : '') . + ($this->builder->getExt('msgpack') ? '--enable-memcached-msgpack ' : '') . '--with-system-fastlz'; } }