From b142610800c7e285f1d63df57b5443a6fcb9d5a4 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 25 Jun 2025 14:52:50 +0700 Subject: [PATCH] move to systemutil --- config/env.ini | 3 --- src/SPC/builder/Extension.php | 7 +++--- src/SPC/builder/linux/SystemUtil.php | 36 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/config/env.ini b/config/env.ini index 48de32a0..c00aafc3 100644 --- a/config/env.ini +++ b/config/env.ini @@ -108,9 +108,6 @@ SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS="" ; EXTRA_LDFLAGS_PROGRAM for `make` php SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-all-static -pie" -# Zig -ZIG_SHARED_EXTENSION_EXTRA_OBJECTS="/usr/lib/gcc/x86_64-redhat-linux/14/crtbeginS.o /usr/lib/gcc/x86_64-redhat-linux/14/crtendS.o" - [macos] ; compiler environments CC=clang diff --git a/src/SPC/builder/Extension.php b/src/SPC/builder/Extension.php index b4b4827d..459f5f02 100644 --- a/src/SPC/builder/Extension.php +++ b/src/SPC/builder/Extension.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder; +use SPC\builder\linux\SystemUtil; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; @@ -215,13 +216,13 @@ class Extension */ public function patchBeforeSharedMake(): bool { - if (!str_contains(getenv('CC'), 'zig')) { + $extra = SystemUtil::getExtraRuntimeObjects(); + if (!$extra) { return false; } - $extra = getenv('ZIG_SHARED_EXTENSION_EXTRA_OBJECTS'); FileSystem::replaceFileRegex( $this->source_dir . '/Makefile', - "/^(shared_objects_{$this->getName()}\s*=.*)$/m", + "/^(shared_objects_{$this->getName()}\\s*=.*)$/m", "$1 {$extra}", ); return true; diff --git a/src/SPC/builder/linux/SystemUtil.php b/src/SPC/builder/linux/SystemUtil.php index cc751533..41095e22 100644 --- a/src/SPC/builder/linux/SystemUtil.php +++ b/src/SPC/builder/linux/SystemUtil.php @@ -13,6 +13,8 @@ class SystemUtil public static ?string $libc_version = null; + private static ?string $extra_runtime_objects = null; + /** @noinspection PhpMissingBreakStatementInspection */ public static function getOSRelease(): array { @@ -226,4 +228,38 @@ class SystemUtil } return null; } + + public static function getExtraRuntimeObjects(): string + { + $cc = getenv('CC'); + if (!$cc || !str_contains($cc, 'zig')) { + return ''; + } + + if (self::$extra_runtime_objects !== null) { + return self::$extra_runtime_objects; + } + + $paths = ['/usr/lib/gcc', '/usr/local/lib/gcc']; + $objects = ['crtbeginS.o', 'crtendS.o']; + $found = []; + + foreach ($objects as $obj) { + $located = null; + foreach ($paths as $base) { + $output = shell_exec("find {$base} -name {$obj} -print -quit 2>/dev/null"); + $line = trim((string) $output); + if ($line !== '') { + $located = $line; + break; + } + } + if ($located) { + $found[] = escapeshellarg($located); + } + } + + self::$extra_runtime_objects = implode(' ', $found); + return implode(' ', $found); + } }