hako pushed a commit to branch wip-zig-bootstrap
in repository guix.

commit a31e3ba87e2c18b6a910fa0ed8fe00528359dd25
Author: Hilton Chain <[email protected]>
AuthorDate: Sun Nov 17 02:42:35 2024 +0800

    build/zig: Support cross compilation.
    
    * guix/build/zig-build-system.scm (set-guix-zig-libc-dir)
    (write-zig-libc-paths-file): New procedures.
    (build): Add "--libc" argument.
    (set-cc): Delete procedure.
    (%standard-phases): Adjust accordingly.
    
    Change-Id: I08d15add2b249f7016f9cbb07f151ecf469fe656
---
 guix/build-system/zig.scm       |  8 ++++++++
 guix/build/zig-build-system.scm | 32 +++++++++++++++++++++-----------
 2 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/guix/build-system/zig.scm b/guix/build-system/zig.scm
index ad8a96b607..f42d1fd886 100644
--- a/guix/build-system/zig.scm
+++ b/guix/build-system/zig.scm
@@ -23,6 +23,7 @@
   #:use-module (guix gexp)
   #:use-module (guix monads)
   #:use-module (guix packages)
+  #:use-module (guix platform)
   #:use-module (guix build-system)
   #:use-module (guix build-system gnu)
   #:use-module (ice-9 match)
@@ -36,6 +37,10 @@
   (let ((zig (resolve-interface '(gnu packages zig))))
     (module-ref zig 'zig)))
 
+(define glibc-dynamic-linker
+  (let ((bootstrap (resolve-interface '(gnu packages bootstrap))))
+    (module-ref bootstrap 'glibc-dynamic-linker)))
+
 (define %zig-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build zig-build-system)
@@ -69,6 +74,7 @@
                      #:zig-build-flags #$zig-build-flags
                      #:zig-test-flags #$zig-test-flags
                      #:zig-release-type #$zig-release-type
+                     #:zig-libc-linker #$(glibc-dynamic-linker system)
                      #:tests? #$tests?
                      #:phases #$phases
                      #:outputs #$(outputs->gexp outputs)
@@ -139,6 +145,8 @@
                      #:zig-build-flags #$zig-build-flags
                      #:zig-test-flags #$zig-test-flags
                      #:zig-release-type #$zig-release-type
+                     #:zig-glibc-linker
+                     #$(glibc-dynamic-linker (platform-target->system target))
                      #:zig-destdir #$zig-destdir
                      #:zig-test-destdir #$zig-test-destdir
                      #:tests? #$tests?
diff --git a/guix/build/zig-build-system.scm b/guix/build/zig-build-system.scm
index 8352a73324..5deb5d57f5 100644
--- a/guix/build/zig-build-system.scm
+++ b/guix/build/zig-build-system.scm
@@ -34,14 +34,25 @@
 ;; https://github.com/riverwm/river/blob/master/PACKAGING.md
 (define global-cache-dir "zig-cache")
 
-(define* (set-cc #:rest args)
-  ;; TODO: Zig needs the gcc-toolchain in order to find the libc.
-  ;;       we need to think about how to solve this in the build system
-  ;;       directly: --libc
-  (setenv "CC" "gcc"))
-
-(define* (set-zig-global-cache-dir #:rest args)
-  (setenv "ZIG_GLOBAL_CACHE_DIR" global-cache-dir))
+(define* (configure #:key inputs native-inputs target zig-glibc-linker
+                    #:allow-other-keys)
+  (let ((libc
+         (assoc-ref inputs (if target "cross-libc" "libc")))
+        (dynamic-linker
+         (search-input-file inputs zig-glibc-linker))
+        (port (open-file "/tmp/guix-zig-libc-paths" "w" #:encoding "utf8")))
+    (setenv "ZIG_GLOBAL_CACHE_DIR" global-cache-dir)
+    (setenv "GUIX_ZIG_GLIBC_LINKER" dynamic-linker)
+    (display
+     (string-append "\
+include_dir=" libc "/include
+sys_include_dir=" libc "/include
+crt_dir=" libc "/lib
+msvc_lib_dir=
+kernel32_lib_dir=
+gcc_dir=")
+     port)
+    (close-port port)))
 
 (define* (build #:key
                 zig-build-flags
@@ -63,6 +74,7 @@
                      ,@(if zig-release-type
                          (list (string-append "-Drelease-" zig-release-type))
                          '())
+                     "--libc" "/tmp/guix-zig-libc-paths"
                      ,@zig-build-flags)))
   (format #t "running: ~s~%" call)
   (apply invoke call)))
@@ -91,9 +103,7 @@
 (define %standard-phases
   (modify-phases gnu:%standard-phases
     (delete 'bootstrap)
-    (delete 'configure)
-    (add-before 'build 'set-zig-global-cache-dir set-zig-global-cache-dir)
-    (add-before 'build 'set-cc set-cc)
+    (replace 'configure configure)
     (replace 'build build)
     (replace 'check check)
     (replace 'install install)))

Reply via email to