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 = ''; 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;

View File

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

View File

@ -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.
*/ */

View File

@ -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;

View File

@ -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';
} }

View File

@ -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
} }
} }

View File

@ -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';
} }

View File

@ -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';
} }

View File

@ -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;

View File

@ -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'),
};
}
} }
/** /**

View File

@ -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'),
};
}
} }
/** /**

View File

@ -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 = [];

View File

@ -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 !');