From 39953b5223ea4595b8e7d09e42557ff593a17a00 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Thu, 24 Apr 2025 14:21:07 +0800 Subject: [PATCH 1/4] Fix pack lib command with wrong compression (#710) * Fix pack lib command with wrong compression * Update src/SPC/command/dev/PackLibCommand.php Co-authored-by: Marc --------- Co-authored-by: Marc --- src/SPC/command/dev/PackLibCommand.php | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/SPC/command/dev/PackLibCommand.php b/src/SPC/command/dev/PackLibCommand.php index d7eb750a..924c3171 100644 --- a/src/SPC/command/dev/PackLibCommand.php +++ b/src/SPC/command/dev/PackLibCommand.php @@ -79,9 +79,11 @@ class PackLibCommand extends BuildCommand '{libc}' => getenv('SPC_LIBC') ?: 'default', '{libcver}' => PHP_OS_FAMILY === 'Linux' ? (SystemUtil::getLibcVersionIfExists() ?? 'default') : 'default', ]; + // detect suffix, for proper tar option + $tar_option = $this->getTarOptionFromSuffix(Config::getPreBuilt('match-pattern')); $filename = str_replace(array_keys($replace), array_values($replace), $filename); $filename = WORKING_DIR . '/dist/' . $filename; - f_passthru('tar -czf ' . $filename . ' -T ' . WORKING_DIR . '/packlib_files.txt'); + f_passthru("tar {$tar_option} {$filename} -T " . WORKING_DIR . '/packlib_files.txt'); logger()->info('Pack library ' . $lib->getName() . ' to ' . $filename . ' complete.'); } } @@ -115,4 +117,30 @@ class PackLibCommand extends BuildCommand } } } + + /** + * Get tar compress options from suffix + * + * @param string $name Package file name + * @return string Tar options for packaging libs + */ + private function getTarOptionFromSuffix(string $name): string + { + if (str_ends_with($name, '.tar')) { + return '-cf'; + } + if (str_ends_with($name, '.tar.gz') || str_ends_with($name, '.tgz')) { + return '-czf'; + } + if (str_ends_with($name, '.tar.bz2') || str_ends_with($name, '.tbz2')) { + return '-cjf'; + } + if (str_ends_with($name, '.tar.xz') || str_ends_with($name, '.txz')) { + return '-cJf'; + } + if (str_ends_with($name, '.tar.lz') || str_ends_with($name, '.tlz')) { + return '-c --lzma -f'; + } + return '-cf'; + } } From a014294d581e432645968805e600661b716914d3 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Thu, 24 Apr 2025 14:21:22 +0800 Subject: [PATCH 2/4] Fix ghrel download link, use API directly (#711) * Fix ghrel download link, use API directly * Add missing GH token for downloading API --- src/SPC/store/Downloader.php | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/SPC/store/Downloader.php b/src/SPC/store/Downloader.php index 7117bb3f..c17e5b98 100644 --- a/src/SPC/store/Downloader.php +++ b/src/SPC/store/Downloader.php @@ -121,6 +121,7 @@ class Downloader retries: self::getRetryAttempts() ), true); $url = null; + $filename = null; foreach ($data as $release) { if (($source['prefer-stable'] ?? false) === true && $release['prerelease'] === true) { continue; @@ -131,16 +132,16 @@ class Downloader } foreach ($release['assets'] as $asset) { if (preg_match('|' . $source['match'] . '|', $asset['name'])) { - $url = $asset['browser_download_url']; + $url = "https://api.github.com/repos/{$source['repo']}/releases/assets/{$asset['id']}"; + $filename = $asset['name']; break 2; } } } - if (!$url) { + if (!$url || !$filename) { throw new DownloaderException("failed to find {$name} release metadata"); } - $filename = basename($url); return [$url, $filename]; } @@ -191,7 +192,7 @@ class Downloader * @throws RuntimeException * @throws WrongUsageException */ - public static function downloadFile(string $name, string $url, string $filename, ?string $move_path = null, int $download_as = SPC_DOWNLOAD_SOURCE): void + public static function downloadFile(string $name, string $url, string $filename, ?string $move_path = null, int $download_as = SPC_DOWNLOAD_SOURCE, array $headers = [], array $hooks = []): void { logger()->debug("Downloading {$url}"); $cancel_func = function () use ($filename) { @@ -201,7 +202,7 @@ class Downloader } }; self::registerCancelEvent($cancel_func); - self::curlDown(url: $url, path: FileSystem::convertPath(DOWNLOAD_PATH . "/{$filename}"), retries: self::getRetryAttempts()); + self::curlDown(url: $url, path: FileSystem::convertPath(DOWNLOAD_PATH . "/{$filename}"), headers: $headers, hooks: $hooks, retries: self::getRetryAttempts()); self::unregisterCancelEvent(); logger()->debug("Locking {$filename}"); if ($download_as === SPC_DOWNLOAD_PRE_BUILT) { @@ -341,15 +342,15 @@ class Downloader break; case 'ghtar': // GitHub Release (tar) [$url, $filename] = self::getLatestGithubTarball($name, $pkg); - self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); + self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, hooks: [[CurlHook::class, 'setupGithubToken']]); break; case 'ghtagtar': // GitHub Tag (tar) [$url, $filename] = self::getLatestGithubTarball($name, $pkg, 'tags'); - self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); + self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, hooks: [[CurlHook::class, 'setupGithubToken']]); break; case 'ghrel': // GitHub Release (uploaded) [$url, $filename] = self::getLatestGithubRelease($name, $pkg); - self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE); + self::downloadFile($name, $url, $filename, $pkg['extract'] ?? null, SPC_DOWNLOAD_PACKAGE, ['Accept: application/octet-stream'], [[CurlHook::class, 'setupGithubToken']]); break; case 'filelist': // Basic File List (regex based crawler) [$url, $filename] = self::getFromFileList($name, $pkg); @@ -447,15 +448,15 @@ class Downloader break; case 'ghtar': // GitHub Release (tar) [$url, $filename] = self::getLatestGithubTarball($name, $source); - self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); + self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, hooks: [[CurlHook::class, 'setupGithubToken']]); break; case 'ghtagtar': // GitHub Tag (tar) [$url, $filename] = self::getLatestGithubTarball($name, $source, 'tags'); - self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); + self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, hooks: [[CurlHook::class, 'setupGithubToken']]); break; case 'ghrel': // GitHub Release (uploaded) [$url, $filename] = self::getLatestGithubRelease($name, $source); - self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as); + self::downloadFile($name, $url, $filename, $source['path'] ?? null, $download_as, ['Accept: application/octet-stream'], [[CurlHook::class, 'setupGithubToken']]); break; case 'filelist': // Basic File List (regex based crawler) [$url, $filename] = self::getFromFileList($name, $source); From 22a438ed5e7d7e0296955b2a5da8bca298deea7c Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Thu, 24 Apr 2025 14:21:37 +0800 Subject: [PATCH 3/4] Add xlswriter extension windows support (#712) * Add xlswriter extension windows support * cs fix --- config/ext.json | 1 - src/SPC/builder/extension/xlswriter.php | 19 +++++++++++++++++++ src/globals/test-extensions.php | 14 +++++++------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/config/ext.json b/config/ext.json index 6955c0a8..1df91d3b 100644 --- a/config/ext.json +++ b/config/ext.json @@ -958,7 +958,6 @@ }, "xlswriter": { "support": { - "Windows": "wip", "BSD": "wip" }, "type": "external", diff --git a/src/SPC/builder/extension/xlswriter.php b/src/SPC/builder/extension/xlswriter.php index 6319ce31..bf6f8994 100644 --- a/src/SPC/builder/extension/xlswriter.php +++ b/src/SPC/builder/extension/xlswriter.php @@ -18,4 +18,23 @@ class xlswriter extends Extension } return $arg; } + + public function getWindowsConfigureArg(): string + { + return '--with-xlswriter'; + } + + public function patchBeforeMake(): bool + { + if (PHP_OS_FAMILY === 'Windows') { + $content = file_get_contents($this->source_dir . '/library/libxlsxwriter/src/theme.c'); + $bom = pack('CCC', 0xEF, 0xBB, 0xBF); + if (substr($content, 0, 3) !== $bom) { + file_put_contents($this->source_dir . '/library/libxlsxwriter/src/theme.c', $content); + return true; + } + return false; + } + return false; + } } diff --git a/src/globals/test-extensions.php b/src/globals/test-extensions.php index 0ff22ab3..0ed31649 100644 --- a/src/globals/test-extensions.php +++ b/src/globals/test-extensions.php @@ -13,23 +13,23 @@ declare(strict_types=1); // test php version (8.1 ~ 8.4 available, multiple for matrix) $test_php_version = [ - // '8.1', - // '8.2', - // '8.3', + '8.1', + '8.2', + '8.3', '8.4', ]; // test os (macos-13, macos-14, macos-15, ubuntu-latest, windows-latest are available) $test_os = [ // 'macos-13', - 'macos-14', - 'macos-15', + // 'macos-14', + // 'macos-15', // 'ubuntu-latest', // 'ubuntu-22.04', // 'ubuntu-24.04', // 'ubuntu-22.04-arm', // 'ubuntu-24.04-arm', - // 'windows-latest', + 'windows-latest', ]; // whether enable thread safe @@ -46,7 +46,7 @@ $prefer_pre_built = false; // If you want to test your added extensions and libs, add below (comma separated, example `bcmath,openssl`). $extensions = match (PHP_OS_FAMILY) { 'Linux', 'Darwin' => 'pgsql', - 'Windows' => 'ev', + 'Windows' => 'xlswriter', }; // If you want to test shared extensions, add them below (comma separated, example `bcmath,openssl`). From f755d66342694d2139fdc2a297703372265d8882 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 28 Apr 2025 10:14:46 +0700 Subject: [PATCH 4/4] fix attr and acl build without autogen.sh (if we don't download from git) (#718) --- src/SPC/builder/unix/library/attr.php | 2 +- src/SPC/builder/unix/library/libacl.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SPC/builder/unix/library/attr.php b/src/SPC/builder/unix/library/attr.php index f57d26bd..ce542ddd 100644 --- a/src/SPC/builder/unix/library/attr.php +++ b/src/SPC/builder/unix/library/attr.php @@ -20,7 +20,7 @@ trait attr 'LIBS' => $this->getLibExtraLibs(), ]) ->execWithEnv('libtoolize --force --copy') - ->execWithEnv('./autogen.sh') + ->execWithEnv('./autogen.sh || autoreconf -if') ->execWithEnv('./configure --prefix= --enable-static --disable-shared --with-pic --disable-nls') ->execWithEnv("make -j {$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH); diff --git a/src/SPC/builder/unix/library/libacl.php b/src/SPC/builder/unix/library/libacl.php index c9e55df5..6abfbb5b 100644 --- a/src/SPC/builder/unix/library/libacl.php +++ b/src/SPC/builder/unix/library/libacl.php @@ -36,7 +36,7 @@ trait libacl 'LIBS' => $this->getLibExtraLibs(), ]) ->execWithEnv('libtoolize --force --copy') - ->execWithEnv('./autogen.sh') + ->execWithEnv('./autogen.sh || autoreconf -if') ->execWithEnv('./configure --prefix= --enable-static --disable-shared --disable-tests --disable-nls') ->execWithEnv("make -j {$this->builder->concurrency}") ->exec('make install DESTDIR=' . BUILD_ROOT_PATH);