From e00227f0c694195ff313e4cb42c88d6b6432daad Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sat, 7 Jun 2025 09:45:19 +0700 Subject: [PATCH 1/5] remove separate method from macosbuilder, move method from LinuxBuilder into UnixBuilderBase --- src/SPC/builder/linux/LinuxBuilder.php | 29 ----------------------- src/SPC/builder/macos/MacOSBuilder.php | 29 ----------------------- src/SPC/builder/unix/UnixBuilderBase.php | 30 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 58 deletions(-) diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 9c404dd9..80e8ac65 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -70,35 +70,6 @@ class LinuxBuilder extends UnixBuilderBase f_mkdir(BUILD_INCLUDE_PATH, recursive: true); } - /** - * @throws FileSystemException - * @throws RuntimeException - * @throws WrongUsageException - */ - public function makeAutoconfArgs(string $name, array $libSpecs): string - { - $ret = ''; - foreach ($libSpecs as $libName => $arr) { - $lib = $this->getLib($libName); - if ($lib === null && str_starts_with($libName, 'lib')) { - $lib = $this->getLib(substr($libName, 3)); - } - - $arr = $arr ?? []; - - $disableArgs = $arr[0] ?? null; - $prefix = $arr[1] ?? null; - if ($lib instanceof LinuxLibraryBase) { - logger()->info("{$name} \033[32;1mwith\033[0;1m {$libName} support"); - $ret .= $lib->makeAutoconfEnv($prefix) . ' '; - } else { - logger()->info("{$name} \033[31;1mwithout\033[0;1m {$libName} support"); - $ret .= ($disableArgs ?? "--with-{$libName}=no") . ' '; - } - } - return rtrim($ret); - } - /** * Build PHP from source. * diff --git a/src/SPC/builder/macos/MacOSBuilder.php b/src/SPC/builder/macos/MacOSBuilder.php index d9a0c505..0baf1e7d 100644 --- a/src/SPC/builder/macos/MacOSBuilder.php +++ b/src/SPC/builder/macos/MacOSBuilder.php @@ -44,35 +44,6 @@ class MacOSBuilder extends UnixBuilderBase f_mkdir(BUILD_INCLUDE_PATH, recursive: true); } - /** - * [deprecated] 生成库构建采用的 autoconf 参数列表 - * - * @param string $name 要构建的 lib 库名,传入仅供输出日志 - * @param array $lib_specs 依赖的 lib 库的 autoconf 文件 - */ - public function makeAutoconfArgs(string $name, array $lib_specs): string - { - $ret = ''; - foreach ($lib_specs as $libName => $arr) { - $lib = $this->getLib($libName); - if ($lib === null && str_starts_with($libName, 'lib')) { - $lib = $this->getLib(substr($libName, 3)); - } - - $arr = $arr ?? []; - - $disableArgs = $arr[0] ?? null; - if ($lib instanceof MacOSLibraryBase) { - logger()->info("{$name} \033[32;1mwith\033[0;1m {$libName} support"); - $ret .= '--with-' . $libName . '=yes '; - } else { - logger()->info("{$name} \033[31;1mwithout\033[0;1m {$libName} support"); - $ret .= ($disableArgs ?? "--with-{$libName}=no") . ' '; - } - } - return rtrim($ret); - } - /** * Get dynamically linked macOS frameworks * diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index 4c8df333..e8014908 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace SPC\builder\unix; use SPC\builder\BuilderBase; +use SPC\builder\linux\library\LinuxLibraryBase; use SPC\builder\linux\LinuxBuilder; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; @@ -90,6 +91,35 @@ abstract class UnixBuilderBase extends BuilderBase return $extra; } + /** + * @throws FileSystemException + * @throws RuntimeException + * @throws WrongUsageException + */ + public function makeAutoconfArgs(string $name, array $libSpecs): string + { + $ret = ''; + foreach ($libSpecs as $libName => $arr) { + $lib = $this->getLib($libName); + if ($lib === null && str_starts_with($libName, 'lib')) { + $lib = $this->getLib(substr($libName, 3)); + } + + $arr = $arr ?? []; + + $disableArgs = $arr[0] ?? null; + $prefix = $arr[1] ?? null; + if ($lib instanceof LinuxLibraryBase) { + logger()->info("{$name} \033[32;1mwith\033[0;1m {$libName} support"); + $ret .= "--with-{$libName}=no " . $lib->makeAutoconfEnv($prefix) . ' '; + } else { + logger()->info("{$name} \033[31;1mwithout\033[0;1m {$libName} support"); + $ret .= ($disableArgs ?? "--with-{$libName}=no") . ' '; + } + } + return rtrim($ret); + } + public function proveLibs(array $sorted_libraries): void { // search all supported libs From f9de43c7d4f6974616b22a4fafd9dfad2d96c21c Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sat, 7 Jun 2025 10:11:23 +0700 Subject: [PATCH 2/5] =yes --- src/SPC/builder/unix/UnixBuilderBase.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index e8014908..8a6fc5ee 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -5,8 +5,10 @@ declare(strict_types=1); namespace SPC\builder\unix; use SPC\builder\BuilderBase; +use SPC\builder\freebsd\library\BSDLibraryBase; use SPC\builder\linux\library\LinuxLibraryBase; use SPC\builder\linux\LinuxBuilder; +use SPC\builder\macos\library\MacOSLibraryBase; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; @@ -109,9 +111,9 @@ abstract class UnixBuilderBase extends BuilderBase $disableArgs = $arr[0] ?? null; $prefix = $arr[1] ?? null; - if ($lib instanceof LinuxLibraryBase) { + if ($lib instanceof LinuxLibraryBase || $lib instanceof MacOSLibraryBase || $lib instanceof BSDLibraryBase) { logger()->info("{$name} \033[32;1mwith\033[0;1m {$libName} support"); - $ret .= "--with-{$libName}=no " . $lib->makeAutoconfEnv($prefix) . ' '; + $ret .= "--with-{$libName}=yes " . $lib->makeAutoconfEnv($prefix) . ' '; } else { logger()->info("{$name} \033[31;1mwithout\033[0;1m {$libName} support"); $ret .= ($disableArgs ?? "--with-{$libName}=no") . ' '; From cfa525351a4057fee3697461c9e5718a7cbe4092 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sat, 7 Jun 2025 10:11:57 +0700 Subject: [PATCH 3/5] cs fix --- src/SPC/builder/linux/LinuxBuilder.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SPC/builder/linux/LinuxBuilder.php b/src/SPC/builder/linux/LinuxBuilder.php index 80e8ac65..1470ce50 100644 --- a/src/SPC/builder/linux/LinuxBuilder.php +++ b/src/SPC/builder/linux/LinuxBuilder.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace SPC\builder\linux; -use SPC\builder\linux\library\LinuxLibraryBase; use SPC\builder\unix\UnixBuilderBase; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; From 7d87856f4a5a6af20eb1daf44651ccfae3baf947 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sat, 7 Jun 2025 10:23:10 +0700 Subject: [PATCH 4/5] remove static libraries from libngtcp_crypto_ossl.a --- src/SPC/builder/unix/library/ngtcp2.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SPC/builder/unix/library/ngtcp2.php b/src/SPC/builder/unix/library/ngtcp2.php index 654bb8e5..e256f813 100644 --- a/src/SPC/builder/unix/library/ngtcp2.php +++ b/src/SPC/builder/unix/library/ngtcp2.php @@ -49,5 +49,10 @@ trait ngtcp2 ->execWithEnv("make -j{$this->builder->concurrency}") ->execWithEnv('make install DESTDIR=' . BUILD_ROOT_PATH); $this->patchPkgconfPrefix(['libngtcp2.pc', 'libngtcp2_crypto_ossl.pc']); + + // on macOS, the static library may contain other static libraries? + // ld: archive member 'libssl.a' not a mach-o file in libngtcp2_crypto_ossl.a + shell()->cd(BUILD_LIB_PATH) + ->exec("ar -t libngtcp2_crypto_ossl.a | grep '\.a$' | xargs -n1 ar d libngtcp2_crypto_ossl.a"); } } From 4fae158a3c1f76b305e2dbf4295d6cbd68281b4a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sat, 7 Jun 2025 10:33:41 +0700 Subject: [PATCH 5/5] cs fix --- src/SPC/builder/unix/library/ngtcp2.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPC/builder/unix/library/ngtcp2.php b/src/SPC/builder/unix/library/ngtcp2.php index e256f813..8ea280a8 100644 --- a/src/SPC/builder/unix/library/ngtcp2.php +++ b/src/SPC/builder/unix/library/ngtcp2.php @@ -53,6 +53,6 @@ trait ngtcp2 // on macOS, the static library may contain other static libraries? // ld: archive member 'libssl.a' not a mach-o file in libngtcp2_crypto_ossl.a shell()->cd(BUILD_LIB_PATH) - ->exec("ar -t libngtcp2_crypto_ossl.a | grep '\.a$' | xargs -n1 ar d libngtcp2_crypto_ossl.a"); + ->exec("ar -t libngtcp2_crypto_ossl.a | grep '\\.a$' | xargs -n1 ar d libngtcp2_crypto_ossl.a"); } }