Files
static-php-cli/src/SPC/toolchain/ZigToolchain.php

61 lines
2.6 KiB
PHP
Raw Normal View History

2025-06-29 16:00:17 +08:00
<?php
declare(strict_types=1);
namespace SPC\toolchain;
use SPC\exception\EnvironmentException;
2025-07-01 14:01:48 +07:00
use SPC\store\pkg\Zig;
use SPC\util\GlobalEnvManager;
2025-06-29 16:00:17 +08:00
class ZigToolchain implements ToolchainInterface
{
2025-07-01 14:01:48 +07:00
public function initEnv(): void
{
// Set environment variables for zig toolchain
2025-07-01 14:02:10 +07:00
GlobalEnvManager::putenv('SPC_LINUX_DEFAULT_CC=zig-cc');
GlobalEnvManager::putenv('SPC_LINUX_DEFAULT_CXX=zig-c++');
GlobalEnvManager::putenv('SPC_LINUX_DEFAULT_AR=zig-ar');
2026-05-05 17:56:31 +07:00
GlobalEnvManager::putenv('SPC_LINUX_DEFAULT_RANLIB=zig-ranlib');
GlobalEnvManager::putenv('SPC_LINUX_DEFAULT_LD=zig-ld.lld');
}
public function afterInit(): void
{
2025-09-09 12:10:06 +07:00
if (!Zig::isInstalled()) {
throw new EnvironmentException('You are building with zig, but zig is not installed, please install zig first. (You can use `doctor` command to install it)');
}
2025-09-09 12:10:06 +07:00
GlobalEnvManager::addPathIfNotExists(Zig::getPath());
2025-07-25 16:26:07 +07:00
f_passthru('ulimit -n 2048'); // zig opens extra file descriptors, so when a lot of extensions are built statically, 1024 is not enough
$cflags = getenv('SPC_DEFAULT_C_FLAGS') ?: '';
$cxxflags = getenv('SPC_DEFAULT_CXX_FLAGS') ?: '';
$extraCflags = getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') ?: '';
$cflags = trim($cflags . ' -Wno-date-time');
$cxxflags = trim($cxxflags . ' -Wno-date-time');
$extraCflags = trim($extraCflags . ' -Wno-date-time');
2025-07-24 18:43:10 +07:00
GlobalEnvManager::putenv("SPC_DEFAULT_C_FLAGS={$cflags}");
GlobalEnvManager::putenv("SPC_DEFAULT_CXX_FLAGS={$cxxflags}");
GlobalEnvManager::putenv("SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS={$extraCflags}");
2025-07-26 23:46:36 +07:00
GlobalEnvManager::putenv('RANLIB=zig-ranlib');
GlobalEnvManager::putenv('OBJCOPY=zig-objcopy');
$extra_libs = getenv('SPC_EXTRA_LIBS') ?: '';
if (!str_contains($extra_libs, '-lunwind')) {
// Add unwind library if not already present
$extra_libs = trim($extra_libs . ' -lunwind');
GlobalEnvManager::putenv("SPC_EXTRA_LIBS={$extra_libs}");
}
2025-10-11 10:38:51 +02:00
$cflags = getenv('SPC_DEFAULT_C_FLAGS') ?: getenv('CFLAGS') ?: '';
$has_avx512 = str_contains($cflags, '-mavx512') || str_contains($cflags, '-march=x86-64-v4');
if (!$has_avx512) {
2025-12-29 22:12:25 +01:00
$extra_vars = getenv('SPC_EXTRA_PHP_VARS') ?: '';
GlobalEnvManager::putenv("SPC_EXTRA_PHP_VARS=php_cv_have_avx512=no php_cv_have_avx512vbmi=no {$extra_vars}");
2025-10-11 10:38:51 +02:00
}
}
public function getCompilerInfo(): ?string
{
$version = shell(false)->execWithResult('zig version', false)[1][0] ?? '';
return trim("zig {$version}");
}
2025-06-29 16:00:17 +08:00
}