Skip to content

Commit fae2878

Browse files
committed
refactor env var logic out to packages, abomination of a zig-cc script...
1 parent d30ccb8 commit fae2878

File tree

5 files changed

+125
-34
lines changed

5 files changed

+125
-34
lines changed

src/SPC/builder/unix/UnixBuilderBase.php

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use SPC\store\CurlHook;
1616
use SPC\store\Downloader;
1717
use SPC\store\FileSystem;
18+
use SPC\store\pkg\GoXcaddy;
1819
use SPC\util\DependencyUtil;
1920
use SPC\util\SPCConfigUtil;
2021

@@ -301,18 +302,6 @@ protected function patchPhpScripts(): void
301302
*/
302303
protected function buildFrankenphp(): void
303304
{
304-
$os = match (PHP_OS_FAMILY) {
305-
'Linux' => 'linux',
306-
'Windows' => 'win',
307-
'Darwin' => 'macos',
308-
'BSD' => 'freebsd',
309-
default => throw new RuntimeException('Unsupported OS: ' . PHP_OS_FAMILY),
310-
};
311-
$arch = arch2gnu(php_uname('m'));
312-
313-
// define executables for go and xcaddy
314-
$xcaddy_exec = PKG_ROOT_PATH . "/go-xcaddy-{$arch}-{$os}/bin/xcaddy";
315-
316305
$nobrotli = $this->getLib('brotli') === null ? ',nobrotli' : '';
317306
$nowatcher = $this->getLib('watcher') === null ? ',nowatcher' : '';
318307
$xcaddyModules = getenv('SPC_CMD_VAR_FRANKENPHP_XCADDY_MODULES');
@@ -344,11 +333,7 @@ protected function buildFrankenphp(): void
344333

345334
$config = (new SPCConfigUtil($this))->config($this->ext_list, $this->lib_list, with_dependencies: true);
346335

347-
$env = [
348-
'PATH' => PKG_ROOT_PATH . "/go-xcaddy-{$arch}-{$os}/bin:" . getenv('PATH'),
349-
'GOROOT' => PKG_ROOT_PATH . "/go-xcaddy-{$arch}-{$os}",
350-
'GOBIN' => PKG_ROOT_PATH . "/go-xcaddy-{$arch}-{$os}/bin",
351-
'GOPATH' => PKG_ROOT_PATH . '/go',
336+
$env = [...GoXcaddy::getEnvironment(), ...[
352337
'CGO_ENABLED' => '1',
353338
'CGO_CFLAGS' => $config['cflags'],
354339
'CGO_LDFLAGS' => "{$config['ldflags']} {$config['libs']} {$lrt}",
@@ -358,9 +343,9 @@ protected function buildFrankenphp(): void
358343
"{$frankenPhpVersion} PHP {$libphpVersion} Caddy'\\\" " .
359344
"-tags={$muslTags}nobadger,nomysql,nopgx{$nobrotli}{$nowatcher}",
360345
'LD_LIBRARY_PATH' => BUILD_LIB_PATH,
361-
];
346+
]];
362347
shell()->cd(BUILD_BIN_PATH)
363348
->setEnv($env)
364-
->exec("{$xcaddy_exec} build --output frankenphp {$xcaddyModules}");
349+
->exec("xcaddy build --output frankenphp {$xcaddyModules}");
365350
}
366351
}

src/SPC/store/pkg/CustomPackage.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ abstract public function getSupportName(): array;
1010

1111
abstract public function fetch(string $name, bool $force = false, ?array $config = null): void;
1212

13-
public function extract(string $name): void
14-
{
15-
throw new \RuntimeException("Extract method not implemented for package: {$name}");
16-
}
13+
abstract public function extract(string $name): void;
14+
15+
abstract public static function getEnvironment(): array;
1716
}

src/SPC/store/pkg/GoXcaddy.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,26 @@ public function extract(string $name): void
7373
])
7474
->exec("{$go_exec} install github.com/caddyserver/xcaddy/cmd/xcaddy@latest");
7575
}
76+
77+
public static function getEnvironment(): array
78+
{
79+
$arch = arch2gnu(php_uname('m'));
80+
$os = match (PHP_OS_FAMILY) {
81+
'Windows' => 'win',
82+
'Darwin' => 'macos',
83+
'BSD' => 'freebsd',
84+
default => 'linux',
85+
};
86+
87+
$packageName = "go-xcaddy-{$arch}-{$os}";
88+
$pkgroot = PKG_ROOT_PATH;
89+
90+
return [
91+
'PATH' => "{$pkgroot}/{$packageName}/bin",
92+
'GOROOT' => "{$pkgroot}/{$packageName}",
93+
'GOBIN' => "{$pkgroot}/{$packageName}/bin",
94+
'GOPATH' => "{$pkgroot}/go",
95+
];
96+
}
97+
7698
}

src/SPC/store/pkg/Zig.php

Lines changed: 87 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,37 +112,113 @@ public function extract(string $name): void
112112

