From bf4b35aa0ab59135ca1bf8637cfbf346ff501dcd Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Jul 2025 12:10:14 +0700 Subject: [PATCH] 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', ];