From ad356b4a230d75f00e119bff6cf8da26084e306e Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Mon, 9 Mar 2026 20:12:14 +0800 Subject: [PATCH 1/3] Fix grpc build --- config/ext.json | 3 +++ src/SPC/builder/extension/grpc.php | 2 ++ src/globals/test-extensions.php | 10 +++++----- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/config/ext.json b/config/ext.json index 4352f2e2..ed1210f3 100644 --- a/config/ext.json +++ b/config/ext.json @@ -255,6 +255,9 @@ "zlib", "openssl", "libcares" + ], + "frameworks": [ + "CoreFoundation" ] }, "iconv": { diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index 42dcdd5b..86be8d3d 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -33,6 +33,8 @@ class grpc extends Extension 'GRPC_LIBDIR=' . BUILD_LIB_PATH . "\n" . 'LDFLAGS="$LDFLAGS -framework CoreFoundation"' ); } + FileSystem::replaceFileStr("{$this->source_dir}/config.m4", "CFLAGS=\"-std=c11 -g -O2\"\n", ''); + file_put_contents("{$this->source_dir}/php_grpc.h", '#include "src/php/ext/grpc/php_grpc.h"'); return true; } diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index ba02e672..bfae094a 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -16,15 +16,15 @@ $test_php_version = [ // '8.1', // '8.2', // '8.3', - // '8.4', + '8.4', '8.5', // 'git', ]; // 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 + '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 @@ -35,7 +35,7 @@ $test_os = [ ]; // whether enable thread safe -$zts = true; +$zts = false; $no_strip = false; @@ -50,7 +50,7 @@ $prefer_pre_built = false; // If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`). $extensions = match (PHP_OS_FAMILY) { - 'Linux', 'Darwin' => 'pgsql', + 'Linux', 'Darwin' => 'grpc', 'Windows' => 'com_dotnet', }; From 4fa5292913bfd78df1d37ca778ed184948904a27 Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Tue, 10 Mar 2026 13:49:34 +0800 Subject: [PATCH 2/3] Use custom config.m4 for grpc extension --- config/ext.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/ext.json b/config/ext.json index ed1210f3..79d3831e 100644 --- a/config/ext.json +++ b/config/ext.json @@ -252,12 +252,10 @@ "arg-type-unix": "enable-path", "cpp-extension": true, "lib-depends": [ + "grpc", "zlib", "openssl", "libcares" - ], - "frameworks": [ - "CoreFoundation" ] }, "iconv": { From 086c855a439801399a0ea1910939861fda7555ad Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Tue, 10 Mar 2026 13:49:53 +0800 Subject: [PATCH 3/3] Use custom config.m4 for grpc extension --- src/SPC/builder/extension/grpc.php | 52 +++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index 86be8d3d..ba15518f 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -11,7 +11,6 @@ use SPC\store\FileSystem; use SPC\util\CustomExt; use SPC\util\GlobalEnvManager; use SPC\util\SPCConfigUtil; -use SPC\util\SPCTarget; #[CustomExt('grpc')] class grpc extends Extension @@ -21,20 +20,50 @@ class grpc extends Extension if ($this->builder instanceof WindowsBuilder) { throw new ValidationException('grpc extension does not support windows yet'); } + + // Fix deprecated PHP API usage in call.c FileSystem::replaceFileStr( - $this->source_dir . '/src/php/ext/grpc/call.c', + "{$this->source_dir}/src/php/ext/grpc/call.c", 'zend_exception_get_default(TSRMLS_C),', 'zend_ce_exception,', ); - if (SPCTarget::getTargetOS() === 'Darwin') { - FileSystem::replaceFileRegex( - $this->source_dir . '/config.m4', - '/GRPC_LIBDIR=.*$/m', - 'GRPC_LIBDIR=' . BUILD_LIB_PATH . "\n" . 'LDFLAGS="$LDFLAGS -framework CoreFoundation"' - ); - } - FileSystem::replaceFileStr("{$this->source_dir}/config.m4", "CFLAGS=\"-std=c11 -g -O2\"\n", ''); - file_put_contents("{$this->source_dir}/php_grpc.h", '#include "src/php/ext/grpc/php_grpc.h"'); + + $config_m4 = <<<'M4' +PHP_ARG_ENABLE(grpc, [whether to enable grpc support], [AS_HELP_STRING([--enable-grpc], [Enable grpc support])]) + +if test "$PHP_GRPC" != "no"; then + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/include) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/php/ext/grpc) + GRPC_LIBDIR=@@build_lib_path@@ + PHP_ADD_LIBPATH($GRPC_LIBDIR) + PHP_ADD_LIBRARY(grpc,,GRPC_SHARED_LIBADD) + LIBS="-lpthread $LIBS" + PHP_ADD_LIBRARY(pthread) + + case $host in + *darwin*) + PHP_ADD_LIBRARY(c++,1,GRPC_SHARED_LIBADD) + ;; + *) + PHP_ADD_LIBRARY(stdc++,1,GRPC_SHARED_LIBADD) + PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD) + PHP_ADD_LIBRARY(rt) + ;; + esac + + PHP_NEW_EXTENSION(grpc, @grpc_c_files@, $ext_shared, , -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1) + PHP_SUBST(GRPC_SHARED_LIBADD) + PHP_INSTALL_HEADERS([ext/grpc], [php_grpc.h]) +fi +M4; + $replace = get_pack_replace(); + // load grpc c files from src/php/ext/grpc + $c_files = glob($this->source_dir . '/src/php/ext/grpc/*.c'); + $replace['@grpc_c_files@'] = implode(" \\\n ", array_map(fn ($f) => 'src/php/ext/grpc/' . basename($f), $c_files)); + $config_m4 = str_replace(array_keys($replace), array_values($replace), $config_m4); + file_put_contents($this->source_dir . '/config.m4', $config_m4); + + copy($this->source_dir . '/src/php/ext/grpc/php_grpc.h', $this->source_dir . '/php_grpc.h'); return true; } @@ -50,7 +79,6 @@ class grpc extends Extension public function patchBeforeMake(): bool { parent::patchBeforeMake(); - // add -Wno-strict-prototypes GlobalEnvManager::putenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS=' . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . ' -Wno-strict-prototypes'); return true; }