From dbd110425e025c9be106c5b282a0036d363b27f2 Mon Sep 17 00:00:00 2001 From: Yoram Date: Fri, 4 Apr 2025 12:20:26 +0200 Subject: [PATCH 1/6] initial changes for allowing project usage via vendor mode --- src/SPC/ConsoleApplication.php | 2 +- src/SPC/builder/BuilderProvider.php | 14 +++++++++++ src/SPC/builder/unix/UnixBuilderBase.php | 6 ++++- src/SPC/builder/windows/WindowsBuilder.php | 28 ++++++++++++---------- src/SPC/store/FileSystem.php | 13 ++++++++-- src/SPC/util/CustomExt.php | 1 + 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/SPC/ConsoleApplication.php b/src/SPC/ConsoleApplication.php index 5240ca55f..62d5ed520 100644 --- a/src/SPC/ConsoleApplication.php +++ b/src/SPC/ConsoleApplication.php @@ -30,7 +30,7 @@ /** * static-php-cli console app entry */ -final class ConsoleApplication extends Application +class ConsoleApplication extends Application { public const VERSION = '2.5.1'; diff --git a/src/SPC/builder/BuilderProvider.php b/src/SPC/builder/BuilderProvider.php index 18636952d..6f03e771b 100644 --- a/src/SPC/builder/BuilderProvider.php +++ b/src/SPC/builder/BuilderProvider.php @@ -4,6 +4,7 @@ namespace SPC\builder; +use Closure; use SPC\builder\freebsd\BSDBuilder; use SPC\builder\linux\LinuxBuilder; use SPC\builder\macos\MacOSBuilder; @@ -20,6 +21,15 @@ class BuilderProvider { private static ?BuilderBase $builder = null; + private static ?Closure $customizeBuilder = null; + /** + * @param Closure(BuilderBase): void $callback + */ + public static function customize(Closure $callback): void + { + self::$customizeBuilder = $callback; + } + /** * @throws FileSystemException * @throws RuntimeException @@ -36,6 +46,10 @@ public static function makeBuilderByInput(InputInterface $input): BuilderBase 'BSD' => new BSDBuilder($input->getOptions()), default => throw new WrongUsageException('Current OS "' . PHP_OS_FAMILY . '" is not supported yet'), }; + // allow to add/customize builder instance early + if (self::$customizeBuilder) { + call_user_func_array(self::$customizeBuilder, [&self::$builder]); + } return self::$builder; } diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index ed07a7252..89bee9649 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -50,7 +50,7 @@ public function getAllStaticLibFiles(): array array_unshift($libFiles, ...$lib->getStaticLibs()); } } - return array_map(fn ($x) => realpath(BUILD_LIB_PATH . "/{$x}"), $libFiles); + return array_map(fn($x) => realpath(BUILD_LIB_PATH . "/{$x}"), $libFiles); } /** @@ -98,6 +98,10 @@ public function proveLibs(array $sorted_libraries): void ROOT_DIR . '/src/SPC/builder/' . osfamily2dir() . '/library', 'SPC\builder\\' . osfamily2dir() . '\library' ); + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '/src/builder/' . osfamily2dir() . '/library', + 'App\builder\\' . osfamily2dir() . '\library' + )); foreach ($classes as $class) { if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) { $support_lib_list[$class::NAME] = $class; diff --git a/src/SPC/builder/windows/WindowsBuilder.php b/src/SPC/builder/windows/WindowsBuilder.php index fb7eaa0fe..0b5d64e95 100644 --- a/src/SPC/builder/windows/WindowsBuilder.php +++ b/src/SPC/builder/windows/WindowsBuilder.php @@ -110,18 +110,18 @@ public function buildPHP(int $build_target = BUILD_TARGET_NONE): void cmd()->cd(SOURCE_PATH . '\php-src') ->exec( "{$this->sdk_prefix} configure.bat --task-args \"" . - '--disable-all ' . - '--disable-cgi ' . - '--with-php-build=' . BUILD_ROOT_PATH . ' ' . - '--with-extra-includes=' . BUILD_INCLUDE_PATH . ' ' . - '--with-extra-libs=' . BUILD_LIB_PATH . ' ' . - ($enableCli ? '--enable-cli=yes ' : '--enable-cli=no ') . - ($enableMicro ? ('--enable-micro=yes ' . $micro_logo . $micro_w32) : '--enable-micro=no ') . - ($enableEmbed ? '--enable-embed=yes ' : '--enable-embed=no ') . - $config_file_scan_dir . - "{$this->makeExtensionArgs()} " . - $zts . - '"' + '--disable-all ' . + '--disable-cgi ' . + '--with-php-build=' . BUILD_ROOT_PATH . ' ' . + '--with-extra-includes=' . BUILD_INCLUDE_PATH . ' ' . + '--with-extra-libs=' . BUILD_LIB_PATH . ' ' . + ($enableCli ? '--enable-cli=yes ' : '--enable-cli=no ') . + ($enableMicro ? ('--enable-micro=yes ' . $micro_logo . $micro_w32) : '--enable-micro=no ') . + ($enableEmbed ? '--enable-embed=yes ' : '--enable-embed=no ') . + $config_file_scan_dir . + "{$this->makeExtensionArgs()} " . + $zts . + '"' ); SourcePatcher::patchBeforeMake($this); @@ -223,6 +223,10 @@ public function proveLibs(array $sorted_libraries): void ROOT_DIR . '\src\SPC\builder\\' . osfamily2dir() . '\library', 'SPC\builder\\' . osfamily2dir() . '\library' ); + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '\src\builder\\' . osfamily2dir() . '\library', + 'App\builder\\' . osfamily2dir() . '\library' + )); foreach ($classes as $class) { if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) { $support_lib_list[$class::NAME] = $class; diff --git a/src/SPC/store/FileSystem.php b/src/SPC/store/FileSystem.php index 16047427b..262c4271a 100644 --- a/src/SPC/store/FileSystem.php +++ b/src/SPC/store/FileSystem.php @@ -24,16 +24,25 @@ public static function loadConfigArray(string $config, ?string $config_dir = nul WORKING_DIR . '/config/' . $config . '.json', ROOT_DIR . '/config/' . $config . '.json', ]; + + $all = []; foreach ($tries as $try) { if (file_exists($try)) { $json = json_decode(self::readFile($try), true); if (!is_array($json)) { throw new FileSystemException('Reading ' . $try . ' failed'); } - return $json; + $all = array_merge($json, $all); } } - throw new FileSystemException('Reading ' . $config . '.json failed'); + + ksort($all); + + if (count($all) === 0) { + throw new FileSystemException('Reading ' . $config . '.json failed'); + } + + return $all; } /** diff --git a/src/SPC/util/CustomExt.php b/src/SPC/util/CustomExt.php index bbd4adf70..e2758a7b1 100644 --- a/src/SPC/util/CustomExt.php +++ b/src/SPC/util/CustomExt.php @@ -24,6 +24,7 @@ public function __construct(protected string $ext_name) {} public static function loadCustomExt(): void { $classes = FileSystem::getClassesPsr4(ROOT_DIR . '/src/SPC/builder/extension', 'SPC\builder\extension'); + $classes = array_merge($classes, FileSystem::getClassesPsr4(WORKING_DIR . '/src/builder/extension', 'App\builder\extension')); foreach ($classes as $class) { $reflection = new \ReflectionClass($class); foreach ($reflection->getAttributes(CustomExt::class) as $attribute) { From 7beb915a67ed8af281fb0ba35d49092ced0b6cbe Mon Sep 17 00:00:00 2001 From: Yoram Date: Fri, 4 Apr 2025 12:50:05 +0200 Subject: [PATCH 2/6] CS fix --- src/SPC/builder/BuilderProvider.php | 8 ++++---- src/SPC/builder/unix/UnixBuilderBase.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SPC/builder/BuilderProvider.php b/src/SPC/builder/BuilderProvider.php index 6f03e771b..2d323daa5 100644 --- a/src/SPC/builder/BuilderProvider.php +++ b/src/SPC/builder/BuilderProvider.php @@ -4,7 +4,6 @@ namespace SPC\builder; -use Closure; use SPC\builder\freebsd\BSDBuilder; use SPC\builder\linux\LinuxBuilder; use SPC\builder\macos\MacOSBuilder; @@ -21,11 +20,12 @@ class BuilderProvider { private static ?BuilderBase $builder = null; - private static ?Closure $customizeBuilder = null; + private static ?\Closure $customizeBuilder = null; + /** - * @param Closure(BuilderBase): void $callback + * @param \Closure(BuilderBase): void $callback */ - public static function customize(Closure $callback): void + public static function customize(\Closure $callback): void { self::$customizeBuilder = $callback; } diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index 89bee9649..7b0bebf9b 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -50,7 +50,7 @@ public function getAllStaticLibFiles(): array array_unshift($libFiles, ...$lib->getStaticLibs()); } } - return array_map(fn($x) => realpath(BUILD_LIB_PATH . "/{$x}"), $libFiles); + return array_map(fn ($x) => realpath(BUILD_LIB_PATH . "/{$x}"), $libFiles); } /** From 289f133299a0c2f9b937e8ab4be1e1d450b4a786 Mon Sep 17 00:00:00 2001 From: Yoram Date: Fri, 4 Apr 2025 12:58:47 +0200 Subject: [PATCH 3/6] Check if WORKING_DIR locations exists before merging --- src/SPC/builder/unix/UnixBuilderBase.php | 10 ++++++---- src/SPC/builder/windows/WindowsBuilder.php | 10 ++++++---- src/SPC/util/CustomExt.php | 4 +++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/SPC/builder/unix/UnixBuilderBase.php b/src/SPC/builder/unix/UnixBuilderBase.php index 7b0bebf9b..836629047 100644 --- a/src/SPC/builder/unix/UnixBuilderBase.php +++ b/src/SPC/builder/unix/UnixBuilderBase.php @@ -98,10 +98,12 @@ public function proveLibs(array $sorted_libraries): void ROOT_DIR . '/src/SPC/builder/' . osfamily2dir() . '/library', 'SPC\builder\\' . osfamily2dir() . '\library' ); - $classes = array_merge($classes, FileSystem::getClassesPsr4( - WORKING_DIR . '/src/builder/' . osfamily2dir() . '/library', - 'App\builder\\' . osfamily2dir() . '\library' - )); + if (file_exists(WORKING_DIR . '/src/builder/' . osfamily2dir() . '/library')) { + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '/src/builder/' . osfamily2dir() . '/library', + 'App\builder\\' . osfamily2dir() . '\library' + )); + } foreach ($classes as $class) { if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) { $support_lib_list[$class::NAME] = $class; diff --git a/src/SPC/builder/windows/WindowsBuilder.php b/src/SPC/builder/windows/WindowsBuilder.php index 0b5d64e95..5c28ce406 100644 --- a/src/SPC/builder/windows/WindowsBuilder.php +++ b/src/SPC/builder/windows/WindowsBuilder.php @@ -223,10 +223,12 @@ public function proveLibs(array $sorted_libraries): void ROOT_DIR . '\src\SPC\builder\\' . osfamily2dir() . '\library', 'SPC\builder\\' . osfamily2dir() . '\library' ); - $classes = array_merge($classes, FileSystem::getClassesPsr4( - WORKING_DIR . '\src\builder\\' . osfamily2dir() . '\library', - 'App\builder\\' . osfamily2dir() . '\library' - )); + if (file_exists(WORKING_DIR . '\src\builder\\' . osfamily2dir() . '\library')) { + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '\src\builder\\' . osfamily2dir() . '\library', + 'App\builder\\' . osfamily2dir() . '\library' + )); + } foreach ($classes as $class) { if (defined($class . '::NAME') && $class::NAME !== 'unknown' && Config::getLib($class::NAME) !== null) { $support_lib_list[$class::NAME] = $class; diff --git a/src/SPC/util/CustomExt.php b/src/SPC/util/CustomExt.php index e2758a7b1..38689a503 100644 --- a/src/SPC/util/CustomExt.php +++ b/src/SPC/util/CustomExt.php @@ -24,7 +24,9 @@ public function __construct(protected string $ext_name) {} public static function loadCustomExt(): void { $classes = FileSystem::getClassesPsr4(ROOT_DIR . '/src/SPC/builder/extension', 'SPC\builder\extension'); - $classes = array_merge($classes, FileSystem::getClassesPsr4(WORKING_DIR . '/src/builder/extension', 'App\builder\extension')); + if (file_exists(WORKING_DIR . '/src/builder/extension')) { + $classes = array_merge($classes, FileSystem::getClassesPsr4(WORKING_DIR . '/src/builder/extension', 'App\builder\extension')); + } foreach ($classes as $class) { $reflection = new \ReflectionClass($class); foreach ($reflection->getAttributes(CustomExt::class) as $attribute) { From 3dde47920dba8ba1a5d3eeaf442529ddeee30fd0 Mon Sep 17 00:00:00 2001 From: Yoram Date: Tue, 15 Apr 2025 15:59:26 +0200 Subject: [PATCH 4/6] in vendor-mode load "project root" vendor autoload --- bin/spc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/spc b/bin/spc index 18dd3a383..09d92995d 100755 --- a/bin/spc +++ b/bin/spc @@ -9,12 +9,12 @@ if (PHP_OS_FAMILY !== 'Windows' && PHP_BINARY !== (__DIR__ . '/php') && file_exi pcntl_exec(__DIR__ . '/php', $argv); } -if (file_exists(dirname(__DIR__) . '/vendor/autoload.php')) { - // Current: ./bin (git/project mode) - require_once dirname(__DIR__) . '/vendor/autoload.php'; -} else { +if (file_exists(dirname(__DIR__, 3) . '/autoload.php')) { // Current: ./vendor/crazywhalecc/static-php-cli/bin (composer library mode) require_once dirname(__DIR__, 3) . '/autoload.php'; +} else { + // Current: ./bin (git/project mode) + require_once dirname(__DIR__) . '/vendor/autoload.php'; } // 防止 Micro 打包状态下不支持中文的显示(虽然这个项目目前好像没输出过中文?) From 6525ef79b91795cc3ca389db4a56e0e2adaffa5e Mon Sep 17 00:00:00 2001 From: Yoram Date: Tue, 15 Apr 2025 16:22:13 +0200 Subject: [PATCH 5/6] remove builder customizer --- src/SPC/builder/BuilderProvider.php | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/SPC/builder/BuilderProvider.php b/src/SPC/builder/BuilderProvider.php index 2d323daa5..038e97af2 100644 --- a/src/SPC/builder/BuilderProvider.php +++ b/src/SPC/builder/BuilderProvider.php @@ -20,16 +20,6 @@ class BuilderProvider { private static ?BuilderBase $builder = null; - private static ?\Closure $customizeBuilder = null; - - /** - * @param \Closure(BuilderBase): void $callback - */ - public static function customize(\Closure $callback): void - { - self::$customizeBuilder = $callback; - } - /** * @throws FileSystemException * @throws RuntimeException @@ -46,10 +36,7 @@ public static function makeBuilderByInput(InputInterface $input): BuilderBase 'BSD' => new BSDBuilder($input->getOptions()), default => throw new WrongUsageException('Current OS "' . PHP_OS_FAMILY . '" is not supported yet'), }; - // allow to add/customize builder instance early - if (self::$customizeBuilder) { - call_user_func_array(self::$customizeBuilder, [&self::$builder]); - } + return self::$builder; } From 5689a4a7f8033fff390794cc28843b7c6b133d51 Mon Sep 17 00:00:00 2001 From: Yoram Date: Wed, 23 Apr 2025 10:56:45 +0200 Subject: [PATCH 6/6] allow for custom Store sources in vendor-mode --- src/SPC/store/Downloader.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/SPC/store/Downloader.php b/src/SPC/store/Downloader.php index 69c3d322f..db2fc133d 100644 --- a/src/SPC/store/Downloader.php +++ b/src/SPC/store/Downloader.php @@ -372,6 +372,12 @@ public static function downloadPackage(string $name, ?array $pkg = null, bool $f break; case 'custom': // Custom download method, like API-based download or other $classes = FileSystem::getClassesPsr4(ROOT_DIR . '/src/SPC/store/source', 'SPC\store\source'); + if (file_exists(WORKING_DIR . '/src/store/source')) { + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '/src/store/source', + 'App\store\source' + )); + } foreach ($classes as $class) { if (is_a($class, CustomSourceBase::class, true) && $class::NAME === $name) { (new $class())->fetch($force); @@ -478,6 +484,12 @@ public static function downloadSource(string $name, ?array $source = null, bool break; case 'custom': // Custom download method, like API-based download or other $classes = FileSystem::getClassesPsr4(ROOT_DIR . '/src/SPC/store/source', 'SPC\store\source'); + if (file_exists(WORKING_DIR . '/src/store/source')) { + $classes = array_merge($classes, FileSystem::getClassesPsr4( + WORKING_DIR . '/src/store/source', + 'App\store\source' + )); + } foreach ($classes as $class) { if (is_a($class, CustomSourceBase::class, true) && $class::NAME === $name) { (new $class())->fetch($force, $source, $download_as);