From 38cc4cfe7e02437220477e75dfdabdc80cfdd7c8 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 00:32:43 +0700 Subject: [PATCH 01/16] doesn't even work yet, there has to be a better way than to add 2913912309 libraries --- config/lib.json | 6 ++--- src/SPC/builder/extension/grpc.php | 19 +++++++++++++++ src/SPC/builder/unix/library/grpc.php | 35 ++++++++++++++++++--------- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/config/lib.json b/config/lib.json index 1a195f66..999feb33 100644 --- a/config/lib.json +++ b/config/lib.json @@ -186,12 +186,12 @@ "grpc": { "source": "grpc", "static-libs-unix": [ - "libgrpc.a", - "libcares.a" + "libgrpc.a" ], "lib-depends": [ "zlib", - "openssl" + "openssl", + "libcares" ], "frameworks": [ "CoreFoundation" diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index 852f2933..e5459807 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -36,9 +36,20 @@ class grpc extends Extension } return false; } + public function patchBeforeConfigure(): bool + { + $libs = ' -l' . join(' -l', $this->getLibraries()); + FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/configure', '-lgrpc', $libs); + return true; + } public function patchBeforeMake(): bool { + $extra_libs = trim(getenv('SPC_EXTRA_LIBS')); + $alibs = join('.a ', $this->getLibraries()) . '.a'; + $libs = BUILD_LIB_PATH . '/lib' . str_replace(' ', ' ' . BUILD_LIB_PATH . '/lib', $alibs); + $extra_libs = str_replace(BUILD_LIB_PATH . '/libgrpc.a', $libs, $extra_libs); + f_putenv('SPC_EXTRA_LIBS=' . $extra_libs); // 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; @@ -48,4 +59,12 @@ class grpc extends Extension { return '--enable-grpc=' . BUILD_ROOT_PATH . '/grpc GRPC_LIB_SUBDIR=' . BUILD_LIB_PATH; } + + private function getLibraries(): array + { + [, $out] = shell()->execWithResult('$PKG_CONFIG --libs-only-l grpc'); + $libs = join(' ', $out) . ' -lupb -lupb_message_lib -lupb_json_lib -lupb_textformat_lib -lupb_mini_descriptor_lib -lupb_wire_lib -lupb_mem_lib -lupb_base_lib -lutf8_range'; + $libs = str_replace('-l', '', $libs); + return explode(' ', $libs); + } } diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index a7472448..a6c329e3 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -4,22 +4,33 @@ declare(strict_types=1); namespace SPC\builder\unix\library; -use SPC\store\FileSystem; +use SPC\util\executor\UnixCMakeExecutor; trait grpc { protected function build(): void { - shell()->cd($this->source_dir) - ->exec('EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK EMBED_OPENSSL=false CXXFLAGS="-L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '" make static -j' . $this->builder->concurrency); - copy($this->source_dir . '/libs/opt/libgrpc.a', BUILD_LIB_PATH . '/libgrpc.a'); - copy($this->source_dir . '/libs/opt/libboringssl.a', BUILD_LIB_PATH . '/libboringssl.a'); - if (!file_exists(BUILD_LIB_PATH . '/libcares.a')) { - copy($this->source_dir . '/libs/opt/libcares.a', BUILD_LIB_PATH . '/libcares.a'); - } - FileSystem::copyDir($this->source_dir . '/include/grpc', BUILD_INCLUDE_PATH . '/grpc'); - FileSystem::copyDir($this->source_dir . '/include/grpc++', BUILD_INCLUDE_PATH . '/grpc++'); - FileSystem::copyDir($this->source_dir . '/include/grpcpp', BUILD_INCLUDE_PATH . '/grpcpp'); - FileSystem::copyDir($this->source_dir . '/src/php/ext/grpc', BUILD_ROOT_PATH . '/grpc_php_ext_src'); + UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '-DgRPC_SSL_PROVIDER=openssl', + '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH, + '-DgRPC_INSTALL_LIBDIR=' . BUILD_LIB_PATH, + '-DgRPC_INSTALL_SHAREDIR=' . BUILD_ROOT_PATH . '/share/grpc', + '-DOPENSSL_ROOT_DIR=' . BUILD_ROOT_PATH, + '-DOPENSSL_INCLUDE_DIR=' . BUILD_INCLUDE_PATH, + '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK"' + ) + ->build(); + //shell()->cd($this->source_dir) + // ->exec('EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK EMBED_OPENSSL=false CXXFLAGS="-L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '" make static -j' . $this->builder->concurrency); + //copy($this->source_dir . '/libs/opt/libgrpc.a', BUILD_LIB_PATH . '/libgrpc.a'); + //copy($this->source_dir . '/libs/opt/libboringssl.a', BUILD_LIB_PATH . '/libboringssl.a'); + //if (!file_exists(BUILD_LIB_PATH . '/libcares.a')) { + // copy($this->source_dir . '/libs/opt/libcares.a', BUILD_LIB_PATH . '/libcares.a'); + //} + //FileSystem::copyDir($this->source_dir . '/include/grpc', BUILD_INCLUDE_PATH . '/grpc'); + //FileSystem::copyDir($this->source_dir . '/include/grpc++', BUILD_INCLUDE_PATH . '/grpc++'); + //FileSystem::copyDir($this->source_dir . '/include/grpcpp', BUILD_INCLUDE_PATH . '/grpcpp'); + //FileSystem::copyDir($this->source_dir . '/src/php/ext/grpc', BUILD_ROOT_PATH . '/grpc_php_ext_src'); } } From 76d7002646dbd687626206cbafba73cd87e5adaa Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 09:33:29 +0700 Subject: [PATCH 02/16] needed --libs --static --- src/SPC/builder/extension/grpc.php | 10 +++++++--- src/SPC/builder/unix/library/grpc.php | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index e5459807..4cf06f4a 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -62,9 +62,13 @@ class grpc extends Extension private function getLibraries(): array { - [, $out] = shell()->execWithResult('$PKG_CONFIG --libs-only-l grpc'); + [, $out] = shell()->execWithResult('$PKG_CONFIG --libs --static grpc'); $libs = join(' ', $out) . ' -lupb -lupb_message_lib -lupb_json_lib -lupb_textformat_lib -lupb_mini_descriptor_lib -lupb_wire_lib -lupb_mem_lib -lupb_base_lib -lutf8_range'; - $libs = str_replace('-l', '', $libs); - return explode(' ', $libs); + $filtered = str_replace('-pthread', '', $libs); + $filtered = preg_replace('/-L\S+/', '', $filtered); + $filtered = preg_replace('/(?:\S*\/)?lib([a-zA-Z0-9_+-]+)\.a\b/', '-l$1', $filtered); + $out = str_replace('-l', '', $filtered); + $out = preg_replace('/\s+/', ' ', $out); + return explode(' ', trim($out)); } } diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index a6c329e3..8cacd39f 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -21,6 +21,8 @@ trait grpc '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK"' ) ->build(); + copy($this->source_dir . '/third_party/re2/re2.pc', BUILD_LIB_PATH . '/pkgconfig/re2.pc'); + //shell()->cd($this->source_dir) // ->exec('EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK EMBED_OPENSSL=false CXXFLAGS="-L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '" make static -j' . $this->builder->concurrency); //copy($this->source_dir . '/libs/opt/libgrpc.a', BUILD_LIB_PATH . '/libgrpc.a'); From 0ccf1a1c5da430818c18aae9cb5eea820105db8d Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 09:41:36 +0700 Subject: [PATCH 03/16] remove grpc_php_ext_src --- src/SPC/builder/extension/grpc.php | 3 +-- src/SPC/builder/unix/library/grpc.php | 17 ++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index 4cf06f4a..f1c4ce6f 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -24,8 +24,6 @@ class grpc extends Extension if (!is_link(SOURCE_PATH . '/php-src/ext/grpc')) { if (is_dir($this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc')) { shell()->exec('ln -s ' . $this->builder->getLib('grpc')->getSourceDir() . '/src/php/ext/grpc ' . SOURCE_PATH . '/php-src/ext/grpc'); - } elseif (is_dir(BUILD_ROOT_PATH . '/grpc_php_ext_src')) { - shell()->exec('ln -s ' . BUILD_ROOT_PATH . '/grpc_php_ext_src ' . SOURCE_PATH . '/php-src/ext/grpc'); } else { throw new \RuntimeException('Cannot find grpc source code'); } @@ -36,6 +34,7 @@ class grpc extends Extension } return false; } + public function patchBeforeConfigure(): bool { $libs = ' -l' . join(' -l', $this->getLibraries()); diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 8cacd39f..40e042a5 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -23,16 +23,15 @@ trait grpc ->build(); copy($this->source_dir . '/third_party/re2/re2.pc', BUILD_LIB_PATH . '/pkgconfig/re2.pc'); - //shell()->cd($this->source_dir) + // shell()->cd($this->source_dir) // ->exec('EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK EMBED_OPENSSL=false CXXFLAGS="-L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '" make static -j' . $this->builder->concurrency); - //copy($this->source_dir . '/libs/opt/libgrpc.a', BUILD_LIB_PATH . '/libgrpc.a'); - //copy($this->source_dir . '/libs/opt/libboringssl.a', BUILD_LIB_PATH . '/libboringssl.a'); - //if (!file_exists(BUILD_LIB_PATH . '/libcares.a')) { + // copy($this->source_dir . '/libs/opt/libgrpc.a', BUILD_LIB_PATH . '/libgrpc.a'); + // copy($this->source_dir . '/libs/opt/libboringssl.a', BUILD_LIB_PATH . '/libboringssl.a'); + // if (!file_exists(BUILD_LIB_PATH . '/libcares.a')) { // copy($this->source_dir . '/libs/opt/libcares.a', BUILD_LIB_PATH . '/libcares.a'); - //} - //FileSystem::copyDir($this->source_dir . '/include/grpc', BUILD_INCLUDE_PATH . '/grpc'); - //FileSystem::copyDir($this->source_dir . '/include/grpc++', BUILD_INCLUDE_PATH . '/grpc++'); - //FileSystem::copyDir($this->source_dir . '/include/grpcpp', BUILD_INCLUDE_PATH . '/grpcpp'); - //FileSystem::copyDir($this->source_dir . '/src/php/ext/grpc', BUILD_ROOT_PATH . '/grpc_php_ext_src'); + // } + // FileSystem::copyDir($this->source_dir . '/include/grpc', BUILD_INCLUDE_PATH . '/grpc'); + // FileSystem::copyDir($this->source_dir . '/include/grpc++', BUILD_INCLUDE_PATH . '/grpc++'); + // FileSystem::copyDir($this->source_dir . '/include/grpcpp', BUILD_INCLUDE_PATH . '/grpcpp'); } } From bd0042f079597f9167bce683a41bfa1a44ee8a4f Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 09:43:01 +0700 Subject: [PATCH 04/16] grpc can be built shared too --- src/SPC/builder/extension/grpc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index f1c4ce6f..c129327b 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -56,7 +56,7 @@ class grpc extends Extension public function getUnixConfigureArg(bool $shared = false): string { - return '--enable-grpc=' . BUILD_ROOT_PATH . '/grpc GRPC_LIB_SUBDIR=' . BUILD_LIB_PATH; + return '--enable-grpc=' . ($shared ? 'shared,' : '') . BUILD_ROOT_PATH . '/grpc GRPC_LIB_SUBDIR=' . BUILD_LIB_PATH; } private function getLibraries(): array From 23412d6bfa1cdbb6a88f22183a3250f799fc4222 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 09:46:06 +0700 Subject: [PATCH 05/16] enable tests --- src/globals/test-extensions.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 07d2e039..d06bdc13 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -21,15 +21,15 @@ $test_php_version = [ // test os (macos-13, macos-14, macos-15, ubuntu-latest, windows-latest are available) $test_os = [ - // 'macos-13', // bin/spc for x86_64 - // 'macos-14', // bin/spc for arm64 - // '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-latest', // .\bin\spc.ps1 + 'macos-13', // bin/spc for x86_64 + 'macos-14', // bin/spc for arm64 + '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-latest', // .\bin\spc.ps1 ]; // whether enable thread safe @@ -48,7 +48,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' => 'imap,swoole', + 'Linux', 'Darwin' => 'grpc', 'Windows' => 'curl', }; From 1f7d3ec91d18fa8b38e2280e1650701f5951e387 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 10:55:21 +0700 Subject: [PATCH 06/16] use =package --- src/SPC/builder/unix/library/grpc.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 40e042a5..941e74f1 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -12,13 +12,12 @@ trait grpc { UnixCMakeExecutor::create($this) ->addConfigureArgs( - '-DgRPC_SSL_PROVIDER=openssl', + '-DgRPC_SSL_PROVIDER=package', '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH, '-DgRPC_INSTALL_LIBDIR=' . BUILD_LIB_PATH, '-DgRPC_INSTALL_SHAREDIR=' . BUILD_ROOT_PATH . '/share/grpc', - '-DOPENSSL_ROOT_DIR=' . BUILD_ROOT_PATH, - '-DOPENSSL_INCLUDE_DIR=' . BUILD_INCLUDE_PATH, - '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK"' + '-DCMAKE_C_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"', + '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' ) ->build(); copy($this->source_dir . '/third_party/re2/re2.pc', BUILD_LIB_PATH . '/pkgconfig/re2.pc'); From bf4b35aa0ab59135ca1bf8637cfbf346ff501dcd Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 12:10:14 +0700 Subject: [PATCH 07/16] use pkgconfig to determine libs --- src/SPC/builder/extension/grpc.php | 3 +-- src/SPC/builder/unix/library/grpc.php | 11 +++++++++ src/SPC/util/SPCConfigUtil.php | 25 ++++++++++++++++++++- src/SPC/util/executor/UnixCMakeExecutor.php | 13 ++++++++++- src/globals/test-extensions.php | 6 ++--- 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/SPC/builder/extension/grpc.php b/src/SPC/builder/extension/grpc.php index c129327b..dbad1746 100644 --- a/src/SPC/builder/extension/grpc.php +++ b/src/SPC/builder/extension/grpc.php @@ -61,8 +61,7 @@ class grpc extends Extension private function getLibraries(): array { - [, $out] = shell()->execWithResult('$PKG_CONFIG --libs --static grpc'); - $libs = join(' ', $out) . ' -lupb -lupb_message_lib -lupb_json_lib -lupb_textformat_lib -lupb_mini_descriptor_lib -lupb_wire_lib -lupb_mem_lib -lupb_base_lib -lutf8_range'; + $libs = shell()->execWithResult('$PKG_CONFIG --libs --static grpc')[1][0]; $filtered = str_replace('-pthread', '', $libs); $filtered = preg_replace('/-L\S+/', '', $filtered); $filtered = preg_replace('/(?:\S*\/)?lib([a-zA-Z0-9_+-]+)\.a\b/', '-l$1', $filtered); diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 941e74f1..38ff99bb 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -4,10 +4,21 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\store\FileSystem; use SPC\util\executor\UnixCMakeExecutor; trait grpc { + public function patchBeforeBuild(): bool + { + FileSystem::replaceFileStr( + $this->source_dir . '/third_party/re2/util/pcre.h', + ["#define UTIL_PCRE_H_\n#include ", "#define UTIL_PCRE_H_"], + ["#define UTIL_PCRE_H_", "#define UTIL_PCRE_H_\n#include "], + ); + return true; + } + protected function build(): void { UnixCMakeExecutor::create($this) diff --git a/src/SPC/util/SPCConfigUtil.php b/src/SPC/util/SPCConfigUtil.php index 96c09b48..b347419b 100644 --- a/src/SPC/util/SPCConfigUtil.php +++ b/src/SPC/util/SPCConfigUtil.php @@ -106,10 +106,33 @@ class SPCConfigUtil foreach (array_reverse($libraries) as $library) { $libs = Config::getLib($library, 'static-libs', []); foreach ($libs as $lib) { - if ($withDependencies) { + $noExt = str_replace('.a', '', $lib); + $noExtNoLib = str_replace('lib', '', $noExt); + $pkgconfFileNoExt = BUILD_LIB_PATH . "/pkgconfig/{$noExt}.pc"; + $pkgconfFileNoExtNoLib = BUILD_LIB_PATH . "/pkgconfig/{$noExtNoLib}.pc"; + $llibs = null; + if (file_exists($pkgconfFileNoExt)) { + $llibs = shell()->execWithResult("pkg-config --libs --static {$noExt}")[1][0]; + } elseif (file_exists($pkgconfFileNoExtNoLib)) { + $llibs = shell()->execWithResult("pkg-config --libs --static {$noExtNoLib}")[1][0]; + } + + if (!empty($llibs)) { + $filtered = str_replace('-pthread', '', $llibs); + $filtered = preg_replace('/-L\S+/', '', $filtered); + $filtered = preg_replace('/(?:\S*\/)?lib([a-zA-Z0-9_+-]+)\.a\b/', '-l$1', $filtered); + $filtered = preg_replace('/\s+/', ' ', $filtered); + foreach (explode(' ', $filtered) as $item) { + $short_name[] = $item; + } + } elseif ($withDependencies) { $noExt = str_replace('.a', '', $lib); $requiredLibs = []; $pkgconfFile = BUILD_LIB_PATH . "/pkgconfig/{$noExt}.pc"; + if (!file_exists($pkgconfFile)) { + $noExtNoLib = str_replace('lib', '', $noExt); + $pkgconfFile = BUILD_LIB_PATH . "/pkgconfig/{$noExtNoLib}.pc"; + } if (file_exists($pkgconfFile)) { $lines = file($pkgconfFile); foreach ($lines as $value) { diff --git a/src/SPC/util/executor/UnixCMakeExecutor.php b/src/SPC/util/executor/UnixCMakeExecutor.php index b9c7ef58..dc2aa46c 100644 --- a/src/SPC/util/executor/UnixCMakeExecutor.php +++ b/src/SPC/util/executor/UnixCMakeExecutor.php @@ -24,6 +24,8 @@ class UnixCMakeExecutor extends Executor protected bool $reset = true; + protected array $extra_env = []; + public function build(string $build_pos = '..'): void { // set cmake dir @@ -34,7 +36,7 @@ class UnixCMakeExecutor extends Executor } // prepare shell - $shell = shell()->cd($this->build_dir)->initializeEnv($this->library); + $shell = shell()->cd($this->build_dir)->initializeEnv($this->library)->appendEnv($this->extra_env); // config $this->steps >= 1 && $shell->exec("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()} {$build_pos}"); @@ -77,6 +79,15 @@ class UnixCMakeExecutor extends Executor return $this; } + /** + * Add extra environment flags + */ + public function addExtraEnv(array $env): static + { + $this->extra_env = [...$this->extra_env, ...$env]; + return $this; + } + /** * To build steps. * diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index d06bdc13..417b3b67 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -13,9 +13,9 @@ declare(strict_types=1); // test php version (8.1 ~ 8.4 available, multiple for matrix) $test_php_version = [ - '8.1', - '8.2', - '8.3', + // '8.1', + // '8.2', + // '8.3', '8.4', ]; From e490a1763a3c7c5ad03e81caf18017c5fa5b016c Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 12:12:18 +0700 Subject: [PATCH 08/16] use pkgconfig to determine libs fix cs --- .php-cs-fixer.php | 1 + src/SPC/builder/unix/library/grpc.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 47d17866..55fca81a 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -4,6 +4,7 @@ declare(strict_types=1); return (new PhpCsFixer\Config()) ->setRiskyAllowed(true) + ->setUnsupportedPhpVersionAllowed(true) ->setRules([ '@PSR12' => true, '@Symfony' => true, diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 38ff99bb..954f997d 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -13,8 +13,8 @@ trait grpc { FileSystem::replaceFileStr( $this->source_dir . '/third_party/re2/util/pcre.h', - ["#define UTIL_PCRE_H_\n#include ", "#define UTIL_PCRE_H_"], - ["#define UTIL_PCRE_H_", "#define UTIL_PCRE_H_\n#include "], + ["#define UTIL_PCRE_H_\n#include ", '#define UTIL_PCRE_H_'], + ['#define UTIL_PCRE_H_', "#define UTIL_PCRE_H_\n#include "], ); return true; } From 2b39a6d535938a969f2fe5d0abbfbb196ac2fc31 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 14:29:01 +0700 Subject: [PATCH 09/16] -static-libstdc++ and -static-libgcc for static builds (musl toolchain) --- src/SPC/builder/unix/library/grpc.php | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 954f997d..cf4f089e 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -6,6 +6,7 @@ namespace SPC\builder\unix\library; use SPC\store\FileSystem; use SPC\util\executor\UnixCMakeExecutor; +use SPC\util\SPCTarget; trait grpc { @@ -21,16 +22,25 @@ trait grpc protected function build(): void { - UnixCMakeExecutor::create($this) + $cmake = UnixCMakeExecutor::create($this) ->addConfigureArgs( '-DgRPC_SSL_PROVIDER=package', '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH, '-DgRPC_INSTALL_LIBDIR=' . BUILD_LIB_PATH, '-DgRPC_INSTALL_SHAREDIR=' . BUILD_ROOT_PATH . '/share/grpc', - '-DCMAKE_C_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"', - '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' - ) - ->build(); + "-DCMAKE_C_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L" . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"', + "-DCMAKE_CXX_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L" . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' + ); + + if (SPCTarget::isStatic()) { + $cmake->addConfigureArgs( + '-DCMAKE_EXE_LINKER_FLAGS="-static-libgcc -static-libstdc++"', + '-DCMAKE_SHARED_LINKER_FLAGS="-static-libgcc -static-libstdc++"', + '-DCMAKE_CXX_STANDARD_LIBRARIES="-static-libgcc -static-libstdc++"', + ); + } + + $cmake->build(); copy($this->source_dir . '/third_party/re2/re2.pc', BUILD_LIB_PATH . '/pkgconfig/re2.pc'); // shell()->cd($this->source_dir) From 31b2e6779dc39c0c1150866b874e392182016ae7 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 14:29:27 +0700 Subject: [PATCH 10/16] cs fix --- src/SPC/builder/unix/library/grpc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index cf4f089e..09362cb7 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -28,8 +28,8 @@ trait grpc '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH, '-DgRPC_INSTALL_LIBDIR=' . BUILD_LIB_PATH, '-DgRPC_INSTALL_SHAREDIR=' . BUILD_ROOT_PATH . '/share/grpc', - "-DCMAKE_C_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L" . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"', - "-DCMAKE_CXX_FLAGS=\"-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L" . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' + '-DCMAKE_C_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"', + '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' ); if (SPCTarget::isStatic()) { From 7d85aacacef7fcc779dd2dcbd9c8ce1979a84a30 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 16:00:28 +0700 Subject: [PATCH 11/16] for some reason alpine docker fails in CI, but not locally, after I added this? --- src/SPC/builder/unix/library/grpc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 09362cb7..ac4dd677 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\linux\SystemUtil; use SPC\store\FileSystem; use SPC\util\executor\UnixCMakeExecutor; use SPC\util\SPCTarget; @@ -32,7 +33,7 @@ trait grpc '-DCMAKE_CXX_FLAGS="-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK -L' . BUILD_LIB_PATH . ' -I' . BUILD_INCLUDE_PATH . '"' ); - if (SPCTarget::isStatic()) { + if (PHP_OS_FAMILY === 'Linux' && SPCTarget::isStatic() && !SystemUtil::isMuslDist()) { $cmake->addConfigureArgs( '-DCMAKE_EXE_LINKER_FLAGS="-static-libgcc -static-libstdc++"', '-DCMAKE_SHARED_LINKER_FLAGS="-static-libgcc -static-libstdc++"', From 024542d36141ff7f7340073f0661d16ea6b4b6ac Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 16:03:28 +0700 Subject: [PATCH 12/16] oh, it will likely be this instead --- src/SPC/store/SourceManager.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/SPC/store/SourceManager.php b/src/SPC/store/SourceManager.php index 251e2fa1..4b5d181f 100644 --- a/src/SPC/store/SourceManager.php +++ b/src/SPC/store/SourceManager.php @@ -94,6 +94,9 @@ class SourceManager // if not, remove the source dir and extract again logger()->notice("Source [{$source}] hash mismatch, removing old source dir and extracting again ..."); + if ($source === 'micro') { + return; + } FileSystem::removeDir($check); $filename = LockFile::getLockFullPath($lock_content); $move_path = LockFile::getExtractPath($lock_name, SOURCE_PATH . '/' . $source); From d66d7b3a73cedc8cacd9bb57efb086ba2c62c2da Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 16:56:39 +0700 Subject: [PATCH 13/16] should be fixed properly --- src/SPC/store/SourceManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/store/SourceManager.php b/src/SPC/store/SourceManager.php index 4b5d181f..239cfcfb 100644 --- a/src/SPC/store/SourceManager.php +++ b/src/SPC/store/SourceManager.php @@ -94,7 +94,7 @@ class SourceManager // if not, remove the source dir and extract again logger()->notice("Source [{$source}] hash mismatch, removing old source dir and extracting again ..."); - if ($source === 'micro') { + if ($source === 'micro' || $source === 'grpc') { return; } FileSystem::removeDir($check); From 71f4e4525601baf6029b22ef714fde99de88c542 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 21 Jul 2025 21:22:41 +0700 Subject: [PATCH 14/16] remove workaround --- src/SPC/store/SourceManager.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/SPC/store/SourceManager.php b/src/SPC/store/SourceManager.php index 239cfcfb..251e2fa1 100644 --- a/src/SPC/store/SourceManager.php +++ b/src/SPC/store/SourceManager.php @@ -94,9 +94,6 @@ class SourceManager // if not, remove the source dir and extract again logger()->notice("Source [{$source}] hash mismatch, removing old source dir and extracting again ..."); - if ($source === 'micro' || $source === 'grpc') { - return; - } FileSystem::removeDir($check); $filename = LockFile::getLockFullPath($lock_content); $move_path = LockFile::getExtractPath($lock_name, SOURCE_PATH . '/' . $source); From e07b281577e344e8f07a1b1277e7813614ee2511 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 21 Jul 2025 21:25:33 +0700 Subject: [PATCH 15/16] fix build dir conflict --- src/SPC/builder/unix/library/grpc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index ac4dd677..4b355a0d 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -24,6 +24,7 @@ trait grpc protected function build(): void { $cmake = UnixCMakeExecutor::create($this) + ->setBuildDir('fix_BUILD_file_conflict') ->addConfigureArgs( '-DgRPC_SSL_PROVIDER=package', '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH, From 352955d6084a2151751cfe05dbd3a9d9e46ba843 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 21 Jul 2025 21:36:33 +0700 Subject: [PATCH 16/16] absolute dir? --- src/SPC/builder/unix/library/grpc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/unix/library/grpc.php b/src/SPC/builder/unix/library/grpc.php index 4b355a0d..22539015 100644 --- a/src/SPC/builder/unix/library/grpc.php +++ b/src/SPC/builder/unix/library/grpc.php @@ -24,7 +24,7 @@ trait grpc protected function build(): void { $cmake = UnixCMakeExecutor::create($this) - ->setBuildDir('fix_BUILD_file_conflict') + ->setBuildDir($this->source_dir . '/avoid_BUILD_file_conflict') ->addConfigureArgs( '-DgRPC_SSL_PROVIDER=package', '-DgRPC_INSTALL_BINDIR=' . BUILD_BIN_PATH,