113113
private function createZigCcScript(string $bin_dir): void
114114
{
115-
$zig_cc_path = "{$bin_dir}/zig-cc";
116115

117116
$script_content = <<<'EOF'
118117
#!/usr/bin/env bash
119118
120-
SPC_TARGET="${SPC_TARGET:-native-native}"
119+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
120+
BUILDROOT_ABS="$(realpath "$SCRIPT_DIR/../../buildroot/include" 2>/dev/null || echo "")"
121+
PARSED_ARGS=()
122+
123+
while [[ $# -gt 0 ]]; do
124+
case "$1" in
125+
-isystem)
126+
shift
127+
ARG="$1"
128+
[[ -n "$ARG" ]] && shift || break
129+
ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")"
130+
if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then
131+
PARSED_ARGS+=("-I$ARG")
132+
else
133+
PARSED_ARGS+=("-isystem" "$ARG")
134+
fi
135+
;;
136+
-isystem*)
137+
ARG="${1#-isystem}"
138+
shift
139+
ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")"
140+
if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then
141+
PARSED_ARGS+=("-I$ARG")
142+
else
143+
PARSED_ARGS+=("-isystem$ARG")
144+
fi
145+
;;
146+
*)
147+
PARSED_ARGS+=("$1")
148+
shift
149+
;;
150+
esac
151+
done
152+
153+
SPC_TARGET_WAS_SET=1
154+
if [ -z "${SPC_TARGET+x}" ]; then
155+
SPC_TARGET_WAS_SET=0
156+
fi
157+
158+
UNAME_M="$(uname -m)"
159+
UNAME_S="$(uname -s)"
160+
161+
case "$UNAME_M" in
162+
x86_64) ARCH="x86_64" ;;
163+
aarch64|arm64) ARCH="aarch64" ;;
164+
*) echo "Unsupported architecture: $UNAME_M" >&2; exit 1 ;;
165+
esac
166+
167+
case "$UNAME_S" in
168+
Linux) OS="linux" ;;
169+
Darwin) OS="macos" ;;
170+
*) echo "Unsupported OS: $UNAME_S" >&2; exit 1 ;;
171+
esac
172+
173+
SPC_TARGET="${SPC_TARGET:-$ARCH-$OS}"
121174
SPC_LIBC="${SPC_LIBC}"
122175
SPC_LIBC_VERSION="${SPC_LIBC_VERSION}"
123176
124177
if [ "$SPC_LIBC" = "glibc" ]; then
125178
SPC_LIBC="gnu"
126179
fi
127180
128-
if [ "$SPC_TARGET" = "native-native" ] && [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then
129-
exec zig cc "$@"
181+
if [ "$SPC_TARGET_WAS_SET" -eq 0 ] && [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then
182+
exec zig cc "${PARSED_ARGS[@]}"
130183
elif [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then
131-
exec zig cc -target ${SPC_TARGET} "$@"
184+
exec zig cc -target ${SPC_TARGET} "${PARSED_ARGS[@]}"
132185
elif [ -z "$SPC_LIBC_VERSION" ]; then
133-
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC} -L/usr/lib64 -lstdc++ "$@"
186+
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC} -L/usr/lib64 -lstdc++ "${PARSED_ARGS[@]}"
134187
else
135-
error_output=$(zig cc -target ${SPC_TARGET}-${SPC_LIBC}.${SPC_LIBC_VERSION} "$@" 2>&1 >/dev/null)
188+
error_output=$(zig cc -target ${SPC_TARGET}-${SPC_LIBC}.${SPC_LIBC_VERSION} "${PARSED_ARGS[@]}" 2>&1 >/dev/null)
136189
if echo "$error_output" | grep -q "zig: error: version '.*' in target triple '${SPC_TARGET}-${SPC_LIBC}\..*' is invalid"; then
137-
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC} -L/usr/lib64 -lstdc++ "$@"
190+
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC} -L/usr/lib64 -lstdc++ "${PARSED_ARGS[@]}"
138191
else
139-
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC}.${SPC_LIBC_VERSION} -L/usr/lib64 -lstdc++ "$@"
192+
exec zig cc -target ${SPC_TARGET}-${SPC_LIBC}.${SPC_LIBC_VERSION} -L/usr/lib64 -lstdc++ "${PARSED_ARGS[@]}"
140193
fi
141194
fi
142195

143196
EOF;
144197

145-
file_put_contents($zig_cc_path, $script_content);
146-
chmod($zig_cc_path, 0755);
198+
file_put_contents("{$bin_dir}/zig-cc", $script_content);
199+
chmod("{$bin_dir}/zig-cc", 0755);
200+
201+
$script_content = str_replace('zig cc', 'zig c++', $script_content);
202+
file_put_contents("{$bin_dir}/zig-c++", $script_content);
203+
chmod("{$bin_dir}/zig-c++", 0755);
204+
}
205+
206+
public static function getEnvironment(): array
207+
{
208+
$arch = arch2gnu(php_uname('m'));
209+
$os = match (PHP_OS_FAMILY) {
210+
'Linux' => 'linux',
211+
'Windows' => 'win',
212+
'Darwin' => 'macos',
213+
'BSD' => 'freebsd',
214+
default => 'linux',
215+
};
216+
217+
$packageName = "zig-{$arch}-{$os}";
218+
$path = PKG_ROOT_PATH . "/{$packageName}";
219+
220+
return [
221+
'PATH' => $path
222+
];
147223
}
148224
}

src/SPC/util/GlobalEnvManager.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use SPC\builder\linux\SystemUtil;
88
use SPC\exception\RuntimeException;
99
use SPC\exception\WrongUsageException;
10+
use SPC\store\pkg\Zig;
1011

1112
/**
1213
* Environment variable manager
@@ -100,6 +101,14 @@ public static function init(): void
100101
self::putenv("{$k}={$v}");
101102
}
102103
}
104+
if (str_contains(getenv('CC'), 'zig') || str_contains(getenv('CXX'), 'zig')) {
105+
$zigEnv = Zig::getEnvironment();
106+
foreach ($zigEnv as $key => $value) {
107+
if ($key === 'PATH') {
108+
self::addPathIfNotExists($value);
109+
}
110+
}
111+
}
103112
}
104113

105114
public static function putenv(string $val): void

0 commit comments

Comments
 (0)