diff --git a/src/SPC/store/pkg/Zig.php b/src/SPC/store/pkg/Zig.php index b085b686..7b1f9fcd 100644 --- a/src/SPC/store/pkg/Zig.php +++ b/src/SPC/store/pkg/Zig.php @@ -130,107 +130,8 @@ class Zig extends CustomPackage private function createZigCcScript(string $bin_dir): void { - $script_content = <<<'EOF' -#!/usr/bin/env bash - -LIBDIR="$(realpath "$(dirname "$(gcc -print-file-name=libc.so)")")" -SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" -BUILDROOT_ABS="$(realpath "$SCRIPT_DIR/../../buildroot/include" 2>/dev/null || echo "")" -PARSED_ARGS=() - -while [[ $# -gt 0 ]]; do - case "$1" in - -isystem) - shift - ARG="$1" - [[ -n "$ARG" ]] && shift || break - ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")" - if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then - PARSED_ARGS+=("-I$ARG") - else - PARSED_ARGS+=("-isystem" "$ARG") - fi - ;; - -isystem*) - ARG="${1#-isystem}" - shift - ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")" - if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then - PARSED_ARGS+=("-I$ARG") - else - PARSED_ARGS+=("-isystem$ARG") - fi - ;; - *) - PARSED_ARGS+=("$1") - shift - ;; - esac -done - -SPC_TARGET_WAS_SET=1 -if [ -z "${SPC_TARGET+x}" ]; then - SPC_TARGET_WAS_SET=0 -fi - -UNAME_M="$(uname -m)" -UNAME_S="$(uname -s)" - -case "$UNAME_M" in - x86_64) ARCH="x86_64" ;; - aarch64|arm64) ARCH="aarch64" ;; - *) echo "Unsupported architecture: $UNAME_M" >&2; exit 1 ;; -esac - -case "$UNAME_S" in - Linux) OS="linux" ;; - Darwin) OS="macos" ;; - *) echo "Unsupported OS: $UNAME_S" >&2; exit 1 ;; -esac - -SPC_TARGET="${SPC_TARGET:-$ARCH-$OS}" - -if [ "$SPC_LIBC" = "glibc" ]; then - SPC_LIBC="gnu" -fi - -if [ "$SPC_TARGET_WAS_SET" -eq 0 ] && [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then - exec zig cc "${PARSED_ARGS[@]}" -elif [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then - exec zig cc -target ${SPC_TARGET} "${PARSED_ARGS[@]}" -else - TARGET="${SPC_TARGET}-${SPC_LIBC}" - [ -n "$SPC_LIBC_VERSION" ] && TARGET="${TARGET}.${SPC_LIBC_VERSION}" - - output=$(zig cc -target "$TARGET" -L"$LIBDIR" -lstdc++ "${PARSED_ARGS[@]}" 2>&1) - status=$? - - filtered_output=$(echo "$output" | grep -v "version '.*' in target triple") - - if [ $status -eq 0 ]; then - echo "$filtered_output" - exit 0 - fi - - if echo "$output" | grep -q "version '.*' in target triple"; then - TARGET_FALLBACK="${SPC_TARGET}-${SPC_LIBC}" - output=$(zig cc -target "$TARGET_FALLBACK" -L"$LIBDIR" -lstdc++ "${PARSED_ARGS[@]}" 2>&1) - status=$? - - filtered_output=$(echo "$output" | grep -v "version '.*' in target triple") - - if [ $status -eq 0 ]; then - echo "$filtered_output" - exit 0 - else - exec zig cc -target "$TARGET_FALLBACK" "${PARSED_ARGS[@]}" - fi - else - echo "$filtered_output" - exec zig cc -target "$TARGET" "${PARSED_ARGS[@]}" - fi -fi -EOF; + $script_path = __DIR__ . '/../scripts/zig-cc.sh'; + $script_content = file_get_contents($script_path); file_put_contents("{$bin_dir}/zig-cc", $script_content); chmod("{$bin_dir}/zig-cc", 0755); diff --git a/src/SPC/store/scripts/zig-cc.sh b/src/SPC/store/scripts/zig-cc.sh new file mode 100644 index 00000000..e9574a16 --- /dev/null +++ b/src/SPC/store/scripts/zig-cc.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash + +LIBDIR="$(realpath "$(dirname "$(gcc -print-file-name=libc.so)")")" +SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" +BUILDROOT_ABS="$(realpath "$SCRIPT_DIR/../../buildroot/include" 2>/dev/null || echo "")" +PARSED_ARGS=() + +while [[ $# -gt 0 ]]; do + case "$1" in + -isystem) + shift + ARG="$1" + [[ -n "$ARG" ]] && shift || break + ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")" + if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then + PARSED_ARGS+=("-I$ARG") + else + PARSED_ARGS+=("-isystem" "$ARG") + fi + ;; + -isystem*) + ARG="${1#-isystem}" + shift + ARG_ABS="$(realpath "$ARG" 2>/dev/null || echo "")" + if [[ -n "$ARG_ABS" && "$ARG_ABS" == "$BUILDROOT_ABS" ]]; then + PARSED_ARGS+=("-I$ARG") + else + PARSED_ARGS+=("-isystem$ARG") + fi + ;; + *) + PARSED_ARGS+=("$1") + shift + ;; + esac +done + +SPC_TARGET_WAS_SET=1 +if [ -z "${SPC_TARGET+x}" ]; then + SPC_TARGET_WAS_SET=0 +fi + +UNAME_M="$(uname -m)" +UNAME_S="$(uname -s)" + +case "$UNAME_M" in + x86_64) ARCH="x86_64" ;; + aarch64|arm64) ARCH="aarch64" ;; + *) echo "Unsupported architecture: $UNAME_M" >&2; exit 1 ;; +esac + +case "$UNAME_S" in + Linux) OS="linux" ;; + Darwin) OS="macos" ;; + *) echo "Unsupported OS: $UNAME_S" >&2; exit 1 ;; +esac + +SPC_TARGET="${SPC_TARGET:-$ARCH-$OS}" + +if [ "$SPC_LIBC" = "glibc" ]; then + SPC_LIBC="gnu" +fi + +if [ "$SPC_TARGET_WAS_SET" -eq 0 ] && [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then + exec zig cc "${PARSED_ARGS[@]}" +elif [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then + exec zig cc -target ${SPC_TARGET} "${PARSED_ARGS[@]}" +else + TARGET="${SPC_TARGET}-${SPC_LIBC}" + [ -n "$SPC_LIBC_VERSION" ] && TARGET="${TARGET}.${SPC_LIBC_VERSION}" + + output=$(zig cc -target "$TARGET" -L"$LIBDIR" -lstdc++ "${PARSED_ARGS[@]}" 2>&1) + status=$? + + filtered_output=$(echo "$output" | grep -v "version '.*' in target triple") + + if [ $status -eq 0 ]; then + echo "$filtered_output" + exit 0 + fi + + if echo "$output" | grep -q "version '.*' in target triple"; then + TARGET_FALLBACK="${SPC_TARGET}-${SPC_LIBC}" + output=$(zig cc -target "$TARGET_FALLBACK" -L"$LIBDIR" -lstdc++ "${PARSED_ARGS[@]}" 2>&1) + status=$? + + filtered_output=$(echo "$output" | grep -v "version '.*' in target triple") + + if [ $status -eq 0 ]; then + echo "$filtered_output" + exit 0 + else + exec zig cc -target "$TARGET_FALLBACK" "${PARSED_ARGS[@]}" + fi + else + echo "$filtered_output" + exec zig cc -target "$TARGET" "${PARSED_ARGS[@]}" + fi +fi