Skip to content

Commit 251bc58

Browse files
authored
feat(frankenphp): allow passing extra Go build flags, ldflags and tags (#1269)
2 parents d7f1a88 + bfe1dc4 commit 251bc58

2 files changed

Lines changed: 33 additions & 4 deletions

File tree

‎config/env.ini‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ SPC_SKIP_PHP_VERSION_CHECK="no"
4747
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
4848
; extra modules that xcaddy will include in the FrankenPHP build
4949
SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES="--with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy --with github.com/dunglas/caddy-cbrotli"
50+
; extra flags passed to "go build" when building FrankenPHP (e.g. -trimpath)
51+
SPC_CMD_VAR_FRANKENPHP_GO_BUILD_FLAGS=""
52+
; extra linker flags of the FrankenPHP build, without double quotes (e.g. -X github.com/dunglas/frankenphp.EmbeddedAppPath=/app)
53+
SPC_CMD_VAR_FRANKENPHP_GO_LDFLAGS=""
54+
; extra Go build tags of the FrankenPHP build, comma separated
55+
SPC_CMD_VAR_FRANKENPHP_GO_TAGS=""
5056
; The display message for php version output (PHP >= 8.4 available)
5157
PHP_BUILD_PROVIDER="StaticPHP ${SPC_VERSION}"
5258
; Whether to enable log file (if you are using vendor mode)

‎src/Package/Target/php/frankenphp.php‎

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ public function buildFrankenphpForUnix(TargetPackage $package, PackageInstaller
122122
$staticFlags = '';
123123
}
124124

125+
[$extra_build_flags, $extra_ldflags, $extra_tags] = $this->getExtraGoFlags();
126+
125127
$config = new SPCConfigUtil()->configForResolvedBuild([$package->getName()], $installer);
126128
$cflags = "{$package->getLibExtraCFlags()} {$config['cflags']} " . getenv('SPC_CMD_VAR_PHP_MAKE_EXTRA_CFLAGS') . " -DFRANKENPHP_VERSION={$frankenphp_version}";
127129
$libs = $config['libs'];
@@ -143,8 +145,9 @@ public function buildFrankenphpForUnix(TargetPackage $package, PackageInstaller
143145
'-X \'github.com/caddyserver/caddy/v2/modules/caddyhttp.ServerHeader=FrankenPHP Caddy\' ' .
144146
'-X \'github.com/caddyserver/caddy/v2.CustomBinaryName=frankenphp\' ' .
145147
'-X \'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ' .
146-
"v{$frankenphp_version} PHP {$libphp_version} Caddy'\\\" " .
147-
"-tags={$muslTags}nobadger,nomysql,nopgx,deprecated_topic,deprecated_claim{$no_brotli}{$no_watcher}",
148+
"v{$frankenphp_version} PHP {$libphp_version} Caddy' {$extra_ldflags}\\\" " .
149+
"-tags={$muslTags}nobadger,nomysql,nopgx,deprecated_topic,deprecated_claim{$no_brotli}{$no_watcher}{$extra_tags} " .
150+
$extra_build_flags,
148151
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
149152
];
150153
InteractiveTerm::setMessage('Building frankenphp: ' . ConsoleColor::yellow('building with xcaddy'));
@@ -307,12 +310,15 @@ public function buildFrankenphpForWindows(TargetPackage $package, PackageInstall
307310
if (!$installer->isPackageResolved('brotli')) {
308311
$go_build_tags .= ',nobrotli';
309312
}
313+
[$extra_build_flags, $extra_ldflags, $extra_tags] = $this->getExtraGoFlags();
314+
$go_build_tags .= $extra_tags;
310315

311316
$go_ldflags =
312317
'-extldflags=-fuse-ld=lld ' .
313318
"-X 'github.com/caddyserver/caddy/v2/modules/caddyhttp.ServerHeader=FrankenPHP Caddy' " .
314319
"-X 'github.com/caddyserver/caddy/v2.CustomBinaryName=frankenphp' " .
315-
"-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP v{$frankenphp_version} PHP {$libphp_version} Caddy'";
320+
"-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP v{$frankenphp_version} PHP {$libphp_version} Caddy' " .
321+
$extra_ldflags;
316322

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

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

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

486492
throw new SPCInternalException('Could not find FrankenPHP version in caddy/go.mod');
487493
}
494+
495+
/**
496+
* Extra Go flags from env.ini or the environment. Ldflags and tags are merged into
497+
* ours because Go keeps only the last -ldflags and -tags.
498+
*
499+
* @return array{string, string, string} build flags, ldflags, tags (with a leading comma)
500+
*/
501+
private function getExtraGoFlags(): array
502+
{
503+
$tags = trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_TAGS'), " \t,");
504+
505+
return [
506+
trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_BUILD_FLAGS')),
507+
trim((string) getenv('SPC_CMD_VAR_FRANKENPHP_GO_LDFLAGS')),
508+
$tags === '' ? '' : ",{$tags}",
509+
];
510+
}
488511
}

0 commit comments

Comments
 (0)