diff --git a/src/SPC/command/CraftCommand.php b/src/SPC/command/CraftCommand.php
index 7a4765ac..4483340a 100644
--- a/src/SPC/command/CraftCommand.php
+++ b/src/SPC/command/CraftCommand.php
@@ -10,6 +10,7 @@ use SPC\store\pkg\Zig;
use SPC\toolchain\ToolchainManager;
use SPC\toolchain\ZigToolchain;
use SPC\util\ConfigValidator;
+use SPC\util\DependencyUtil;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Process\Process;
@@ -22,6 +23,7 @@ class CraftCommand extends BuildCommand
$this->addOption('pgi', null, null, 'Forward --pgi to the inner build (instrumented binaries).');
$this->addOption('cs-pgi', null, null, 'Forward --cs-pgi to the inner build (cs-instrumented binaries).');
$this->addOption('pgo', null, null, 'Forward --pgo to the inner build (use collected profile data).');
+ $this->addOption('libs-only', null, null, 'Build only the libraries needed by the configured exts (skip PHP and extension build).');
}
public function handle(): int
@@ -106,17 +108,38 @@ class CraftCommand extends BuildCommand
// craft build
if ($craft['craft-options']['build']) {
- $args = [$static_extensions, "--with-libs={$libs}", "--build-shared={$shared_extensions}", ...array_map(fn ($x) => "--build-{$x}", $craft['sapi'])];
- $this->optionsToArguments($craft['build-options'], $args);
- foreach (['pgi', 'cs-pgi', 'pgo'] as $pgoFlag) {
- if ($this->getOption($pgoFlag)) {
- $args[] = "--{$pgoFlag}";
+ if ($this->getOption('libs-only')) {
+ $exts = array_merge($craft['extensions'], $craft['shared-extensions'] ?? []);
+ $include_suggested_exts = (bool) ($craft['build-options']['with-suggested-exts'] ?? false);
+ $include_suggested_libs = (bool) ($craft['build-options']['with-suggested-libs'] ?? false);
+ [, $needed_libs] = DependencyUtil::getExtsAndLibs(
+ $exts,
+ $craft['libs'],
+ $include_suggested_exts,
+ $include_suggested_libs,
+ );
+ if ($needed_libs === []) {
+ $this->output->writeln('No libs needed for the configured extensions; skipping build:libs.');
+ } else {
+ $retcode = $this->runCommand('build:libs', implode(',', $needed_libs));
+ if ($retcode !== 0) {
+ $this->output->writeln('craft build:libs failed');
+ return static::FAILURE;
+ }
+ }
+ } else {
+ $args = [$static_extensions, "--with-libs={$libs}", "--build-shared={$shared_extensions}", ...array_map(fn ($x) => "--build-{$x}", $craft['sapi'])];
+ $this->optionsToArguments($craft['build-options'], $args);
+ foreach (['pgi', 'cs-pgi', 'pgo'] as $pgoFlag) {
+ if ($this->getOption($pgoFlag)) {
+ $args[] = "--{$pgoFlag}";
+ }
+ }
+ $retcode = $this->runCommand('build', ...$args);
+ if ($retcode !== 0) {
+ $this->output->writeln('craft build failed');
+ return static::FAILURE;
}
- }
- $retcode = $this->runCommand('build', ...$args);
- if ($retcode !== 0) {
- $this->output->writeln('craft build failed');
- return static::FAILURE;
}
}