mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-18 21:04:52 +08:00
fix custompackage handling
This commit is contained in:
parent
c330d02e78
commit
5c1194ea92
@ -10,6 +10,7 @@ use SPC\exception\WrongUsageException;
|
|||||||
use SPC\store\Config;
|
use SPC\store\Config;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
use SPC\store\LockFile;
|
use SPC\store\LockFile;
|
||||||
|
use SPC\store\pkg\GoXcaddy;
|
||||||
use SPC\store\SourceManager;
|
use SPC\store\SourceManager;
|
||||||
use SPC\store\SourcePatcher;
|
use SPC\store\SourcePatcher;
|
||||||
use SPC\util\AttributeMapper;
|
use SPC\util\AttributeMapper;
|
||||||
@ -507,8 +508,7 @@ abstract class BuilderBase
|
|||||||
throw new WrongUsageException('FrankenPHP SAPI is only available on Linux and macOS!');
|
throw new WrongUsageException('FrankenPHP SAPI is only available on Linux and macOS!');
|
||||||
}
|
}
|
||||||
// frankenphp needs package go-xcaddy installed
|
// frankenphp needs package go-xcaddy installed
|
||||||
$pkg_dir = PKG_ROOT_PATH . '/go-xcaddy-' . arch2gnu(php_uname('m')) . '-' . osfamily2shortname();
|
if (!GoXcaddy::isInstalled()) {
|
||||||
if (!file_exists("{$pkg_dir}/bin/go") || !file_exists("{$pkg_dir}/bin/xcaddy")) {
|
|
||||||
global $argv;
|
global $argv;
|
||||||
throw new WrongUsageException("FrankenPHP SAPI requires the go-xcaddy package, please install it first: {$argv[0]} install-pkg go-xcaddy");
|
throw new WrongUsageException("FrankenPHP SAPI requires the go-xcaddy package, please install it first: {$argv[0]} install-pkg go-xcaddy");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -266,7 +266,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
|
|
||||||
protected function buildFrankenphp(): void
|
protected function buildFrankenphp(): void
|
||||||
{
|
{
|
||||||
GlobalEnvManager::addPathIfNotExists(GoXcaddy::getEnvironment()['PATH']);
|
GlobalEnvManager::addPathIfNotExists(GoXcaddy::getPath());
|
||||||
$nobrotli = $this->getLib('brotli') === null ? ',nobrotli' : '';
|
$nobrotli = $this->getLib('brotli') === null ? ',nobrotli' : '';
|
||||||
$nowatcher = $this->getLib('watcher') === null ? ',nowatcher' : '';
|
$nowatcher = $this->getLib('watcher') === null ? ',nowatcher' : '';
|
||||||
$xcaddyModules = getenv('SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES');
|
$xcaddyModules = getenv('SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES');
|
||||||
@ -310,7 +310,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
$cflags .= ' -Wno-error=missing-profile';
|
$cflags .= ' -Wno-error=missing-profile';
|
||||||
$libs .= ' -lgcov';
|
$libs .= ' -lgcov';
|
||||||
}
|
}
|
||||||
$env = [
|
$env = [...[
|
||||||
'CGO_ENABLED' => '1',
|
'CGO_ENABLED' => '1',
|
||||||
'CGO_CFLAGS' => clean_spaces($cflags),
|
'CGO_CFLAGS' => clean_spaces($cflags),
|
||||||
'CGO_LDFLAGS' => "{$this->arch_ld_flags} {$staticFlags} {$config['ldflags']} {$libs}",
|
'CGO_LDFLAGS' => "{$this->arch_ld_flags} {$staticFlags} {$config['ldflags']} {$libs}",
|
||||||
@ -320,12 +320,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
"{$frankenPhpVersion} PHP {$libphpVersion} Caddy'\\\" " .
|
"{$frankenPhpVersion} PHP {$libphpVersion} Caddy'\\\" " .
|
||||||
"-tags={$muslTags}nobadger,nomysql,nopgx{$nobrotli}{$nowatcher}",
|
"-tags={$muslTags}nobadger,nomysql,nopgx{$nobrotli}{$nowatcher}",
|
||||||
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
|
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
|
||||||
];
|
], ...GoXcaddy::getEnvironment()];
|
||||||
foreach (GoXcaddy::getEnvironment() as $key => $value) {
|
|
||||||
if ($key !== 'PATH') {
|
|
||||||
$env[$key] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
shell()->cd(BUILD_BIN_PATH)
|
shell()->cd(BUILD_BIN_PATH)
|
||||||
->setEnv($env)
|
->setEnv($env)
|
||||||
->exec("xcaddy build --output frankenphp {$xcaddyModules}");
|
->exec("xcaddy build --output frankenphp {$xcaddyModules}");
|
||||||
|
|||||||
@ -274,7 +274,7 @@ class FileSystem
|
|||||||
public static function convertWinPathToMinGW(string $path): string
|
public static function convertWinPathToMinGW(string $path): string
|
||||||
{
|
{
|
||||||
if (preg_match('/^[A-Za-z]:/', $path)) {
|
if (preg_match('/^[A-Za-z]:/', $path)) {
|
||||||
$path = '/' . strtolower(substr($path, 0, 1)) . '/' . str_replace('\\', '/', substr($path, 2));
|
$path = '/' . strtolower($path[0]) . '/' . str_replace('\\', '/', substr($path, 2));
|
||||||
}
|
}
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
@ -314,8 +314,13 @@ class FileSystem
|
|||||||
$sub_file = self::convertPath($dir . '/' . $v);
|
$sub_file = self::convertPath($dir . '/' . $v);
|
||||||
if (is_dir($sub_file) && $recursive) {
|
if (is_dir($sub_file) && $recursive) {
|
||||||
# 如果是 目录 且 递推 , 则递推添加下级文件
|
# 如果是 目录 且 递推 , 则递推添加下级文件
|
||||||
$list = array_merge($list, self::scanDirFiles($sub_file, $recursive, $relative));
|
$sub_list = self::scanDirFiles($sub_file, $recursive, $relative);
|
||||||
} elseif (is_file($sub_file) || is_dir($sub_file) && !$recursive && $include_dir) {
|
if (is_array($sub_list)) {
|
||||||
|
foreach ($sub_list as $item) {
|
||||||
|
$list[] = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (is_file($sub_file) || (is_dir($sub_file) && !$recursive && $include_dir)) {
|
||||||
# 如果是 文件 或 (是 目录 且 不递推 且 包含目录)
|
# 如果是 文件 或 (是 目录 且 不递推 且 包含目录)
|
||||||
if (is_string($relative) && mb_strpos($sub_file, $relative) === 0) {
|
if (is_string($relative) && mb_strpos($sub_file, $relative) === 0) {
|
||||||
$list[] = ltrim(mb_substr($sub_file, mb_strlen($relative)), '/\\');
|
$list[] = ltrim(mb_substr($sub_file, mb_strlen($relative)), '/\\');
|
||||||
@ -440,7 +445,7 @@ class FileSystem
|
|||||||
public static function writeFile(string $path, mixed $content, ...$args): bool|int|string
|
public static function writeFile(string $path, mixed $content, ...$args): bool|int|string
|
||||||
{
|
{
|
||||||
$dir = pathinfo(self::convertPath($path), PATHINFO_DIRNAME);
|
$dir = pathinfo(self::convertPath($path), PATHINFO_DIRNAME);
|
||||||
if (!is_dir($dir) && !mkdir($dir, 0755, true)) {
|
if (!is_dir($dir) && !mkdir($dir, 0755, true) && !is_dir($dir)) {
|
||||||
throw new FileSystemException('Write file failed, cannot create parent directory: ' . $dir);
|
throw new FileSystemException('Write file failed, cannot create parent directory: ' . $dir);
|
||||||
}
|
}
|
||||||
return file_put_contents($path, $content, ...$args);
|
return file_put_contents($path, $content, ...$args);
|
||||||
|
|||||||
@ -30,10 +30,14 @@ abstract class CustomPackage
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the environment variables this package needs to be usable.
|
* Get the environment variables this package needs to be usable.
|
||||||
* PATH needs to be appended, rather than replaced.
|
|
||||||
*/
|
*/
|
||||||
abstract public static function getEnvironment(): array;
|
abstract public static function getEnvironment(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the PATH required to use this package.
|
||||||
|
*/
|
||||||
|
abstract public static function getPath(): ?string;
|
||||||
|
|
||||||
abstract public static function isInstalled(): bool;
|
abstract public static function isInstalled(): bool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -90,22 +90,17 @@ class GoXcaddy extends CustomPackage
|
|||||||
|
|
||||||
public static function getEnvironment(): array
|
public static function getEnvironment(): array
|
||||||
{
|
{
|
||||||
$arch = arch2gnu(php_uname('m'));
|
$packageName = 'go-xcaddy';
|
||||||
$os = match (PHP_OS_FAMILY) {
|
|
||||||
'Windows' => 'win',
|
|
||||||
'Darwin' => 'macos',
|
|
||||||
'BSD' => 'freebsd',
|
|
||||||
default => 'linux',
|
|
||||||
};
|
|
||||||
|
|
||||||
$packageName = "go-xcaddy-{$arch}-{$os}";
|
|
||||||
$pkgroot = PKG_ROOT_PATH;
|
$pkgroot = PKG_ROOT_PATH;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'PATH' => "{$pkgroot}/{$packageName}/bin",
|
|
||||||
'GOROOT' => "{$pkgroot}/{$packageName}",
|
'GOROOT' => "{$pkgroot}/{$packageName}",
|
||||||
'GOBIN' => "{$pkgroot}/{$packageName}/bin",
|
'GOBIN' => "{$pkgroot}/{$packageName}/bin",
|
||||||
'GOPATH' => "{$pkgroot}/go",
|
'GOPATH' => "{$pkgroot}/go",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getPath(): ?string
|
||||||
|
{
|
||||||
|
return PKG_ROOT_PATH . '/go-xcaddy/bin';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,23 +129,10 @@ class Zig extends CustomPackage
|
|||||||
|
|
||||||
public static function getEnvironment(): array
|
public static function getEnvironment(): array
|
||||||
{
|
{
|
||||||
$arch = arch2gnu(php_uname('m'));
|
return [];
|
||||||
$os = match (PHP_OS_FAMILY) {
|
|
||||||
'Windows' => 'win',
|
|
||||||
'Darwin' => 'macos',
|
|
||||||
'BSD' => 'freebsd',
|
|
||||||
default => 'linux',
|
|
||||||
};
|
|
||||||
|
|
||||||
$packageName = "zig-{$arch}-{$os}";
|
|
||||||
$path = PKG_ROOT_PATH . "/{$packageName}";
|
|
||||||
|
|
||||||
return [
|
|
||||||
'PATH' => $path,
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function getPath(): string
|
public static function getPath(): ?string
|
||||||
{
|
{
|
||||||
return PKG_ROOT_PATH . '/zig';
|
return PKG_ROOT_PATH . '/zig';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,10 +42,10 @@ class ZigToolchain implements ToolchainInterface
|
|||||||
|
|
||||||
public function afterInit(): void
|
public function afterInit(): void
|
||||||
{
|
{
|
||||||
if (!is_dir(Zig::getEnvironment()['PATH'])) {
|
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)');
|
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)');
|
||||||
}
|
}
|
||||||
GlobalEnvManager::addPathIfNotExists(Zig::getEnvironment()['PATH']);
|
GlobalEnvManager::addPathIfNotExists(Zig::getPath());
|
||||||
f_passthru('ulimit -n 2048'); // zig opens extra file descriptors, so when a lot of extensions are built statically, 1024 is not enough
|
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') ?: '';
|
$cflags = getenv('SPC_DEFAULT_C_FLAGS') ?: '';
|
||||||
$cxxflags = getenv('SPC_DEFAULT_CXX_FLAGS') ?: '';
|
$cxxflags = getenv('SPC_DEFAULT_CXX_FLAGS') ?: '';
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user