mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-05 15:55:39 +08:00
feat(windows): replace php-sdk-binary-tools with MSYS2 + 7za-win (#1193)
This commit is contained in:
@@ -644,7 +644,7 @@ class Artifact
|
||||
'{artifact_name}' => $this->name,
|
||||
'{pkg_root_path}' => PKG_ROOT_PATH,
|
||||
'{build_root_path}' => BUILD_ROOT_PATH,
|
||||
'{php_sdk_path}' => getenv('PHP_SDK_PATH') ?: WORKING_DIR . '/php-sdk-binary-tools',
|
||||
'{spc_msys2_path}' => getenv('SPC_MSYS2_PATH'),
|
||||
'{working_dir}' => WORKING_DIR,
|
||||
'{download_path}' => DOWNLOAD_PATH,
|
||||
'{source_path}' => SOURCE_PATH,
|
||||
|
||||
@@ -614,7 +614,7 @@ class ArtifactExtractor
|
||||
'{source_path}' => SOURCE_PATH,
|
||||
'{download_path}' => DOWNLOAD_PATH,
|
||||
'{working_dir}' => WORKING_DIR,
|
||||
'{php_sdk_path}' => getenv('PHP_SDK_PATH') ?: '',
|
||||
'{spc_msys2_path}' => getenv('SPC_MSYS2_PATH') ?: '',
|
||||
];
|
||||
return str_replace(array_keys($replacement), array_values($replacement), $path);
|
||||
}
|
||||
|
||||
@@ -76,9 +76,10 @@ class DownloadResult
|
||||
?string $version = null,
|
||||
array $metadata = [],
|
||||
?string $downloader = null,
|
||||
mixed $extract = null,
|
||||
): DownloadResult {
|
||||
$cache_type = self::isArchiveFile($filename) ? 'archive' : 'file';
|
||||
return new self($cache_type, config: $config, filename: $filename, verified: $verified, version: $version, metadata: $metadata, downloader: $downloader);
|
||||
return new self($cache_type, config: $config, filename: $filename, extract: $extract, verified: $verified, version: $version, metadata: $metadata, downloader: $downloader);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -36,6 +36,15 @@ class CraftCommand extends BaseCommand
|
||||
// set verbosity
|
||||
$this->output->setVerbosity($craft['verbosity']);
|
||||
|
||||
// sync logger level and ApplicationContext debug mode to match the new verbosity
|
||||
$level = match ($this->output->getVerbosity()) {
|
||||
OutputInterface::VERBOSITY_VERBOSE => 'info',
|
||||
OutputInterface::VERBOSITY_VERY_VERBOSE, OutputInterface::VERBOSITY_DEBUG => 'debug',
|
||||
default => 'warning',
|
||||
};
|
||||
logger()->setLevel($level);
|
||||
ApplicationContext::setDebug($this->output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG);
|
||||
|
||||
// apply env
|
||||
array_walk($craft['extra-env'], fn ($v, $k) => f_putenv("{$k}={$v}"));
|
||||
|
||||
|
||||
@@ -253,6 +253,13 @@ class TestBotCommand extends BaseCommand
|
||||
$fmt($targets),
|
||||
);
|
||||
|
||||
$available_labels = implode(', ', [
|
||||
'`need-test` (gate)',
|
||||
'`test/linux` `test/windows` `test/macos` (platform)',
|
||||
'`test/tier2` (extra arch)',
|
||||
'`test/php-83` `test/php-84` (PHP version)',
|
||||
]);
|
||||
|
||||
// Case 1: need-test absent → invite the author to add it
|
||||
if (!$need_test) {
|
||||
return implode("\n", [
|
||||
@@ -261,11 +268,9 @@ class TestBotCommand extends BaseCommand
|
||||
'',
|
||||
$detected,
|
||||
'',
|
||||
'To trigger extension build tests on this PR, add the `need-test` label:',
|
||||
'To trigger extension build tests on this PR, add the `need-test` label.',
|
||||
'',
|
||||
'**Gate**: `need-test`',
|
||||
'**Platform filter** (optional, default all): `test/linux` `test/windows` `test/macos` · `test/tier2`',
|
||||
'**PHP version** (optional, default 8.5): `test/php-83` `test/php-84`',
|
||||
'**Available labels**: ' . $available_labels,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -307,6 +312,7 @@ class TestBotCommand extends BaseCommand
|
||||
'',
|
||||
$detected,
|
||||
'**Active labels**: ' . $labels_str,
|
||||
'**Available labels**: ' . $available_labels,
|
||||
'**Config**: ' . implode(' + ', $platform_parts) . ' | ' . $php_str,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -54,13 +54,24 @@ class WindowsToolCheck
|
||||
return CheckResult::ok();
|
||||
}
|
||||
|
||||
#[CheckItem('if php-sdk-binary-tools are downloaded', limit_os: 'Windows', level: 996)]
|
||||
public function checkSDK(): ?CheckResult
|
||||
#[CheckItem('if msys2-build-essentials is installed', limit_os: 'Windows', level: 996)]
|
||||
public function checkMsys2(): ?CheckResult
|
||||
{
|
||||
if (!file_exists(getenv('PHP_SDK_PATH') . DIRECTORY_SEPARATOR . 'phpsdk-starter.bat')) {
|
||||
return CheckResult::fail('php-sdk-binary-tools not downloaded', 'install-php-sdk');
|
||||
$marker = PKG_ROOT_PATH . '\msys2-build-essentials\.spc-msys2-initialized';
|
||||
if (!file_exists($marker)) {
|
||||
return CheckResult::fail('msys2-build-essentials not installed', 'install-msys2-build-essentials');
|
||||
}
|
||||
return CheckResult::ok(getenv('PHP_SDK_PATH'));
|
||||
return CheckResult::ok(PKG_ROOT_PATH . '\msys2-build-essentials\msys64');
|
||||
}
|
||||
|
||||
#[CheckItem('if 7za.exe is installed', limit_os: 'Windows', level: 999)]
|
||||
public function check7zaWin(): ?CheckResult
|
||||
{
|
||||
$path = FileSystem::convertPath(PKG_ROOT_PATH . '\bin\7za.exe');
|
||||
if (!file_exists($path)) {
|
||||
return CheckResult::fail('7za.exe not found', 'install-7za-win');
|
||||
}
|
||||
return CheckResult::ok($path);
|
||||
}
|
||||
|
||||
#[CheckItem('if nasm installed', level: 995)]
|
||||
@@ -112,12 +123,20 @@ class WindowsToolCheck
|
||||
return true;
|
||||
}
|
||||
|
||||
#[FixItem('install-php-sdk')]
|
||||
public function installSDK(): bool
|
||||
#[FixItem('install-msys2-build-essentials')]
|
||||
public function installMsys2(): bool
|
||||
{
|
||||
FileSystem::removeDir(getenv('PHP_SDK_PATH'));
|
||||
$installer = new PackageInstaller(interactive: false);
|
||||
$installer->addInstallPackage('php-sdk-binary-tools');
|
||||
$installer->addInstallPackage('msys2-build-essentials');
|
||||
$installer->run(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
#[FixItem('install-7za-win')]
|
||||
public function install7zaWin(): bool
|
||||
{
|
||||
$installer = new PackageInstaller(interactive: false);
|
||||
$installer->addInstallPackage('7za-win');
|
||||
$installer->run(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -184,12 +184,14 @@ class DefaultShell extends Shell
|
||||
*/
|
||||
public function execute7zExtract(string $archive_path, string $target_path): bool
|
||||
{
|
||||
$sdk_path = getenv('PHP_SDK_PATH');
|
||||
if ($sdk_path === false) {
|
||||
throw new SPCInternalException('PHP_SDK_PATH environment variable is not set');
|
||||
// 7za.exe is installed by the 7za-win target package into PKG_ROOT_PATH\bin,
|
||||
// which is added to PATH by MSVCToolchain::initEnv().
|
||||
$_7z_path = FileSystem::convertPath(PKG_ROOT_PATH . '\bin\7za.exe');
|
||||
if (!file_exists($_7z_path)) {
|
||||
throw new SPCInternalException('7za.exe not found. Please install the 7za-win target package.');
|
||||
}
|
||||
|
||||
$_7z = escapeshellarg(FileSystem::convertPath($sdk_path . '/bin/7za.exe'));
|
||||
$_7z = escapeshellarg(FileSystem::convertPath($_7z_path));
|
||||
$archive_arg = escapeshellarg(FileSystem::convertPath($archive_path));
|
||||
$target_arg = escapeshellarg(FileSystem::convertPath($target_path));
|
||||
|
||||
|
||||
@@ -14,10 +14,14 @@ class MSVCToolchain implements ToolchainInterface
|
||||
public function initEnv(): void
|
||||
{
|
||||
GlobalEnvManager::addPathIfNotExists(PKG_ROOT_PATH . '\bin');
|
||||
$sdk = getenv('PHP_SDK_PATH');
|
||||
if ($sdk !== false) {
|
||||
GlobalEnvManager::addPathIfNotExists($sdk . '\bin');
|
||||
GlobalEnvManager::addPathIfNotExists($sdk . '\msys2\usr\bin');
|
||||
// msys2-build-essentials: add MSYS2 usr\bin to PATH so that 7za.exe, make, autoconf, etc. are available.
|
||||
// This must be done here because msys2-build-essentials is not a dependency of any library package,
|
||||
// so its path@windows entries are not automatically applied by the package installer at runtime.
|
||||
$msys2_path = getenv('SPC_MSYS2_PATH') ?: (PKG_ROOT_PATH . '\msys2-build-essentials\msys64');
|
||||
if (is_dir($msys2_path)) {
|
||||
GlobalEnvManager::putenv("SPC_MSYS2_PATH={$msys2_path}");
|
||||
GlobalEnvManager::addPathIfNotExists($msys2_path . '\usr\bin');
|
||||
GlobalEnvManager::addPathIfNotExists("{$msys2_path}\\usr\\lib\\p7zip");
|
||||
}
|
||||
// strawberry-perl
|
||||
if (is_dir(PKG_ROOT_PATH . '\strawberry-perl')) {
|
||||
|
||||
@@ -411,7 +411,7 @@ class FileSystem
|
||||
$replacement = [
|
||||
'{build_root_path}' => BUILD_ROOT_PATH,
|
||||
'{pkg_root_path}' => PKG_ROOT_PATH,
|
||||
'{php_sdk_path}' => getenv('PHP_SDK_PATH') ? getenv('PHP_SDK_PATH') : WORKING_DIR . '/php-sdk-binary-tools',
|
||||
'{spc_msys2_path}' => getenv('SPC_MSYS2_PATH') ?: (PKG_ROOT_PATH . DIRECTORY_SEPARATOR . 'msys2-build-essentials' . DIRECTORY_SEPARATOR . 'msys64'),
|
||||
'{working_dir}' => WORKING_DIR,
|
||||
'{download_path}' => DOWNLOAD_PATH,
|
||||
'{source_path}' => SOURCE_PATH,
|
||||
|
||||
Reference in New Issue
Block a user