mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-17 20:34:51 +08:00
Put extension and library compatibility checks before compilation (#451)
This commit is contained in:
parent
3e84becf77
commit
3136d6edc1
@ -33,7 +33,7 @@ abstract class BuilderBase
|
|||||||
protected string $patch_point = '';
|
protected string $patch_point = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build libraries
|
* Convert libraries to class
|
||||||
*
|
*
|
||||||
* @param array<string> $sorted_libraries Libraries to build (if not empty, must sort first)
|
* @param array<string> $sorted_libraries Libraries to build (if not empty, must sort first)
|
||||||
* @throws FileSystemException
|
* @throws FileSystemException
|
||||||
@ -41,7 +41,27 @@ abstract class BuilderBase
|
|||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
abstract public function buildLibs(array $sorted_libraries);
|
abstract public function proveLibs(array $sorted_libraries);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build libraries
|
||||||
|
*
|
||||||
|
* @throws FileSystemException
|
||||||
|
* @throws RuntimeException
|
||||||
|
* @throws WrongUsageException
|
||||||
|
*/
|
||||||
|
public function buildLibs(): void
|
||||||
|
{
|
||||||
|
// build all libs
|
||||||
|
foreach ($this->libs as $lib) {
|
||||||
|
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
||||||
|
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
||||||
|
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
||||||
|
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
||||||
|
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add library to build.
|
* Add library to build.
|
||||||
@ -335,6 +355,19 @@ abstract class BuilderBase
|
|||||||
return $this->patch_point;
|
return $this->patch_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate libs and exts can be compiled successfully in current environment
|
||||||
|
*/
|
||||||
|
public function validateLibsAndExts(): void
|
||||||
|
{
|
||||||
|
foreach ($this->libs as $lib) {
|
||||||
|
$lib->validate();
|
||||||
|
}
|
||||||
|
foreach ($this->exts as $ext) {
|
||||||
|
$ext->validate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function emitPatchPoint(string $point_name): void
|
public function emitPatchPoint(string $point_name): void
|
||||||
{
|
{
|
||||||
$this->patch_point = $point_name;
|
$this->patch_point = $point_name;
|
||||||
|
|||||||
@ -223,6 +223,11 @@ class Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
// do nothing, just throw wrong usage exception if not valid
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -177,6 +177,11 @@ abstract class LibraryBase
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validate(): void
|
||||||
|
{
|
||||||
|
// do nothing, just throw wrong usage exception if not valid
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current builder object.
|
* Get current builder object.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -14,11 +14,15 @@ class imap extends Extension
|
|||||||
/**
|
/**
|
||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
*/
|
*/
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getOption('enable-zts')) {
|
if ($this->builder->getOption('enable-zts')) {
|
||||||
throw new WrongUsageException('ext-imap is not thread safe, do not build it with ZTS builds');
|
throw new WrongUsageException('ext-imap is not thread safe, do not build it with ZTS builds');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
$arg = '--with-imap=' . BUILD_ROOT_PATH;
|
$arg = '--with-imap=' . BUILD_ROOT_PATH;
|
||||||
if ($this->builder->getLib('openssl') !== null) {
|
if ($this->builder->getLib('openssl') !== null) {
|
||||||
$arg .= ' --with-imap-ssl=' . BUILD_ROOT_PATH;
|
$arg .= ' --with-imap-ssl=' . BUILD_ROOT_PATH;
|
||||||
|
|||||||
@ -16,11 +16,15 @@ class opcache extends Extension
|
|||||||
* @throws WrongUsageException
|
* @throws WrongUsageException
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if ($this->builder->getPHPVersionID() < 80000) {
|
if ($this->builder->getPHPVersionID() < 80000) {
|
||||||
throw new WrongUsageException('Statically compiled PHP with Zend Opcache only available for PHP >= 8.0 !');
|
throw new WrongUsageException('Statically compiled PHP with Zend Opcache only available for PHP >= 8.0 !');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
return '--enable-opcache';
|
return '--enable-opcache';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,11 +11,10 @@ use SPC\util\CustomExt;
|
|||||||
#[CustomExt('parallel')]
|
#[CustomExt('parallel')]
|
||||||
class parallel extends Extension
|
class parallel extends Extension
|
||||||
{
|
{
|
||||||
public function getConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
if (!$this->builder->getOption('enable-zts')) {
|
if (!$this->builder->getOption('enable-zts')) {
|
||||||
throw new WrongUsageException('ext-parallel must be built with ZTS builds. Use "--enable-zts" option!');
|
throw new WrongUsageException('ext-parallel must be built with ZTS builds. Use "--enable-zts" option!');
|
||||||
}
|
}
|
||||||
return parent::getConfigureArg(); // TODO: Change the autogenerated stub
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,12 +17,16 @@ class swoole_hook_pgsql extends Extension
|
|||||||
return 'swoole';
|
return 'swoole';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
// pdo_pgsql need to be disabled
|
// pdo_pgsql need to be disabled
|
||||||
if ($this->builder->getExt('pdo_pgsql') !== null) {
|
if ($this->builder->getExt('pdo_pgsql') !== null) {
|
||||||
throw new WrongUsageException('swoole-hook-pgsql provides pdo_pgsql, if you enable pgsql hook for swoole, you must remove pdo_pgsql extension.');
|
throw new WrongUsageException('swoole-hook-pgsql provides pdo_pgsql, if you enable pgsql hook for swoole, you must remove pdo_pgsql extension.');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
// enable swoole pgsql hook
|
// enable swoole pgsql hook
|
||||||
return '--enable-swoole-pgsql';
|
return '--enable-swoole-pgsql';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,12 +17,16 @@ class swoole_hook_sqlite extends Extension
|
|||||||
return 'swoole';
|
return 'swoole';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getUnixConfigureArg(): string
|
public function validate(): void
|
||||||
{
|
{
|
||||||
// pdo_pgsql need to be disabled
|
// pdo_pgsql need to be disabled
|
||||||
if ($this->builder->getExt('pdo_sqlite') !== null) {
|
if ($this->builder->getExt('pdo_sqlite') !== null) {
|
||||||
throw new WrongUsageException('swoole-hook-sqlite provides pdo_sqlite, if you enable sqlite hook for swoole, you must remove pdo_sqlite extension.');
|
throw new WrongUsageException('swoole-hook-sqlite provides pdo_sqlite, if you enable sqlite hook for swoole, you must remove pdo_sqlite extension.');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUnixConfigureArg(): string
|
||||||
|
{
|
||||||
// enable swoole pgsql hook
|
// enable swoole pgsql hook
|
||||||
return '--enable-swoole-sqlite';
|
return '--enable-swoole-sqlite';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,7 +86,8 @@ class BSDBuilder extends UnixBuilderBase
|
|||||||
SourcePatcher::patchBeforeConfigure($this);
|
SourcePatcher::patchBeforeConfigure($this);
|
||||||
|
|
||||||
$json_74 = $this->getPHPVersionID() < 80000 ? '--enable-json ' : '';
|
$json_74 = $this->getPHPVersionID() < 80000 ? '--enable-json ' : '';
|
||||||
$zts = $this->getOption('enable-zts', false) ? '--enable-zts --disable-zend-signals ' : '';
|
$zts_enable = $this->getPHPVersionID() < 80000 ? '--enable-maintainer-zts --disable-zend-signals' : '--enable-zts --disable-zend-signals';
|
||||||
|
$zts = $this->getOption('enable-zts', false) ? $zts_enable : '';
|
||||||
|
|
||||||
$enableCli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
$enableCli = ($build_target & BUILD_TARGET_CLI) === BUILD_TARGET_CLI;
|
||||||
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;
|
||||||
|
|||||||
@ -90,7 +90,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
return $extra;
|
return $extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildLibs(array $sorted_libraries): void
|
public function proveLibs(array $sorted_libraries): void
|
||||||
{
|
{
|
||||||
// search all supported libs
|
// search all supported libs
|
||||||
$support_lib_list = [];
|
$support_lib_list = [];
|
||||||
@ -137,16 +137,6 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
SourceManager::initSource(libs: $sorted_libraries);
|
SourceManager::initSource(libs: $sorted_libraries);
|
||||||
|
|
||||||
$this->emitPatchPoint('after-libs-extract');
|
$this->emitPatchPoint('after-libs-extract');
|
||||||
|
|
||||||
// build all libs
|
|
||||||
foreach ($this->libs as $lib) {
|
|
||||||
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
|
||||||
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
|
||||||
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
|
||||||
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
|
||||||
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -205,7 +205,7 @@ class WindowsBuilder extends BuilderBase
|
|||||||
$this->deployBinary(BUILD_TARGET_MICRO);
|
$this->deployBinary(BUILD_TARGET_MICRO);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildLibs(array $sorted_libraries): void
|
public function proveLibs(array $sorted_libraries): void
|
||||||
{
|
{
|
||||||
// search all supported libs
|
// search all supported libs
|
||||||
$support_lib_list = [];
|
$support_lib_list = [];
|
||||||
@ -242,16 +242,6 @@ class WindowsBuilder extends BuilderBase
|
|||||||
|
|
||||||
// extract sources
|
// extract sources
|
||||||
SourceManager::initSource(libs: $sorted_libraries);
|
SourceManager::initSource(libs: $sorted_libraries);
|
||||||
|
|
||||||
// build all libs
|
|
||||||
foreach ($this->libs as $lib) {
|
|
||||||
match ($lib->tryBuild($this->getOption('rebuild', false))) {
|
|
||||||
BUILD_STATUS_OK => logger()->info('lib [' . $lib::NAME . '] build success'),
|
|
||||||
BUILD_STATUS_ALREADY => logger()->notice('lib [' . $lib::NAME . '] already built'),
|
|
||||||
BUILD_STATUS_FAILED => logger()->error('lib [' . $lib::NAME . '] build failed'),
|
|
||||||
default => logger()->warning('lib [' . $lib::NAME . '] build status unknown'),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -93,6 +93,9 @@ class BuildCliCommand extends BuildCommand
|
|||||||
if ($this->getOption('no-strip')) {
|
if ($this->getOption('no-strip')) {
|
||||||
logger()->warning('--with-upx-pack conflicts with --no-strip, --no-strip won\'t work!');
|
logger()->warning('--with-upx-pack conflicts with --no-strip, --no-strip won\'t work!');
|
||||||
}
|
}
|
||||||
|
if (($rule & BUILD_TARGET_MICRO) === BUILD_TARGET_MICRO) {
|
||||||
|
logger()->warning('Some cases micro.sfx cannot be packed via UPX due to dynamic size bug, be aware!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// create builder
|
// create builder
|
||||||
@ -133,17 +136,23 @@ class BuildCliCommand extends BuildCommand
|
|||||||
}
|
}
|
||||||
$this->printFormatInfo($this->getDefinedEnvs(), true);
|
$this->printFormatInfo($this->getDefinedEnvs(), true);
|
||||||
$this->printFormatInfo($indent_texts);
|
$this->printFormatInfo($indent_texts);
|
||||||
|
|
||||||
logger()->notice('Build will start after 2s ...');
|
logger()->notice('Build will start after 2s ...');
|
||||||
sleep(2);
|
sleep(2);
|
||||||
|
|
||||||
|
// compile libraries
|
||||||
|
$builder->proveLibs($libraries);
|
||||||
|
// check extensions
|
||||||
|
$builder->proveExts($extensions);
|
||||||
|
// validate libs and exts
|
||||||
|
$builder->validateLibsAndExts();
|
||||||
|
// build libraries
|
||||||
|
$builder->buildLibs();
|
||||||
|
|
||||||
if ($this->input->getOption('with-clean')) {
|
if ($this->input->getOption('with-clean')) {
|
||||||
logger()->info('Cleaning source dir...');
|
logger()->info('Cleaning source dir...');
|
||||||
FileSystem::removeDir(SOURCE_PATH);
|
FileSystem::removeDir(SOURCE_PATH);
|
||||||
}
|
}
|
||||||
// compile libraries
|
|
||||||
$builder->buildLibs($libraries);
|
|
||||||
// check extensions
|
|
||||||
$builder->proveExts($extensions);
|
|
||||||
|
|
||||||
// Process -I option
|
// Process -I option
|
||||||
$custom_ini = [];
|
$custom_ini = [];
|
||||||
|
|||||||
@ -63,7 +63,9 @@ class BuildLibsCommand extends BuildCommand
|
|||||||
$libraries = DependencyUtil::getLibs($libraries);
|
$libraries = DependencyUtil::getLibs($libraries);
|
||||||
logger()->info('Building libraries: ' . implode(',', $libraries));
|
logger()->info('Building libraries: ' . implode(',', $libraries));
|
||||||
sleep(2);
|
sleep(2);
|
||||||
$builder->buildLibs($libraries);
|
$builder->proveLibs($libraries);
|
||||||
|
$builder->validateLibsAndExts();
|
||||||
|
$builder->buildLibs();
|
||||||
|
|
||||||
$time = round(microtime(true) - START_TIME, 3);
|
$time = round(microtime(true) - START_TIME, 3);
|
||||||
logger()->info('Build libs complete, used ' . $time . ' s !');
|
logger()->info('Build libs complete, used ' . $time . ' s !');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user