mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-09 01:45:36 +08:00
refactor: restructure tool target configs into tool package system
- Move tool configs from config/pkg/target/ to config/pkg/tool/ - Add ToolVersionRegistry for tracking installed tool versions - Delete old Target/pkgconfig.php, move to tool config - Rename: 7za-win, go-win, go-xcaddy, jom, nasm, protoc, strawberry-perl, upx, vswhere, zig, pkg-config
This commit is contained in:
@@ -1,9 +0,0 @@
|
|||||||
pkg-config:
|
|
||||||
type: target
|
|
||||||
artifact:
|
|
||||||
source: 'https://dl.static-php.dev/static-php-cli/deps/pkg-config/pkg-config-0.29.2.tar.gz'
|
|
||||||
binary:
|
|
||||||
linux-x86_64: { type: ghrel, repo: static-php/static-php-cli-hosted, match: pkg-config-x86_64-linux-musl-1.2.5.txz, extract: { bin/pkg-config: '{pkg_root_path}/bin/pkg-config' } }
|
|
||||||
linux-aarch64: { type: ghrel, repo: static-php/static-php-cli-hosted, match: pkg-config-aarch64-linux-musl-1.2.5.txz, extract: { bin/pkg-config: '{pkg_root_path}/bin/pkg-config' } }
|
|
||||||
macos-x86_64: { type: ghrel, repo: static-php/static-php-cli-hosted, match: pkg-config-x86_64-darwin.txz, extract: { bin/pkg-config: '{pkg_root_path}/bin/pkg-config' } }
|
|
||||||
macos-aarch64: { type: ghrel, repo: static-php/static-php-cli-hosted, match: pkg-config-aarch64-darwin.txz, extract: { bin/pkg-config: '{pkg_root_path}/bin/pkg-config' } }
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
zig:
|
|
||||||
type: target
|
|
||||||
artifact:
|
|
||||||
binary: custom
|
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
7za-win:
|
7za-win:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
windows-x86_64: { type: url, url: 'https://dl.static-php.dev/v3/tools/7zip/7za.exe', extract: '{pkg_root_path}/bin/7za.exe' }
|
windows-x86_64: { type: url, url: 'https://dl.static-php.dev/v3/tools/7zip/7za.exe', extract: '{pkg_root_path}/bin/7za.exe' }
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- 7za.exe
|
||||||
|
binary-subdir: bin
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
go-win:
|
go-win:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary: custom
|
binary: custom
|
||||||
env:
|
env:
|
||||||
@@ -8,3 +8,8 @@ go-win:
|
|||||||
GOPATH: '{pkg_root_path}/go-win/go'
|
GOPATH: '{pkg_root_path}/go-win/go'
|
||||||
path@windows:
|
path@windows:
|
||||||
- '{pkg_root_path}/go-win/bin'
|
- '{pkg_root_path}/go-win/bin'
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- go.exe
|
||||||
|
- gofmt.exe
|
||||||
|
binary-subdir: go-win/bin
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
go-xcaddy:
|
go-xcaddy:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary: custom
|
binary: custom
|
||||||
env:
|
env:
|
||||||
@@ -8,5 +8,8 @@ go-xcaddy:
|
|||||||
GOPATH: '{pkg_root_path}/go-xcaddy/go'
|
GOPATH: '{pkg_root_path}/go-xcaddy/go'
|
||||||
path@unix:
|
path@unix:
|
||||||
- '{pkg_root_path}/go-xcaddy/bin'
|
- '{pkg_root_path}/go-xcaddy/bin'
|
||||||
static-bins:
|
tool:
|
||||||
- xcaddy
|
provides:
|
||||||
|
- go
|
||||||
|
- gofmt
|
||||||
|
binary-subdir: go-xcaddy/bin
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
jom:
|
jom:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
windows-x86_64: { type: url, url: 'https://download.qt.io/official_releases/jom/jom.zip', extract: '{pkg_root_path}/jom' }
|
windows-x86_64: { type: url, url: 'https://download.qt.io/official_releases/jom/jom.zip', extract: '{pkg_root_path}/jom' }
|
||||||
path@windows:
|
path@windows:
|
||||||
- '{pkg_root_path}\jom'
|
- '{pkg_root_path}\jom'
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- jom.exe
|
||||||
|
binary-subdir: jom
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
nasm:
|
nasm:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
windows-x86_64: { type: url, url: 'https://dl.static-php.dev/static-php-cli/deps/nasm/nasm-2.16.01-win64.zip', extract: { nasm.exe: '{pkg_root_path}/bin/nasm.exe', ndisasm.exe: '{pkg_root_path}/bin/ndisasm.exe' } }
|
windows-x86_64: { type: url, url: 'https://dl.static-php.dev/static-php-cli/deps/nasm/nasm-2.16.01-win64.zip', extract: { nasm.exe: '{pkg_root_path}/bin/nasm.exe', ndisasm.exe: '{pkg_root_path}/bin/ndisasm.exe' } }
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- nasm.exe
|
||||||
|
- ndisasm.exe
|
||||||
|
binary-subdir: bin
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
protoc:
|
protoc:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
linux-x86_64: { type: ghrel, repo: protocolbuffers/protobuf, match: 'protoc-([0-9.]+)-linux-x86_64\.zip', extract: '{pkg_root_path}/protoc' }
|
linux-x86_64: { type: ghrel, repo: protocolbuffers/protobuf, match: 'protoc-([0-9.]+)-linux-x86_64\.zip', extract: '{pkg_root_path}/protoc' }
|
||||||
linux-aarch64: { type: ghrel, repo: protocolbuffers/protobuf, match: 'protoc-([0-9.]+)-linux-aarch_64\.zip', extract: '{pkg_root_path}/protoc' }
|
linux-aarch64: { type: ghrel, repo: protocolbuffers/protobuf, match: 'protoc-([0-9.]+)-linux-aarch_64\.zip', extract: '{pkg_root_path}/protoc' }
|
||||||
path:
|
path:
|
||||||
- '{pkg_root_path}/protoc/bin'
|
- '{pkg_root_path}/protoc/bin'
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- protoc
|
||||||
|
binary-subdir: protoc/bin
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
strawberry-perl:
|
strawberry-perl:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
windows-x86_64: { type: url, url: 'https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip', extract: '{pkg_root_path}/strawberry-perl' }
|
windows-x86_64: { type: url, url: 'https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_5380_5361/strawberry-perl-5.38.0.1-64bit-portable.zip', extract: '{pkg_root_path}/strawberry-perl' }
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- perl.exe
|
||||||
|
binary-subdir: strawberry-perl/perl/bin
|
||||||
@@ -1,7 +1,13 @@
|
|||||||
upx:
|
upx:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
linux-x86_64: { type: ghrel, repo: upx/upx, match: upx.+-amd64_linux\.tar\.xz, extract: { upx: '{pkg_root_path}/bin/upx' } }
|
linux-x86_64: { type: ghrel, repo: upx/upx, match: upx.+-amd64_linux\.tar\.xz, extract: { upx: '{pkg_root_path}/bin/upx' } }
|
||||||
linux-aarch64: { type: ghrel, repo: upx/upx, match: upx.+-arm64_linux\.tar\.xz, extract: { upx: '{pkg_root_path}/bin/upx' } }
|
linux-aarch64: { type: ghrel, repo: upx/upx, match: upx.+-arm64_linux\.tar\.xz, extract: { upx: '{pkg_root_path}/bin/upx' } }
|
||||||
windows-x86_64: { type: ghrel, repo: upx/upx, match: upx.+-win64\.zip, extract: { upx.exe: '{pkg_root_path}/bin/upx.exe' } }
|
windows-x86_64: { type: ghrel, repo: upx/upx, match: upx.+-win64\.zip, extract: { upx.exe: '{pkg_root_path}/bin/upx.exe' } }
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- upx
|
||||||
|
provides@windows:
|
||||||
|
- upx.exe
|
||||||
|
binary-subdir: bin
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
vswhere:
|
vswhere:
|
||||||
type: target
|
type: tool
|
||||||
artifact:
|
artifact:
|
||||||
binary:
|
binary:
|
||||||
windows-x86_64: { type: url, url: 'https://github.com/microsoft/vswhere/releases/download/3.1.7/vswhere.exe', extract: '{pkg_root_path}/bin/vswhere.exe' }
|
windows-x86_64: { type: url, url: 'https://github.com/microsoft/vswhere/releases/download/3.1.7/vswhere.exe', extract: '{pkg_root_path}/bin/vswhere.exe' }
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- vswhere.exe
|
||||||
|
binary-subdir: bin
|
||||||
14
config/pkg/tool/zig.yml
Normal file
14
config/pkg/tool/zig.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
zig:
|
||||||
|
type: tool
|
||||||
|
artifact:
|
||||||
|
binary: custom
|
||||||
|
tool:
|
||||||
|
provides:
|
||||||
|
- zig
|
||||||
|
- zig-cc
|
||||||
|
- zig-c++
|
||||||
|
- zig-ar
|
||||||
|
- zig-ld.lld
|
||||||
|
- zig-ranlib
|
||||||
|
- zig-objcopy
|
||||||
|
binary-subdir: zig
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Package\Target;
|
|
||||||
|
|
||||||
use StaticPHP\Attribute\Package\BuildFor;
|
|
||||||
use StaticPHP\Attribute\Package\InitPackage;
|
|
||||||
use StaticPHP\Attribute\Package\Target;
|
|
||||||
use StaticPHP\DI\ApplicationContext;
|
|
||||||
use StaticPHP\Package\TargetPackage;
|
|
||||||
use StaticPHP\Runtime\Executor\UnixAutoconfExecutor;
|
|
||||||
use StaticPHP\Toolchain\Interface\ToolchainInterface;
|
|
||||||
|
|
||||||
#[Target('pkg-config')]
|
|
||||||
class pkgconfig
|
|
||||||
{
|
|
||||||
#[InitPackage]
|
|
||||||
public function resolveBuild(): void
|
|
||||||
{
|
|
||||||
ApplicationContext::set('elephant', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[BuildFor('Linux')]
|
|
||||||
#[BuildFor('Darwin')]
|
|
||||||
public function build(TargetPackage $package, ToolchainInterface $toolchain): void
|
|
||||||
{
|
|
||||||
UnixAutoconfExecutor::create($package)
|
|
||||||
->appendEnv([
|
|
||||||
'CFLAGS' => '-Wimplicit-function-declaration -Wno-int-conversion',
|
|
||||||
'LDFLAGS' => $toolchain->isStatic() ? '--static' : '',
|
|
||||||
])
|
|
||||||
->configure(
|
|
||||||
'--with-internal-glib',
|
|
||||||
'--disable-host-tool',
|
|
||||||
'--without-sysroot',
|
|
||||||
'--without-system-include-path',
|
|
||||||
'--without-system-library-path',
|
|
||||||
'--without-pc-path',
|
|
||||||
)
|
|
||||||
->make(with_install: 'install-exec');
|
|
||||||
|
|
||||||
shell()->exec("strip {$package->getBinDir()}/pkg-config");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
79
src/StaticPHP/Package/ToolVersionRegistry.php
Normal file
79
src/StaticPHP/Package/ToolVersionRegistry.php
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace StaticPHP\Package;
|
||||||
|
|
||||||
|
use StaticPHP\Runtime\SystemTarget;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracks the version actually installed on disk for tool packages (PKG_ROOT_PATH), separate from
|
||||||
|
* the download cache (ArtifactCache). Tools are installed once and reused across many builds, so
|
||||||
|
* the download cache (which only reflects the last download) can drift from what's really on disk
|
||||||
|
* (e.g. cache cleared, or installed a long time ago via `doctor`). This registry is the source of
|
||||||
|
* truth for "what version is currently installed", used by ToolPackage::getInstalledVersion() and
|
||||||
|
* the `check-update --installed` flag.
|
||||||
|
*
|
||||||
|
* Backed by a small JSON file at PKG_ROOT_PATH/.spc-tool-versions.json, mirroring the same
|
||||||
|
* read-once/write-through pattern used by StaticPHP\Artifact\ArtifactCache.
|
||||||
|
*/
|
||||||
|
class ToolVersionRegistry
|
||||||
|
{
|
||||||
|
/** @var null|array<string, array{version: null|string, platform: string, installed_at: string}> */
|
||||||
|
private static ?array $data = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the recorded installed version for a tool, or null if never recorded (not a tool
|
||||||
|
* package, not installed yet, or the artifact doesn't expose a version).
|
||||||
|
*/
|
||||||
|
public static function get(string $tool_name): ?string
|
||||||
|
{
|
||||||
|
self::load();
|
||||||
|
return self::$data[$tool_name]['version'] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record the version currently installed for a tool. Called after a tool package's binary
|
||||||
|
* has been (re-)installed, regardless of whether extraction actually ran (keeps the registry
|
||||||
|
* self-healing if it was deleted separately from the installed files).
|
||||||
|
*/
|
||||||
|
public static function record(string $tool_name, ?string $version): void
|
||||||
|
{
|
||||||
|
self::load();
|
||||||
|
self::$data[$tool_name] = [
|
||||||
|
'version' => $version,
|
||||||
|
'platform' => SystemTarget::getCurrentPlatformString(),
|
||||||
|
'installed_at' => date('c'),
|
||||||
|
];
|
||||||
|
self::save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getPath(): string
|
||||||
|
{
|
||||||
|
return PKG_ROOT_PATH . '/.spc-tool-versions.json';
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function load(): void
|
||||||
|
{
|
||||||
|
if (self::$data !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$path = self::getPath();
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
self::$data = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$content = file_get_contents($path);
|
||||||
|
self::$data = is_string($content) ? (json_decode($content, true) ?: []) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function save(): void
|
||||||
|
{
|
||||||
|
$path = self::getPath();
|
||||||
|
$dir = dirname($path);
|
||||||
|
if (!is_dir($dir)) {
|
||||||
|
@mkdir($dir, 0755, true);
|
||||||
|
}
|
||||||
|
file_put_contents($path, json_encode(self::$data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user