Skip to content

Commit 78bb66d

Browse files
committed
zig support
Signed-off-by: CrazyMax <[email protected]>
1 parent 6474854 commit 78bb66d

File tree

4 files changed

+207
-16
lines changed

4 files changed

+207
-16
lines changed

src/test-go.bats

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,96 @@ testHelloCGO() {
511511
assert_output --partial "PKG_CONFIG=$(xx-info triple)-pkg-config"
512512
}
513513

514+
testHelloCGOZig() {
515+
if ! supportZig; then
516+
skip "Zig not supported"
517+
fi
518+
export CGO_ENABLED=1
519+
export XX_GO_PREFER_COMPILER=zig
520+
add zig
521+
run xx-go build -x -o /tmp/a.out ./fixtures/hello_cgo.go
522+
assert_success
523+
run xx-verify /tmp/a.out
524+
assert_success
525+
if ! xx-info is-cross; then
526+
run /tmp/a.out
527+
assert_success
528+
assert_output "hello cgo"
529+
fi
530+
}
531+
532+
@test "native-hellocgo-zig" {
533+
unset TARGETARCH
534+
testHelloCGOZig
535+
}
536+
537+
@test "amd64-hellocgo-zig" {
538+
export TARGETARCH=amd64
539+
testHelloCGOZig
540+
}
541+
542+
@test "arm64-hellocgo-zig" {
543+
export TARGETARCH=arm64
544+
testHelloCGOZig
545+
}
546+
547+
@test "arm-hellocgo-zig" {
548+
export TARGETARCH=arm
549+
testHelloCGOZig
550+
}
551+
552+
@test "ppc64le-hellocgo-zig" {
553+
export TARGETARCH=ppc64le
554+
testHelloCGOZig
555+
}
556+
557+
@test "riscv64-hellocgo-zig" {
558+
if ! supportRiscVCGo; then
559+
skip "RISC-V CGO not supported"
560+
fi
561+
export TARGETARCH=riscv64
562+
testHelloCGOZig
563+
}
564+
565+
@test "loong64-hellocgo-zig" {
566+
if ! supportLoong64CGo; then
567+
skip "LOONGARCH64 not supported"
568+
fi
569+
if [ -f /etc/alpine-release ]; then
570+
# FIXME: loong64-hellocgo issue on alpine < 3.21
571+
# ld.lld: error: unknown emulation: elf64loongarch
572+
# ld.lld: error: /loongarch64-alpine-linux-musl/usr/lib/gcc/loongarch64-alpine-linux-musl/14.2.0/crtbeginS.o:(.text+0x0): unknown relocation (102) against symbol
573+
# error: unknown target triple 'loongarch64-alpine-linux-musl', please use -triple or -arch
574+
alpineRelease=$(cat /etc/alpine-release)
575+
if ! grep PRETTY_NAME /etc/os-release | cut -d '=' -f 2 | tr -d '"' | grep -q "edge$" || [ "$(semver compare "$alpineRelease" "3.21.0")" -lt 0 ]; then
576+
skip
577+
fi
578+
fi
579+
export TARGETARCH=loong64
580+
testHelloCGOZig
581+
}
582+
583+
@test "386-hellocgo-zig" {
584+
export TARGETARCH=386
585+
testHelloCGOZig
586+
}
587+
588+
@test "arm64-cgoenv-zig" {
589+
if ! supportZig; then
590+
skip "Zig not supported"
591+
fi
592+
export TARGETARCH=arm64
593+
export XX_GO_PREFER_COMPILER=zig
594+
export CGO_ENABLED=1
595+
596+
add zig
597+
# single/double quotes changed in between go versions
598+
run sh -c "xx-go env | sed 's/[\"'\'']//g'"
599+
assert_success
600+
assert_output --partial "CC=zig cc -target $(xx-info zig-triple)"
601+
assert_output --partial "CXX=zig c++ -target $(xx-info zig-triple)"
602+
}
603+
514604
@test "wrap-unwrap" {
515605
target="arm64"
516606
if [ "$(xx-info arch)" = "arm64" ]; then target="amd64"; fi
@@ -535,3 +625,10 @@ testHelloCGO() {
535625
assert_success
536626
assert_output "$nativeArch"
537627
}
628+
629+
@test "clean-packages" {
630+
if ! supportZig; then
631+
skip "Zig not supported"
632+
fi
633+
del zig
634+
}

src/test_helper.bash

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,7 @@ supportLoong64CGo() {
142142
supportRC() {
143143
command -v llvm-rc >/dev/null 2>&1
144144
}
145+
146+
supportZig() {
147+
[ -f /etc/alpine-release ] && versionGTE "$(xx-info os-version | cut -d'.' -f1-2)" "3.20"
148+
}

src/xx-go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ for l in $(xx-info env); do
66
export "${l?}"
77
done
88

9+
# XX_GO_PREFER_COMPILER defines the compiler to use if supported
10+
: "${XX_GO_PREFER_COMPILER=clang}"
11+
912
export GOOS="${TARGETOS}"
1013
export GOARCH="${TARGETARCH}"
1114

@@ -76,26 +79,33 @@ if command -v "$XX_TRIPLE-g++" >/dev/null 2>/dev/null; then
7679
cxx_set=1
7780
fi
7881

79-
if command -v clang >/dev/null 2>/dev/null; then
80-
triple=$(xx-clang --print-target-triple || true)
81-
if [ -n "$triple" ]; then
82-
export CC="$triple-clang"
83-
export CXX="$triple-clang++"
82+
if [ "$XX_GO_PREFER_COMPILER" = "clang" ]; then
83+
if command -v clang >/dev/null 2>/dev/null; then
84+
triple=$(xx-clang --print-target-triple || true)
85+
if [ -n "$triple" ]; then
86+
export CC="$triple-clang"
87+
export CXX="$triple-clang++"
88+
c_set=1
89+
cxx_set=1
90+
fi
91+
fi
92+
if command -v "$XX_TRIPLE-ar" >/dev/null 2>/dev/null; then
93+
export AR="$XX_TRIPLE-ar"
94+
ar_set=1
95+
fi
96+
if command -v "$XX_TRIPLE-pkg-config" >/dev/null 2>/dev/null; then
97+
export PKG_CONFIG="$XX_TRIPLE-pkg-config"
98+
pkgconfig_set=1
99+
fi
100+
elif [ "$XX_GO_PREFER_COMPILER" = "zig" ]; then
101+
if command -v "zig" >/dev/null 2>/dev/null; then
102+
export CC="zig cc -target $XX_ZIG_TRIPLE"
84103
c_set=1
104+
export CXX="zig c++ -target $XX_ZIG_TRIPLE"
85105
cxx_set=1
86106
fi
87107
fi
88108

89-
if command -v "$XX_TRIPLE-ar" >/dev/null 2>/dev/null; then
90-
export AR="$XX_TRIPLE-ar"
91-
ar_set=1
92-
fi
93-
94-
if command -v "$XX_TRIPLE-pkg-config" >/dev/null 2>/dev/null; then
95-
export PKG_CONFIG="$XX_TRIPLE-pkg-config"
96-
pkgconfig_set=1
97-
fi
98-
99109
if [ -z "$GOBIN" ] && [ -n "$GOPATH" ] && [ -n "$GOARCH" ] && [ -n "$GOOS" ]; then
100110
export PATH="${GOPATH}/bin/${GOOS}_${GOARCH}:${PATH}"
101111
fi

src/xx-info

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
: "${XX_RHEL_ARCH=unknown}"
1616
: "${XX_OS_VERSION=}"
1717
: "${XX_TRIPLE=unknown-unknown-none}"
18+
: "${XX_ZIG_TRIPLE=unknown-unknown-none}"
1819
: "${XX_VENDOR=}"
1920
: "${XX_LIBC=}"
2021

@@ -233,10 +234,17 @@ case "$TARGETARCH" in
233234
XX_ALPINE_ARCH="x86_64"
234235
XX_RHEL_ARCH="x86_64"
235236
XX_TRIPLE="x86_64${vendor}-linux-${XX_LIBC}"
237+
if [ "$XX_LIBC" = "musl" ]; then
238+
XX_ZIG_TRIPLE="x86_64-linux-musl"
239+
else
240+
XX_ZIG_TRIPLE="x86_64-linux-gnu"
241+
fi
236242
if [ "$TARGETOS" = "darwin" ]; then
237243
XX_TRIPLE="x86_64${vendor}-macos${MACOSX_VERSION_MIN}"
244+
XX_ZIG_TRIPLE="x86_64-macos-none"
238245
elif [ "$TARGETOS" = "windows" ]; then
239246
XX_TRIPLE="x86_64-w64-mingw32"
247+
XX_ZIG_TRIPLE="x86_64-windows-gnu"
240248
fi
241249
;;
242250
"arm64")
@@ -245,11 +253,18 @@ case "$TARGETARCH" in
245253
XX_ALPINE_ARCH="aarch64"
246254
XX_RHEL_ARCH="aarch64"
247255
XX_TRIPLE="aarch64${vendor}-linux-${XX_LIBC}"
256+
if [ "$XX_LIBC" = "musl" ]; then
257+
XX_ZIG_TRIPLE="aarch64-linux-musl"
258+
else
259+
XX_ZIG_TRIPLE="aarch64-linux-gnu"
260+
fi
248261
if [ "$TARGETOS" = "darwin" ]; then
249262
XX_MARCH="arm64"
250263
XX_TRIPLE="arm64${vendor}-macos${MACOSX_VERSION_MIN}"
264+
XX_ZIG_TRIPLE="aarch64-macos-none"
251265
elif [ "$TARGETOS" = "windows" ]; then
252266
XX_TRIPLE="aarch64-w64-mingw32"
267+
XX_ZIG_TRIPLE="aarch64-windows-gnu"
253268
fi
254269
;;
255270
"arm")
@@ -264,6 +279,11 @@ case "$TARGETARCH" in
264279
triplearch="armv7"
265280
fi
266281
XX_TRIPLE="${triplearch}${vendor}-linux-${XX_LIBC}eabihf"
282+
if [ "$XX_LIBC" = "musl" ]; then
283+
XX_ZIG_TRIPLE="arm-linux-musleabihf"
284+
else
285+
XX_ZIG_TRIPLE="arm-linux-gnueabihf"
286+
fi
267287
if [ "$TARGETVARIANT" = "v6" ]; then
268288
XX_MARCH="armv6l"
269289
XX_DEBIAN_ARCH="armel"
@@ -273,6 +293,11 @@ case "$TARGETARCH" in
273293
if [ "$XX_VENDOR" = "alpine" ]; then
274294
XX_TRIPLE="armv6${vendor}-linux-${XX_LIBC}eabihf"
275295
fi
296+
if [ "$XX_LIBC" = "musl" ]; then
297+
XX_ZIG_TRIPLE="arm-linux-musleabi"
298+
else
299+
XX_ZIG_TRIPLE="arm-linux-gnueabi"
300+
fi
276301
fi
277302
if [ "$TARGETVARIANT" = "v5" ]; then
278303
XX_MARCH="armv5l"
@@ -283,10 +308,15 @@ case "$TARGETARCH" in
283308
if [ "$XX_VENDOR" = "alpine" ]; then
284309
XX_TRIPLE="armv5${vendor}-linux-${XX_LIBC}eabi"
285310
fi
311+
if [ "$XX_LIBC" = "musl" ]; then
312+
XX_ZIG_TRIPLE="arm-linux-musleabi"
313+
else
314+
XX_ZIG_TRIPLE="arm-linux-gnueabi"
315+
fi
286316
fi
287-
288317
if [ "$TARGETOS" = "windows" ]; then
289318
XX_TRIPLE="armv7-w64-mingw32"
319+
XX_ZIG_TRIPLE="arm-windows-gnu"
290320
fi
291321
;;
292322
"riscv64")
@@ -299,27 +329,47 @@ case "$TARGETARCH" in
299329
triplearch="${RISCV64_TARGET_ARCH}"
300330
fi
301331
XX_TRIPLE="${triplearch}${vendor}-linux-${XX_LIBC}"
332+
if [ "$XX_LIBC" = "musl" ]; then
333+
XX_ZIG_TRIPLE="riscv64-linux-musl"
334+
else
335+
XX_ZIG_TRIPLE="riscv64-linux-gnu"
336+
fi
302337
;;
303338
"ppc64le")
304339
XX_MARCH="ppc64le"
305340
XX_DEBIAN_ARCH="ppc64el"
306341
XX_ALPINE_ARCH="ppc64le"
307342
XX_RHEL_ARCH="ppc64le"
308343
XX_TRIPLE="powerpc64le${vendor}-linux-${XX_LIBC}"
344+
if [ "$XX_LIBC" = "musl" ]; then
345+
XX_ZIG_TRIPLE="powerpc64le-linux-musl"
346+
else
347+
XX_ZIG_TRIPLE="powerpc64le-linux-gnu"
348+
fi
309349
;;
310350
"s390x")
311351
XX_MARCH="s390x"
312352
XX_DEBIAN_ARCH="s390x"
313353
XX_ALPINE_ARCH="s390x"
314354
XX_RHEL_ARCH="s390x"
315355
XX_TRIPLE="s390x${vendor}-linux-${XX_LIBC}"
356+
if [ "$XX_LIBC" = "musl" ]; then
357+
XX_ZIG_TRIPLE="s390x-linux-musl"
358+
else
359+
XX_ZIG_TRIPLE="s390x-linux-gnu"
360+
fi
316361
;;
317362
"loong64")
318363
XX_MARCH="loong64"
319364
XX_DEBIAN_ARCH="loong64"
320365
XX_ALPINE_ARCH="loongarch64"
321366
XX_RHEL_ARCH="loong64"
322367
XX_TRIPLE="loongarch64${vendor}-linux-${XX_LIBC}"
368+
if [ "$XX_LIBC" = "musl" ]; then
369+
XX_ZIG_TRIPLE="loongarch64-linux-musl"
370+
else
371+
XX_ZIG_TRIPLE="loongarch64-linux-gnu"
372+
fi
323373
;;
324374
"386")
325375
XX_MARCH="i386"
@@ -330,8 +380,14 @@ case "$TARGETARCH" in
330380
if [ "$XX_VENDOR" = "alpine" ]; then
331381
XX_TRIPLE="i586${vendor}-linux-${XX_LIBC}"
332382
fi
383+
if [ "$XX_LIBC" = "musl" ]; then
384+
XX_ZIG_TRIPLE="x86-linux-musl"
385+
else
386+
XX_ZIG_TRIPLE="x86-linux-gnu"
387+
fi
333388
if [ "$TARGETOS" = "windows" ]; then
334389
XX_TRIPLE="i686-w64-mingw32"
390+
XX_ZIG_TRIPLE="x86-windows-gnu"
335391
fi
336392
;;
337393
"mips")
@@ -340,27 +396,47 @@ case "$TARGETARCH" in
340396
XX_ALPINE_ARCH="mips"
341397
XX_RHEL_ARCH="mips"
342398
XX_TRIPLE="mips${vendor}-linux-${XX_LIBC}"
399+
if [ "$XX_LIBC" = "musl" ]; then
400+
XX_ZIG_TRIPLE="mips-linux-musl"
401+
else
402+
XX_ZIG_TRIPLE="mips-linux-gnueabi"
403+
fi
343404
;;
344405
"mipsle")
345406
XX_MARCH="mipsle"
346407
XX_DEBIAN_ARCH="mipsel"
347408
XX_ALPINE_ARCH="mipsle"
348409
XX_RHEL_ARCH="mipsel"
349410
XX_TRIPLE="mipsel${vendor}-linux-${XX_LIBC}"
411+
if [ "$XX_LIBC" = "musl" ]; then
412+
XX_ZIG_TRIPLE="mipsel-linux-musl"
413+
else
414+
XX_ZIG_TRIPLE="mipsel-linux-gnueabi"
415+
fi
350416
;;
351417
"mips64")
352418
XX_MARCH="mips64"
353419
XX_DEBIAN_ARCH="mips64"
354420
XX_ALPINE_ARCH="mips64"
355421
XX_RHEL_ARCH="mips64"
356422
XX_TRIPLE="mips64${vendor}-linux-${XX_LIBC}abi64"
423+
if [ "$XX_LIBC" = "musl" ]; then
424+
XX_ZIG_TRIPLE="mips64-linux-musl"
425+
else
426+
XX_ZIG_TRIPLE="mips64-linux-gnuabi64"
427+
fi
357428
;;
358429
"mips64le")
359430
XX_MARCH="mips64le"
360431
XX_DEBIAN_ARCH="mips64el"
361432
XX_ALPINE_ARCH="mips64le"
362433
XX_RHEL_ARCH="mips64el"
363434
XX_TRIPLE="mips64el${vendor}-linux-${XX_LIBC}abi64"
435+
if [ "$XX_LIBC" = "musl" ]; then
436+
XX_ZIG_TRIPLE="mips64el-linux-musl"
437+
else
438+
XX_ZIG_TRIPLE="mips64el-linux-gnuabi64"
439+
fi
364440
;;
365441
esac
366442

@@ -416,6 +492,9 @@ case "$1" in
416492
"triple")
417493
echo "$XX_TRIPLE"
418494
;;
495+
"zig-triple")
496+
echo "$XX_ZIG_TRIPLE"
497+
;;
419498
"vendor")
420499
echo "$XX_VENDOR"
421500
;;
@@ -432,6 +511,7 @@ case "$1" in
432511
echo "XX_PKG_ARCH=${XX_PKG_ARCH}"
433512
fi
434513
echo "XX_TRIPLE=${XX_TRIPLE}"
514+
echo "XX_ZIG_TRIPLE=${XX_ZIG_TRIPLE}"
435515
echo "XX_LIBC=${XX_LIBC}"
436516
echo "TARGETOS=${TARGETOS}"
437517
echo "TARGETARCH=${TARGETARCH}"

0 commit comments

Comments
 (0)