static-php-cli/src/SPC/util/GlobalEnvManager.php

128 lines
4.5 KiB
PHP
Raw Normal View History

2024-04-07 15:52:24 +08:00
<?php
declare(strict_types=1);
namespace SPC\util;
use SPC\builder\BuilderBase;
2024-10-01 15:37:37 +08:00
use SPC\builder\linux\SystemUtil;
2024-04-07 15:52:24 +08:00
use SPC\exception\RuntimeException;
2024-10-01 15:37:37 +08:00
use SPC\exception\WrongUsageException;
2024-04-07 15:52:24 +08:00
/**
* Environment variable manager
*/
class GlobalEnvManager
{
private static array $env_cache = [];
public static function getInitializedEnv(): array
{
return self::$env_cache;
}
/**
* Initialize the environment variables
*
2024-10-05 12:04:14 +08:00
* @param null|BuilderBase $builder Builder
2024-04-07 15:52:24 +08:00
* @throws RuntimeException
2024-10-05 12:04:14 +08:00
* @throws WrongUsageException
2024-04-07 15:52:24 +08:00
*/
2024-10-01 15:37:37 +08:00
public static function init(?BuilderBase $builder = null): void
2024-04-07 15:52:24 +08:00
{
2024-10-01 15:37:37 +08:00
// Check pre-defined env vars exists
if (getenv('BUILD_ROOT_PATH') === false) {
throw new RuntimeException('You must include src/globals/internal-env.php before using GlobalEnvManager');
}
2024-04-07 15:52:24 +08:00
2024-10-01 15:37:37 +08:00
// Define env vars for unix
if (is_unix()) {
self::putenv('PATH=' . BUILD_ROOT_PATH . '/bin:' . getenv('PATH'));
self::putenv('PKG_CONFIG=' . BUILD_BIN_PATH . '/pkg-config');
self::putenv('PKG_CONFIG_PATH=' . BUILD_ROOT_PATH . '/lib/pkgconfig');
2024-04-07 15:52:24 +08:00
}
2024-10-01 15:37:37 +08:00
// Define env vars for linux
2025-06-19 11:01:30 +07:00
if (PHP_OS_FAMILY === 'Linux') {
$arch = getenv('GNU_ARCH');
2025-06-19 11:01:30 +07:00
if (SystemUtil::isMuslDist() || getenv('SPC_LIBC') !== 'musl') {
2024-10-01 15:37:37 +08:00
self::putenv('SPC_LINUX_DEFAULT_CC=gcc');
self::putenv('SPC_LINUX_DEFAULT_CXX=g++');
self::putenv('SPC_LINUX_DEFAULT_AR=ar');
self::putenv('SPC_LINUX_DEFAULT_LD=ld.gold');
2024-10-01 15:37:37 +08:00
} else {
self::putenv("SPC_LINUX_DEFAULT_CC={$arch}-linux-musl-gcc");
self::putenv("SPC_LINUX_DEFAULT_CXX={$arch}-linux-musl-g++");
self::putenv("SPC_LINUX_DEFAULT_AR={$arch}-linux-musl-ar");
self::putenv("SPC_LINUX_DEFAULT_LD={$arch}-linux-musl-ld");
GlobalEnvManager::putenv("PATH=/usr/local/musl/bin:/usr/local/musl/{$arch}-linux-musl/bin:" . getenv('PATH'));
2024-10-01 15:37:37 +08:00
}
2024-04-07 15:52:24 +08:00
}
2024-10-01 15:37:37 +08:00
// Init env.ini file, read order:
// WORKING_DIR/config/env.ini
// ROOT_DIR/config/env.ini
$ini_files = [
WORKING_DIR . '/config/env.ini',
ROOT_DIR . '/config/env.ini',
2024-04-07 15:52:24 +08:00
];
2025-01-28 19:37:50 +08:00
$ini_custom = [
WORKING_DIR . '/config/env.custom.ini',
ROOT_DIR . '/config/env.custom.ini',
];
2024-10-01 15:37:37 +08:00
$ini = null;
foreach ($ini_files as $ini_file) {
if (file_exists($ini_file)) {
$ini = parse_ini_file($ini_file, true);
break;
}
2024-04-07 15:52:24 +08:00
}
2024-10-01 15:37:37 +08:00
if ($ini === null) {
throw new WrongUsageException('env.ini not found');
}
if ($ini === false || !isset($ini['global'])) {
throw new WrongUsageException('Failed to parse ' . $ini_file);
}
2025-01-28 19:37:50 +08:00
// apply custom env
foreach ($ini_custom as $ini_file) {
if (file_exists($ini_file)) {
$ini_custom = parse_ini_file($ini_file, true);
if ($ini_custom !== false) {
$ini['global'] = array_merge($ini['global'], $ini_custom['global'] ?? []);
match (PHP_OS_FAMILY) {
'Windows' => $ini['windows'] = array_merge($ini['windows'], $ini_custom['windows'] ?? []),
'Darwin' => $ini['macos'] = array_merge($ini['macos'], $ini_custom['macos'] ?? []),
'Linux' => $ini['linux'] = array_merge($ini['linux'], $ini_custom['linux'] ?? []),
'BSD' => $ini['freebsd'] = array_merge($ini['freebsd'], $ini_custom['freebsd'] ?? []),
default => null,
};
}
break;
}
}
2024-10-01 15:37:37 +08:00
self::applyConfig($ini['global']);
match (PHP_OS_FAMILY) {
'Windows' => self::applyConfig($ini['windows']),
'Darwin' => self::applyConfig($ini['macos']),
'Linux' => self::applyConfig($ini['linux']),
'BSD' => self::applyConfig($ini['freebsd']),
default => null,
};
2024-04-07 15:52:24 +08:00
}
2024-10-01 15:37:37 +08:00
public static function putenv(string $val): void
2024-04-07 15:52:24 +08:00
{
2024-10-01 15:37:37 +08:00
f_putenv($val);
self::$env_cache[] = $val;
2024-04-07 15:52:24 +08:00
}
2024-10-01 15:37:37 +08:00
private static function applyConfig(array $ini): void
2024-04-07 15:52:24 +08:00
{
2024-10-01 15:37:37 +08:00
foreach ($ini as $k => $v) {
if (getenv($k) === false) {
self::putenv($k . '=' . $v);
}
2024-04-07 15:52:24 +08:00
}
}
}