From bfe1dc49327a418735aa65c2e7341d9fea329e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Sun, 25 Oct 2026 17:02:38 +0100 Subject: [PATCH] feat(frankenphp): allow passing extra Go build flags, ldflags and tags FrankenPHP static builds can't otherwise set Go linker variables such as EmbeddedAppPath, nor extra build tags: a second -ldflags or -tags would replace the ones generated here. Add SPC_CMD_VAR_FRANKENPHP_GO_BUILD_FLAGS, SPC_CMD_VAR_FRANKENPHP_GO_LDFLAGS and SPC_CMD_VAR_FRANKENPHP_GO_TAGS, merged into the generated flags on Unix and Windows. --- config/env.ini | 6 ++++++ src/Package/Target/php/frankenphp.php | 31 +++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/config/env.ini b/config/env.ini index 8ec9afcac..ea78e7666 100644 --- a/config/env.ini +++ b/config/env.ini @@ -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) diff --git a/src/Package/Target/php/frankenphp.php b/src/Package/Target/php/frankenphp.php index afb8c25c8..eed182c7f 100644 --- a/src/Package/Target/php/frankenphp.php +++ b/src/Package/Target/php/frankenphp.php @@ -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']; @@ -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')); @@ -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. @@ -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'); @@ -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}", + ]; + } }