move to systemutil

This commit is contained in:
DubbleClick 2025-06-25 14:52:50 +07:00
parent 9a3a536479
commit b142610800
3 changed files with 40 additions and 6 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);
}
}