Put extension and library compatibility checks before compilation (#451)

This commit is contained in:
Jerry Ma 2024-05-16 13:01:11 +08:00 committed by GitHub
parent 3e84becf77
commit 3136d6edc1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 86 additions and 36 deletions

View File

@ -33,7 +33,7 @@ abstract class BuilderBase
protected string $patch_point = '';
/**
* Build libraries
* Convert libraries to class
*
* @param array<string> $sorted_libraries Libraries to build (if not empty, must sort first)
* @throws FileSystemException
@ -41,7 +41,27 @@ abstract class BuilderBase
* @throws WrongUsageException
* @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.
@ -335,6 +355,19 @@ abstract class BuilderBase
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
{
$this->patch_point = $point_name;

View File

@ -223,6 +223,11 @@ class Extension
}
}
public function validate(): void
{
// do nothing, just throw wrong usage exception if not valid
}
/**
* @throws RuntimeException
*/

View File

@ -177,6 +177,11 @@ abstract class LibraryBase
return false;
}
public function validate(): void
{
// do nothing, just throw wrong usage exception if not valid
}
/**
* Get current builder object.
*/

View File

@ -14,11 +14,15 @@ class imap extends Extension
/**
* @throws WrongUsageException
*/
public function getUnixConfigureArg(): string
public function validate(): void
{
if ($this->builder->getOption('enable-zts')) {
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;
if ($this->builder->getLib('openssl') !== null) {
$arg .= ' --with-imap-ssl=' . BUILD_ROOT_PATH;

View File

@ -16,11 +16,15 @@ class opcache extends Extension
* @throws WrongUsageException
* @throws RuntimeException
*/
public function getUnixConfigureArg(): string
public function validate(): void
{
if ($this->builder->getPHPVersionID() < 80000) {
throw new WrongUsageException('Statically compiled PHP with Zend Opcache only available for PHP >= 8.0 !');
}
}
public function getUnixConfigureArg(): string
{
return '--enable-opcache';
}

View File

@ -11,11 +11,10 @@ use SPC\util\CustomExt;
#[CustomExt('parallel')]
class parallel extends Extension
{
public function getConfigureArg(): string
public function validate(): void
{
if (!$this->builder->getOption('enable-zts')) {
throw new WrongUsageException('ext-parallel must be built with ZTS builds. Use "--enable-zts" option!');
}
return parent::getConfigureArg(); // TODO: Change the autogenerated stub
}
}

View File

@ -17,12 +17,16 @@ class swoole_hook_pgsql extends Extension
return 'swoole';
}
public function getUnixConfigureArg(): string
public function validate(): void
{
// pdo_pgsql need to be disabled
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.');
}
}
public function getUnixConfigureArg(): string
{
// enable swoole pgsql hook
return '--enable-swoole-pgsql';
}

View File

@ -17,12 +17,16 @@ class swoole_hook_sqlite extends Extension
return 'swoole';
}
public function getUnixConfigureArg(): string
public function validate(): void
{
// pdo_pgsql need to be disabled
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.');
}
}
public function getUnixConfigureArg(): string
{
// enable swoole pgsql hook
return '--enable-swoole-sqlite';
}

View File

@ -86,7 +86,8 @@ class BSDBuilder extends UnixBuilderBase
SourcePatcher::patchBeforeConfigure($this);
$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;
$enableFpm = ($build_target & BUILD_TARGET_FPM) === BUILD_TARGET_FPM;

View File

@ -90,7 +90,7 @@ abstract class UnixBuilderBase extends BuilderBase
return $extra;
}
public function buildLibs(array $sorted_libraries): void
public function proveLibs(array $sorted_libraries): void
{
// search all supported libs
$support_lib_list = [];
@ -137,16 +137,6 @@ abstract class UnixBuilderBase extends BuilderBase
SourceManager::initSource(libs: $sorted_libraries);
$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'),
};
}
}
/**

View File

@ -205,7 +205,7 @@ class WindowsBuilder extends BuilderBase
$this->deployBinary(BUILD_TARGET_MICRO);
}
public function buildLibs(array $sorted_libraries): void
public function proveLibs(array $sorted_libraries): void
{
// search all supported libs
$support_lib_list = [];
@ -242,16 +242,6 @@ class WindowsBuilder extends BuilderBase
// extract sources
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'),
};
}
}
/**

View File

@ -93,6 +93,9 @@ class BuildCliCommand extends BuildCommand
if ($this->getOption('no-strip')) {
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 {
// create builder
@ -133,17 +136,23 @@ class BuildCliCommand extends BuildCommand
}
$this->printFormatInfo($this->getDefinedEnvs(), true);
$this->printFormatInfo($indent_texts);
logger()->notice('Build will start after 2s ...');
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')) {
logger()->info('Cleaning source dir...');
FileSystem::removeDir(SOURCE_PATH);
}
// compile libraries
$builder->buildLibs($libraries);
// check extensions
$builder->proveExts($extensions);
// Process -I option
$custom_ini = [];

View File

@ -63,7 +63,9 @@ class BuildLibsCommand extends BuildCommand
$libraries = DependencyUtil::getLibs($libraries);
logger()->info('Building libraries: ' . implode(',', $libraries));
sleep(2);
$builder->buildLibs($libraries);
$builder->proveLibs($libraries);
$builder->validateLibsAndExts();
$builder->buildLibs();
$time = round(microtime(true) - START_TIME, 3);
logger()->info('Build libs complete, used ' . $time . ' s !');