diff --git a/src/SPC/builder/BuilderBase.php b/src/SPC/builder/BuilderBase.php index e6e27cda..fdba936d 100644 --- a/src/SPC/builder/BuilderBase.php +++ b/src/SPC/builder/BuilderBase.php @@ -128,27 +128,6 @@ abstract class BuilderBase return array_filter($this->exts, fn ($ext) => $ext->isBuildStatic()); } - /** - * Check if there is a cpp extensions or libraries. - */ - public function hasCpp(): bool - { - // judge cpp-extension - $exts = array_keys($this->getExts(false)); - foreach ($exts as $ext) { - if (Config::getExt($ext, 'cpp-extension', false) === true) { - return true; - } - } - $libs = array_keys($this->getLibs()); - foreach ($libs as $lib) { - if (Config::getLib($lib, 'cpp-library', false) === true) { - return true; - } - } - return false; - } - /** * Set libs only mode. * diff --git a/src/SPC/util/SPCConfigUtil.php b/src/SPC/util/SPCConfigUtil.php index 49561c5b..edbb9926 100644 --- a/src/SPC/util/SPCConfigUtil.php +++ b/src/SPC/util/SPCConfigUtil.php @@ -6,6 +6,8 @@ namespace SPC\util; use SPC\builder\BuilderBase; use SPC\builder\BuilderProvider; +use SPC\builder\Extension; +use SPC\builder\LibraryBase; use SPC\exception\WrongUsageException; use SPC\store\Config; use Symfony\Component\Console\Input\ArgvInput; @@ -87,7 +89,7 @@ class SPCConfigUtil if (SPCTarget::getTargetOS() === 'Darwin') { $libs .= " {$this->getFrameworksString($extensions)}"; } - if ($this->builder->hasCpp() || collect($extensions)->contains(static fn (string $ext) => Config::getExt($ext)['cpp-extension'] ?? false)) { + if ($this->hasCpp($extensions, $libraries)) { $libcpp = SPCTarget::getTargetOS() === 'Darwin' ? '-lc++' : '-lstdc++'; $libs = str_replace($libcpp, '', $libs) . " {$libcpp}"; } @@ -123,6 +125,29 @@ class SPCConfigUtil ]; } + private function hasCpp(array $extensions, array $libraries): bool + { + // judge cpp-extension + $builderExtNames = array_keys($this->builder->getExts(false)); + $extNames = array_map(fn (Extension $x) => $x->getName(), $extensions); + $exts = array_unique([...$builderExtNames, ...$extNames]); + + foreach ($exts as $ext) { + if (Config::getExt($ext, 'cpp-extension', false) === true) { + return true; + } + } + $builderLibNames = array_keys($this->builder->getLibs()); + $libNames = array_map(fn (LibraryBase $x) => $x->getName(), $libraries); + $libs = array_unique([...$builderLibNames, ...$libNames]); + foreach ($libs as $lib) { + if (Config::getLib($lib, 'cpp-library', false) === true) { + return true; + } + } + return false; + } + private function getIncludesString(array $libraries): string { $base = BUILD_INCLUDE_PATH; diff --git a/tests/SPC/builder/BuilderTest.php b/tests/SPC/builder/BuilderTest.php index d28bd4d3..b4b6258f 100644 --- a/tests/SPC/builder/BuilderTest.php +++ b/tests/SPC/builder/BuilderTest.php @@ -62,12 +62,6 @@ class BuilderTest extends TestCase $this->assertInstanceOf(Extension::class, $this->builder->getExt('mbregex')); } - public function testHasCpp() - { - // mbregex doesn't have cpp - $this->assertFalse($this->builder->hasCpp()); - } - public function testMakeExtensionArgs() { $this->assertStringContainsString('--enable-mbstring', $this->builder->makeStaticExtensionArgs());