From ed96d3b51bfd9b760afd86cd5a720c363ea1dc8e Mon Sep 17 00:00:00 2001
From: Chance <Caznix01@gmail.com>
Date: Sun, 13 Apr 2025 20:18:41 -0400
Subject: [PATCH] feat: add cross compilation without cargo-cross

---
 .gitlab-ci.yml | 81 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 52 insertions(+), 29 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ceadd05..0326db5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,64 +1,55 @@
 stages:
+  - test
   - build
+  - publish
 
 variables:
   RUSTUP_TOOLCHAIN: stable
 
+test:
+  stage: test
+  image: rust:latest
+  script:
+    - cargo test
 
-build:
+build_linux:
   stage: build
   image: rust:latest
 
-  services:
-    - name: docker:24.0.5‑dind
-      alias: docker
-
-  variables:
-    DOCKER_HOST: tcp://docker:2375
-    DOCKER_TLS_CERTDIR: ""
-    DOCKER_DRIVER: overlay2
-
-  privileged: true
-
   parallel:
     matrix:
       - TARGET: x86_64-unknown-linux-gnu
         BINARY_NAME: zenyx-x86_64-linux
         EXT: ""
+        RUSTFLAGS: ""
       - TARGET: aarch64-unknown-linux-gnu
         BINARY_NAME: zenyx-aarch64-linux
         EXT: ""
+        RUSTFLAGS: "-Clinker=aarch64-linux-gnu-gcc"
       - TARGET: powerpc64le-unknown-linux-gnu
         BINARY_NAME: zenyx-powerpc64le-linux
         EXT: ""
+        RUSTFLAGS: "-Clinker=powerpc64le-linux-gnu-gcc"
       - TARGET: s390x-unknown-linux-gnu
         BINARY_NAME: zenyx-s390x-linux
         EXT: ""
+        RUSTFLAGS: "-Clinker=s390x-linux-gnu-gcc"
       - TARGET: riscv64gc-unknown-linux-gnu
         BINARY_NAME: zenyx-riscv64-linux
         EXT: ""
-      - TARGET: x86_64-pc-windows-gnu
-        BINARY_NAME: zenyx-x86_64-windows-gnu.exe
-        EXT: ".exe"
-      - TARGET: x86_64-pc-windows-msvc
-        BINARY_NAME: zenyx-x86_64-windows-msvc.exe
-        EXT: ".exe"
-
-  cache:
-    key: "${CI_JOB_NAME}-${TARGET}-${CI_COMMIT_SHA}"
-    policy: pull-push
-    paths:
-      - "$HOME/.cargo/registry"
-      - "$HOME/.cargo/git"
-      - target
+        RUSTFLAGS: "-Clinker=riscv64-linux-gnu-gcc"
 
   before_script:
-    - apt-get update && apt-get install -y docker.io
+    - apt-get update && apt-get install -y \
+        build-essential \
+        gcc-aarch64-linux-gnu \
+        gcc-powerpc64le-linux-gnu \
+        gcc-s390x-linux-gnu \
+        gcc-riscv64-linux-gnu
     - rustup target add "$TARGET"
-    - cargo install cross --locked
 
   script:
-    - cross build --target "$TARGET" --release
+    - cargo build --release --target "$TARGET"
     - mkdir -p artifacts
     - cp "target/$TARGET/release/zenyx$EXT" "artifacts/$BINARY_NAME"
 
@@ -66,3 +57,35 @@ build:
     paths:
       - artifacts/*
     expire_in: 1 week
+
+build_windows_msvc:
+  stage: build
+  image: rust:latest
+
+  variables:
+    TARGET: x86_64-pc-windows-msvc
+    BINARY_NAME: zenyx-x86_64-windows-msvc.exe
+    EXT: ".exe"
+
+  before_script:
+    - apt-get update && apt-get install -y lld
+    - rustup target add "$TARGET"
+    - cargo install cargo-xwin --locked
+    - cargo xwin build --release --target "$TARGET"
+
+  script:
+    - mkdir -p artifacts
+    - cp "target/$TARGET/release/zenyx$EXT" "artifacts/$BINARY_NAME"
+
+  artifacts:
+    paths:
+      - artifacts/*
+    expire_in: 1 week
+  
+publish:
+  stage: publish
+  script:
+    - echo "Publishing artifacts..."
+  dependencies:
+    - build_linux
+    - build_windows_msvc