@@ -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}"
121174SPC_LIBC="${SPC_LIBC}"
122175SPC_LIBC_VERSION="${SPC_LIBC_VERSION}"
123176
124177if [ "$SPC_LIBC" = "glibc" ]; then
125178 SPC_LIBC="gnu"
126179fi
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[@]} "
130183elif [ -z "$SPC_LIBC" ] && [ -z "$SPC_LIBC_VERSION" ]; then
131- exec zig cc -target ${SPC_TARGET} "$@ "
184+ exec zig cc -target ${SPC_TARGET} "${PARSED_ARGS[@]} "
132185elif [ -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[@]} "
134187else
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
141194fi
142195
143196EOF;
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}
0 commit comments