mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-13 20:05:35 +08:00
Add libevent and postinstall action adder for library package
This commit is contained in:
18
config/pkg/lib/libevent.yml
Normal file
18
config/pkg/lib/libevent.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
libevent:
|
||||||
|
type: library
|
||||||
|
artifact:
|
||||||
|
source:
|
||||||
|
type: ghrel
|
||||||
|
repo: libevent/libevent
|
||||||
|
match: libevent.+\.tar\.gz
|
||||||
|
prefer-stable: true
|
||||||
|
metadata:
|
||||||
|
license-files: [LICENSE]
|
||||||
|
license: BSD-3-Clause
|
||||||
|
depends@unix:
|
||||||
|
- openssl
|
||||||
|
static-libs@unix:
|
||||||
|
- libevent.a
|
||||||
|
- libevent_core.a
|
||||||
|
- libevent_extra.a
|
||||||
|
- libevent_openssl.a
|
||||||
81
src/Package/Library/libevent.php
Normal file
81
src/Package/Library/libevent.php
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Package\Library;
|
||||||
|
|
||||||
|
use StaticPHP\Attribute\Package\BeforeStage;
|
||||||
|
use StaticPHP\Attribute\Package\BuildFor;
|
||||||
|
use StaticPHP\Attribute\Package\Library;
|
||||||
|
use StaticPHP\Package\LibraryPackage;
|
||||||
|
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||||
|
use StaticPHP\Util\FileSystem;
|
||||||
|
|
||||||
|
#[Library('libevent')]
|
||||||
|
class libevent
|
||||||
|
{
|
||||||
|
#[BeforeStage('libevent', 'packPrebuilt')]
|
||||||
|
public function beforePack(LibraryPackage $lib): void
|
||||||
|
{
|
||||||
|
$cmake_file = 'lib/cmake/libevent/LibeventTargets-static.cmake';
|
||||||
|
if (file_exists(BUILD_ROOT_PATH . '/' . $cmake_file)) {
|
||||||
|
// get pack placeholder defines
|
||||||
|
$placeholder = get_pack_replace();
|
||||||
|
|
||||||
|
// replace actual paths with placeholders
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
BUILD_ROOT_PATH . '/' . $cmake_file,
|
||||||
|
'/set\(_IMPORT_PREFIX .*\)/m',
|
||||||
|
'set(_IMPORT_PREFIX "' . $placeholder[BUILD_ROOT_PATH] . '")'
|
||||||
|
);
|
||||||
|
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
BUILD_ROOT_PATH . '/' . $cmake_file,
|
||||||
|
'/INTERFACE_INCLUDE_DIRECTORIES ".*"/m',
|
||||||
|
'INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"'
|
||||||
|
);
|
||||||
|
|
||||||
|
FileSystem::replaceFileRegex(
|
||||||
|
BUILD_ROOT_PATH . '/' . $cmake_file,
|
||||||
|
'/INTERFACE_LINK_LIBRARIES "libevent::core;.*"/m',
|
||||||
|
'INTERFACE_LINK_LIBRARIES "libevent::core;${_IMPORT_PREFIX}/lib/libssl.a;${_IMPORT_PREFIX}/lib/libcrypto.a"'
|
||||||
|
);
|
||||||
|
|
||||||
|
// add this file to postinstall for path replacement
|
||||||
|
$lib->addPostinstallAction([
|
||||||
|
'action' => 'replace-path',
|
||||||
|
'files' => [$cmake_file],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[BuildFor('Darwin')]
|
||||||
|
#[BuildFor('Linux')]
|
||||||
|
public function buildUnix(LibraryPackage $lib): void
|
||||||
|
{
|
||||||
|
$cmake = UnixCMakeExecutor::create($lib)
|
||||||
|
->addConfigureArgs(
|
||||||
|
'-DEVENT__LIBRARY_TYPE=STATIC',
|
||||||
|
'-DEVENT__DISABLE_BENCHMARK=ON',
|
||||||
|
'-DEVENT__DISABLE_THREAD_SUPPORT=ON',
|
||||||
|
'-DEVENT__DISABLE_TESTS=ON',
|
||||||
|
'-DEVENT__DISABLE_SAMPLES=ON',
|
||||||
|
'-DEVENT__DISABLE_MBEDTLS=ON ',
|
||||||
|
);
|
||||||
|
if (version_compare(get_cmake_version(), '4.0.0', '>=')) {
|
||||||
|
$cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.10');
|
||||||
|
}
|
||||||
|
$cmake->build();
|
||||||
|
|
||||||
|
$lib->patchPkgconfPrefix(['libevent.pc', 'libevent_core.pc', 'libevent_extra.pc', 'libevent_openssl.pc']);
|
||||||
|
|
||||||
|
$lib->patchPkgconfPrefix(
|
||||||
|
['libevent_openssl.pc'],
|
||||||
|
PKGCONF_PATCH_CUSTOM,
|
||||||
|
[
|
||||||
|
'/Libs.private:.*/m',
|
||||||
|
'Libs.private: -lssl -lcrypto',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,6 +21,12 @@ use StaticPHP\Util\SPCConfigUtil;
|
|||||||
*/
|
*/
|
||||||
class LibraryPackage extends Package
|
class LibraryPackage extends Package
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Custom postinstall actions for this package.
|
||||||
|
* @var array<array>
|
||||||
|
*/
|
||||||
|
private array $customPostinstallActions = [];
|
||||||
|
|
||||||
public function isInstalled(): bool
|
public function isInstalled(): bool
|
||||||
{
|
{
|
||||||
foreach (PackageConfig::get($this->getName(), 'static-libs', []) as $lib) {
|
foreach (PackageConfig::get($this->getName(), 'static-libs', []) as $lib) {
|
||||||
@@ -52,6 +58,24 @@ class LibraryPackage extends Package
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a custom postinstall action for this package.
|
||||||
|
* Available actions:
|
||||||
|
* - replace-path: Replace placeholders with actual paths
|
||||||
|
* Example: ['action' => 'replace-path', 'files' => ['lib/cmake/xxx.cmake']]
|
||||||
|
* - replace-to-env: Replace string with environment variable value
|
||||||
|
* Example: ['action' => 'replace-to-env', 'file' => 'bin/xxx-config', 'search' => 'XXX', 'replace-env' => 'BUILD_ROOT_PATH']
|
||||||
|
*
|
||||||
|
* @param array $action Action array with 'action' key and other required keys
|
||||||
|
*/
|
||||||
|
public function addPostinstallAction(array $action): void
|
||||||
|
{
|
||||||
|
if (!isset($action['action'])) {
|
||||||
|
throw new WrongUsageException('Postinstall action must have "action" key.');
|
||||||
|
}
|
||||||
|
$this->customPostinstallActions[] = $action;
|
||||||
|
}
|
||||||
|
|
||||||
public function patchLaDependencyPrefix(?array $files = null): void
|
public function patchLaDependencyPrefix(?array $files = null): void
|
||||||
{
|
{
|
||||||
logger()->info("Patching library {$this->name} la files");
|
logger()->info("Patching library {$this->name} la files");
|
||||||
@@ -234,14 +258,49 @@ class LibraryPackage extends Package
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate postinstall action file if there are files to process
|
// collect all postinstall actions
|
||||||
|
$postinstall_actions = [];
|
||||||
|
|
||||||
|
// add default replace-path action if there are .pc/.la files
|
||||||
if ($postinstall_files !== []) {
|
if ($postinstall_files !== []) {
|
||||||
$postinstall_actions = [
|
$postinstall_actions[] = [
|
||||||
[
|
'action' => 'replace-path',
|
||||||
'action' => 'replace-path',
|
'files' => $postinstall_files,
|
||||||
'files' => $postinstall_files,
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge custom postinstall actions and handle files for replace-path actions
|
||||||
|
foreach ($this->customPostinstallActions as $action) {
|
||||||
|
// if action is replace-path, process the files with placeholder replacement
|
||||||
|
if ($action['action'] === 'replace-path') {
|
||||||
|
$files = $action['files'] ?? [];
|
||||||
|
if (!is_array($files)) {
|
||||||
|
$files = [$files];
|
||||||
|
}
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (file_exists(BUILD_ROOT_PATH . '/' . $file)) {
|
||||||
|
$content = FileSystem::readFile(BUILD_ROOT_PATH . '/' . $file);
|
||||||
|
$origin_files[$file] = $content;
|
||||||
|
// replace actual paths with placeholders
|
||||||
|
$content = str_replace(
|
||||||
|
array_keys($placeholder),
|
||||||
|
array_values($placeholder),
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
FileSystem::writeFile(BUILD_ROOT_PATH . '/' . $file, $content);
|
||||||
|
// ensure this file is included in the package
|
||||||
|
if (!in_array($file, $increase_files, true)) {
|
||||||
|
$increase_files[] = $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add custom action to postinstall actions
|
||||||
|
$postinstall_actions[] = $action;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate postinstall action file if there are actions to process
|
||||||
|
if ($postinstall_actions !== []) {
|
||||||
FileSystem::writeFile($postinstall_file, json_encode($postinstall_actions, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
FileSystem::writeFile($postinstall_file, json_encode($postinstall_actions, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||||
$increase_files[] = '.package.' . $this->getName() . '.postinstall.json';
|
$increase_files[] = '.package.' . $this->getName() . '.postinstall.json';
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user