mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-09 18:05:36 +08:00
clang runtime bits must be passed target flag too
This commit is contained in:
@@ -10,6 +10,7 @@ use SPC\store\CurlHook;
|
|||||||
use SPC\store\Downloader;
|
use SPC\store\Downloader;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\LockFile;
|
use SPC\store\LockFile;
|
||||||
|
use SPC\util\SPCTarget;
|
||||||
|
|
||||||
class Zig extends CustomPackage
|
class Zig extends CustomPackage
|
||||||
{
|
{
|
||||||
@@ -175,15 +176,17 @@ class Zig extends CustomPackage
|
|||||||
throw new \RuntimeException("[zig] failed to fetch compiler-rt {$llvmVersion} sources; cannot build clang runtime bits (--pgo, __dso_handle, __cpu_model)");
|
throw new \RuntimeException("[zig] failed to fetch compiler-rt {$llvmVersion} sources; cannot build clang runtime bits (--pgo, __dso_handle, __cpu_model)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$targetFlag = $this->baselineZigTarget();
|
||||||
|
|
||||||
f_mkdir($libDir, recursive: true);
|
f_mkdir($libDir, recursive: true);
|
||||||
if (!file_exists($profileLib)) {
|
if (!file_exists($profileLib)) {
|
||||||
$this->buildProfileRuntime($zig, $srcRoot, $profileLib);
|
$this->buildProfileRuntime($zig, $srcRoot, $profileLib, $targetFlag);
|
||||||
}
|
}
|
||||||
if (!file_exists($crtBegin) || !file_exists($crtEnd)) {
|
if (!file_exists($crtBegin) || !file_exists($crtEnd)) {
|
||||||
$this->buildCrtObjects($zig, $srcRoot, $crtBegin, $crtEnd);
|
$this->buildCrtObjects($zig, $srcRoot, $crtBegin, $crtEnd, $targetFlag);
|
||||||
}
|
}
|
||||||
if (!file_exists($cpuModelLib)) {
|
if (!file_exists($cpuModelLib)) {
|
||||||
$this->buildCpuModelBuiltins($zig, $srcRoot, $cpuModelLib);
|
$this->buildCpuModelBuiltins($zig, $srcRoot, $cpuModelLib, $targetFlag);
|
||||||
}
|
}
|
||||||
FileSystem::removeDir($srcRoot);
|
FileSystem::removeDir($srcRoot);
|
||||||
|
|
||||||
@@ -201,7 +204,17 @@ class Zig extends CustomPackage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildCpuModelBuiltins(string $zig, string $srcRoot, string $libPath): void
|
/**
|
||||||
|
* A concrete `-target {arch}-linux-{abi}` for the clang runtime bits.
|
||||||
|
*/
|
||||||
|
private function baselineZigTarget(): string
|
||||||
|
{
|
||||||
|
$arch = SPCTarget::getTargetArch();
|
||||||
|
$abi = SPCTarget::getLibc() === 'musl' ? 'musl' : 'gnu';
|
||||||
|
return "-target {$arch}-linux-{$abi}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildCpuModelBuiltins(string $zig, string $srcRoot, string $libPath, string $targetFlag): void
|
||||||
{
|
{
|
||||||
$builtins = "{$srcRoot}/lib/builtins";
|
$builtins = "{$srcRoot}/lib/builtins";
|
||||||
$arch = php_uname('m');
|
$arch = php_uname('m');
|
||||||
@@ -226,7 +239,7 @@ class Zig extends CustomPackage
|
|||||||
$objDir = "{$srcRoot}/obj-cpu-model";
|
$objDir = "{$srcRoot}/obj-cpu-model";
|
||||||
f_mkdir($objDir, recursive: true);
|
f_mkdir($objDir, recursive: true);
|
||||||
$obj = "{$objDir}/cpu_model.o";
|
$obj = "{$objDir}/cpu_model.o";
|
||||||
$cflags = '-c -O2 -fPIC ' . $includes;
|
$cflags = $targetFlag . ' -c -O2 -fPIC ' . $includes;
|
||||||
$cmd = escapeshellarg($zig) . ' cc ' . $cflags . ' -o ' . escapeshellarg($obj) . ' ' . escapeshellarg($src) . ' 2>&1';
|
$cmd = escapeshellarg($zig) . ' cc ' . $cflags . ' -o ' . escapeshellarg($obj) . ' ' . escapeshellarg($src) . ' 2>&1';
|
||||||
if (!$this->runZigCmd($cmd, $obj, "failed to compile {$src}")) {
|
if (!$this->runZigCmd($cmd, $obj, "failed to compile {$src}")) {
|
||||||
return;
|
return;
|
||||||
@@ -259,7 +272,7 @@ class Zig extends CustomPackage
|
|||||||
return $srcRoot;
|
return $srcRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildProfileRuntime(string $zig, string $srcRoot, string $libPath): void
|
private function buildProfileRuntime(string $zig, string $srcRoot, string $libPath, string $targetFlag): void
|
||||||
{
|
{
|
||||||
$profileSrc = "{$srcRoot}/lib/profile";
|
$profileSrc = "{$srcRoot}/lib/profile";
|
||||||
$profileInc = "{$srcRoot}/include";
|
$profileInc = "{$srcRoot}/include";
|
||||||
@@ -283,7 +296,7 @@ class Zig extends CustomPackage
|
|||||||
|
|
||||||
$objDir = "{$srcRoot}/obj-profile";
|
$objDir = "{$srcRoot}/obj-profile";
|
||||||
f_mkdir($objDir, recursive: true);
|
f_mkdir($objDir, recursive: true);
|
||||||
$cflags = '-c -O2 -fPIC -fvisibility=hidden ' .
|
$cflags = $targetFlag . ' -c -O2 -fPIC -fvisibility=hidden ' .
|
||||||
'-I' . escapeshellarg($profileInc) . ' ' .
|
'-I' . escapeshellarg($profileInc) . ' ' .
|
||||||
'-DCOMPILER_RT_HAS_ATOMICS=1 -DCOMPILER_RT_HAS_FCNTL_LCK=1 -DCOMPILER_RT_HAS_UNAME=1';
|
'-DCOMPILER_RT_HAS_ATOMICS=1 -DCOMPILER_RT_HAS_FCNTL_LCK=1 -DCOMPILER_RT_HAS_UNAME=1';
|
||||||
$objs = [];
|
$objs = [];
|
||||||
@@ -302,7 +315,7 @@ class Zig extends CustomPackage
|
|||||||
logger()->info('[zig] libclang_rt.profile.a installed (' . filesize($libPath) . ' bytes)');
|
logger()->info('[zig] libclang_rt.profile.a installed (' . filesize($libPath) . ' bytes)');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildCrtObjects(string $zig, string $srcRoot, string $crtBegin, string $crtEnd): void
|
private function buildCrtObjects(string $zig, string $srcRoot, string $crtBegin, string $crtEnd, string $targetFlag): void
|
||||||
{
|
{
|
||||||
$beginSrc = "{$srcRoot}/lib/builtins/crtbegin.c";
|
$beginSrc = "{$srcRoot}/lib/builtins/crtbegin.c";
|
||||||
$endSrc = "{$srcRoot}/lib/builtins/crtend.c";
|
$endSrc = "{$srcRoot}/lib/builtins/crtend.c";
|
||||||
@@ -310,7 +323,7 @@ class Zig extends CustomPackage
|
|||||||
logger()->error("[zig] crtbegin/crtend source missing under {$srcRoot}/lib/builtins — shared libs will lack __dso_handle");
|
logger()->error("[zig] crtbegin/crtend source missing under {$srcRoot}/lib/builtins — shared libs will lack __dso_handle");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$cflags = '-c -O2 -fPIC -fvisibility=hidden -DCRT_HAS_INITFINI_ARRAY';
|
$cflags = $targetFlag . ' -c -O2 -fPIC -fvisibility=hidden -DCRT_HAS_INITFINI_ARRAY';
|
||||||
foreach ([[$beginSrc, $crtBegin], [$endSrc, $crtEnd]] as [$src, $dst]) {
|
foreach ([[$beginSrc, $crtBegin], [$endSrc, $crtEnd]] as [$src, $dst]) {
|
||||||
$cmd = escapeshellarg($zig) . ' cc ' . $cflags . ' -o ' . escapeshellarg($dst) . ' ' . escapeshellarg($src) . ' 2>&1';
|
$cmd = escapeshellarg($zig) . ' cc ' . $cflags . ' -o ' . escapeshellarg($dst) . ' ' . escapeshellarg($src) . ' 2>&1';
|
||||||
if (!$this->runZigCmd($cmd, $dst, "failed to compile {$src}")) {
|
if (!$this->runZigCmd($cmd, $dst, "failed to compile {$src}")) {
|
||||||
|
|||||||
Reference in New Issue
Block a user