prevent infinite recursion if ext suggests addons that depend on the extension

This commit is contained in:
DubbleClick 2025-08-26 00:56:57 +07:00
parent a1f2126c00
commit ba326973e5

View File

@ -356,11 +356,8 @@ class Extension
/** /**
* Build shared extension * Build shared extension
*/ */
public function buildShared(): void public function buildShared(array $visited = []): void
{ {
if (Config::getExt($this->getName(), 'type') === 'addon') {
return;
}
try { try {
if (Config::getExt($this->getName(), 'type') === 'builtin' || Config::getExt($this->getName(), 'build-with-php') === true) { if (Config::getExt($this->getName(), 'type') === 'builtin' || Config::getExt($this->getName(), 'build-with-php') === true) {
if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) { if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) {
@ -375,17 +372,21 @@ class Extension
} }
if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) { if (file_exists(BUILD_MODULES_PATH . '/' . $this->getName() . '.so')) {
logger()->info('Shared extension [' . $this->getName() . '] was already built, skipping (' . $this->getName() . '.so)'); logger()->info('Shared extension [' . $this->getName() . '] was already built, skipping (' . $this->getName() . '.so)');
return;
} }
logger()->info('Building extension [' . $this->getName() . '] as shared extension (' . $this->getName() . '.so)'); logger()->info('Building extension [' . $this->getName() . '] as shared extension (' . $this->getName() . '.so)');
foreach ($this->dependencies as $dependency) { foreach ($this->dependencies as $dependency) {
if (!$dependency instanceof Extension) { if (!$dependency instanceof Extension) {
continue; continue;
} }
if (!$dependency->isBuildStatic()) { if (!$dependency->isBuildStatic() && !in_array($dependency->getName(), $visited)) {
logger()->info('extension ' . $this->getName() . ' requires extension ' . $dependency->getName()); logger()->info('extension ' . $this->getName() . ' requires extension ' . $dependency->getName());
$dependency->buildShared(); $dependency->buildShared([...$visited, $this->getName()]);
} }
} }
if (Config::getExt($this->getName(), 'type') === 'addon') {
return;
}
match (PHP_OS_FAMILY) { match (PHP_OS_FAMILY) {
'Darwin', 'Linux' => $this->buildUnixShared(), 'Darwin', 'Linux' => $this->buildUnixShared(),
default => throw new WrongUsageException(PHP_OS_FAMILY . ' build shared extensions is not supported yet'), default => throw new WrongUsageException(PHP_OS_FAMILY . ' build shared extensions is not supported yet'),