Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions config/env.ini
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ SPC_SKIP_PHP_VERSION_CHECK="no"
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
; extra modules that xcaddy will include in the FrankenPHP build
SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES="--with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy --with github.com/dunglas/caddy-cbrotli"
; extra flags passed to "go build" when building FrankenPHP (e.g. -trimpath)
SPC_CMD_VAR_FRANKENPHP_GO_BUILD_FLAGS=""
; extra linker flags of the FrankenPHP build, without double quotes (e.g. -X github.com/dunglas/frankenphp.EmbeddedAppPath=/app)
SPC_CMD_VAR_FRANKENPHP_GO_LDFLAGS=""
; extra Go build tags of the FrankenPHP build, comma separated
SPC_CMD_VAR_FRANKENPHP_GO_TAGS=""
; The display message for php version output (PHP >= 8.4 available)
PHP_BUILD_PROVIDER="StaticPHP ${SPC_VERSION}"
; Whether to enable log file (if you are using vendor mode)
Expand Down
31 changes: 27 additions & 4 deletions src/Package/Target/php/frankenphp.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ public function buildFrankenphpForUnix(TargetPackage $package, PackageInstaller
$staticFlags = '';
}

[$extra_build_flags, $extra_ldflags, $extra_tags] = $this->getExtraGoFlags();

$config = new SPCConfigUtil()->configForResolvedBuild([$package->getName()], $installer);
$cflags = "{$package->getLibExtraCFlags()} {$config['cflags']} " . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . " -DFRANKENPHP_VERSION={$frankenphp_version}";
$libs = $config['libs'];
Expand All @@ -143,8 +145,9 @@ public function buildFrankenphpForUnix(TargetPackage $package, PackageInstaller
'-X \'github.com/caddyserver/caddy/v2/modules/caddyhttp.ServerHeader=FrankenPHP Caddy\' ' .
'-X \'github.com/caddyserver/caddy/v2.CustomBinaryName=frankenphp\' ' .
'-X \'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ' .
"v{$frankenphp_version} PHP {$libphp_version} Caddy'\\\" " .
"-tags={$muslTags}nobadger,nomysql,nopgx,deprecated_topic,deprecated_claim{$no_brotli}{$no_watcher}",
"v{$frankenphp_version} PHP {$libphp_version} Caddy' {$extra_ldflags}\\\" " .
"-tags={$muslTags}nobadger,nomysql,nopgx,deprecated_topic,deprecated_claim{$no_brotli}{$no_watcher}{$extra_tags} " .
$extra_build_flags,
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
];
InteractiveTerm::setMessage('Building frankenphp: ' . ConsoleColor::yellow('building with xcaddy'));
Expand Down Expand Up @@ -307,12 +310,15 @@ public function buildFrankenphpForWindows(TargetPackage $package, PackageInstall
if (!$installer->isPackageResolved('brotli')) {
$go_build_tags .= ',nobrotli';
}
[$extra_build_flags, $extra_ldflags, $extra_tags] = $this->getExtraGoFlags();
$go_build_tags .= $extra_tags;

$go_ldflags =
'-extldflags=-fuse-ld=lld ' .
"-X 'github.com/caddyserver/caddy/v2/modules/caddyhttp.ServerHeader=FrankenPHP Caddy' " .
"-X 'github.com/caddyserver/caddy/v2.CustomBinaryName=frankenphp' " .
"-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP v{$frankenphp_version} PHP {$libphp_version} Caddy'";
"-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP v{$frankenphp_version} PHP {$libphp_version} Caddy' " .
$extra_ldflags;

// CGO on Windows tokenizes CC/CXX like a shell command line, splitting on spaces.
// Paths like "C:\Program Files\..." break because only "C:\Program" is used.
Expand All @@ -336,7 +342,7 @@ public function buildFrankenphpForWindows(TargetPackage $package, PackageInstall

cmd()->cd("{$source_dir}\\caddy\\frankenphp")
->setEnv($env)
->exec("go build -v -tags \"{$go_build_tags}\" -ldflags \"{$go_ldflags}\" -o frankenphp.exe .");
->exec("go build -v -tags \"{$go_build_tags}\" -ldflags \"{$go_ldflags}\" {$extra_build_flags} -o frankenphp.exe .");

$builder->deployBinary("{$source_dir}\\caddy\\frankenphp\\frankenphp.exe", BUILD_BIN_PATH . '\frankenphp.exe');
$package->setOutput('Binary path for FrankenPHP SAPI', BUILD_BIN_PATH . '\frankenphp.exe');
Expand Down Expand Up @@ -485,4 +491,21 @@ protected function getFrankenPHPVersion(TargetPackage $package): string

throw new SPCInternalException('Could not find FrankenPHP version in caddy/go.mod');
}

/**
* Extra Go flags from env.ini or the environment. Ldflags and tags are merged into
* ours because Go keeps only the last -ldflags and -tags.
*
* @return array{string, string, string} build flags, ldflags, tags (with a leading comma)
*/
private function getExtraGoFlags(): array
{
$tags = trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_TAGS'), " \t,");

return [
trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_BUILD_FLAGS')),
trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_LDFLAGS')),
$tags === '' ? '' : ",{$tags}",
];
}
}
Loading