;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021 Liliana Marie Prikler <liliana.prikler@gmail.com>
;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
;;; Copyright © 2021 Calum Irwin <calumirwin1@gmail.com>
;;; Copyright © 2022-2024 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023, 2024 Hilton Chain <hako@ultrarare.space>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages zig)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:use-module (guix platform)
  #:use-module (guix search-paths)
  #:use-module (guix utils)
  #:use-module (guix download)
  #:use-module (guix git-download)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix build-system cmake)
  #:use-module (gnu packages)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages llvm)
  #:use-module (gnu packages llvm-meta)
  #:use-module (gnu packages web)
  #:export (add-build.zig.zon
            rename-zig-dependencies))

(define* (add-build.zig.zon name version dependencies #:optional (paths '("")))
  "Snippet to generate build.zig.zon of DEPENDENCIES for package NAME@VERSION."
  `(let ((port (open-file "build.zig.zon" "w" #:encoding "utf8")))
     (format port "\
.{
    .name = \"~a\",
    .version = \"~a\",
    .paths = .{
~{\
        \"~a\",
~}\
    },
    .dependencies = .{
~{\
        .@\"~a\" = .{
            .url = \"\",
        },
~}\
    },
}~%" ,name ,version (quote ,paths) (quote ,dependencies))
     (close-port port)))

(define* (rename-zig-dependencies mapping #:optional (directories '(".")))
  "Snippet to rename Zig dependencies in build.zig and build.zig.zon."
  `(begin
     (use-modules (ice-9 match)
                  (guix build utils))
     (for-each
      (lambda (directory)
        (for-each
         (match-lambda
           ((old-name . new-name)
            (with-directory-excursion directory
              (substitute* "build.zig"
                (((string-append "([Dd]ependency.\")" old-name) _ prefix)
                 (string-append prefix new-name)))
              (substitute* "build.zig.zon"
                (((format #f "\\.(@\")?~a\"?" old-name))
                 (format #f ".@\"~a\"" new-name))))))
         (quote ,mapping)))
      (quote ,directories))))

(define (zig-source version commit hash)
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/zig")
          (commit commit)))
    (file-name (git-file-name "zig" version))
    (sha256 (base32 hash))
    (modules '((guix build utils)))
    (snippet
     #~(for-each
        (lambda (file)
          (when (file-exists? file)
            (delete-file file)))
        (append
         '("stage1/zig1.wasm"
           "stage1/zig1.wasm.zst")
         ;; Generated from glibc sources, see also:
         ;; https://github.com/ziglang/zig/blob/master/lib/libc/glibc/README.md
         ;; https://github.com/ziglang/glibc-abi-tool
         '("lib/libc/glibc/abilists")
         ;; IETF RFC documents have nonfree license.
         (find-files "." "^rfc[0-9]+\\.txt"))))))

(define zig-0.9-glibc-abi-tool
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/glibc-abi-tool")
          (commit "6f992064f821c612f68806422b2780c9260cbc4c")))
    (file-name "glibc-abi-tool")
    (sha256
     (base32 "0lsi3f2lkixcdidljby73by2sypywb813yqdapy9md4bi2h8hhgp"))))

(define-public zig-0.9
  (package
    (name "zig")
    (version "0.9.1")
    (source
     (origin
       (inherit (zig-source
                 version version
                 "0nfvgg23sw50ksy0z0ml6lkdsvmd0278mq29m23dbb2jsirkhry7"))
       (patches
        (search-patches
         "zig-0.9-build-respect-PKG_CONFIG-env-var.patch"
         "zig-0.9-riscv-support.patch"
         "zig-0.9-use-baseline-cpu-by-default.patch"
         "zig-0.9-use-system-paths.patch"
         "zig-0.9-fix-runpath.patch"))))
    (build-system cmake-build-system)
    (arguments
     (list
      #:imported-modules
      (cons '(guix build zig-utils)
            %cmake-build-system-modules)
      #:modules
      (cons '(guix build zig-utils)
            '((guix build cmake-build-system)
              (guix build utils)))
      #:configure-flags
      #~(list (string-append "-DZIG_LIB_DIR=" #$output "/lib/zig")
              "-DZIG_TARGET_MCPU=baseline"
              (string-append
               "-DZIG_TARGET_TRIPLE="
               (zig-target
                #$(platform-target
                   (lookup-platform-by-target-or-system
                    (or (%current-target-system)
                        (%current-system))))))
              "-DZIG_USE_LLVM_CONFIG=ON")
      #:out-of-source? #f         ; for tests
      ;; There are too many unclear test failures.
      #:tests? (not (or (target-riscv64?)
                        (%current-target-system)))
      #:phases
      #~(modify-phases %standard-phases
          #$@(if (target-riscv64?)
                 ;; It is unclear why all these tests fail to build.
                 `((add-after 'unpack 'adjust-tests
                     (lambda _
                       (substitute* "build.zig"
                         ((".*addRuntimeSafetyTests.*") "")
                         ((".*addRunTranslatedCTests.*") ""))
                       (substitute* "test/standalone.zig"
                         ;; These tests fail to build on riscv64-linux.
                         ;; They both contain 'exe.linkSystemLibrary("c");'
                         ((".*shared_library.*") "")
                         ((".*mix_o_files.*") "")
                         ;; ld.lld: error: undefined symbol: __tls_get_addr
                         ;; Is this symbol x86 only in glibc?
                         ((".*link_static_lib_as_system_lib.*") "")))))
                 '())
          (add-before 'configure 'zig-configure zig-configure)
          (delete 'check)
          (add-after 'install 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                ;; error(libc_installation): msvc_lib_dir may not be empty for
                ;; windows-msvc.
                (unsetenv "ZIG_LIBC")
                (invoke (string-append #$output "/bin/zig")
                        ;; Testing the standard library takes >7.5GB RAM, and
                        ;; will fail if it is OOM-killed.  The 'test-toolchain'
                        ;; target skips standard library and doc tests.
                        "build" "test-toolchain"
                        ;; Stage 2 is experimental, not what we run with `zig',

                        "-Dskip-stage2-tests"
                        ;; Non-native tests try to link and execute non-native
                        ;; binaries.
                        "-Dskip-non-native"))))
          (add-before 'check 'install-glibc-abilists
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (mkdir-p "/tmp/glibc-abi-tool")
              (with-directory-excursion "/tmp/glibc-abi-tool"
                (copy-recursively
                 (dirname (search-input-file
                           (or native-inputs inputs) "consolidate.zig"))
                 ".")
                (for-each make-file-writable (find-files "."))
                (invoke (string-append #$output "/bin/zig")
                        "run" "consolidate.zig")
                (install-file
                 "abilists"
                 (string-append #$output "/lib/zig/libc/glibc"))))))))
    (inputs
     (list clang-13                     ;Clang propagates llvm.
           lld-13))
    ;; Zig compiles fine with GCC, but also needs native LLVM libraries.
    (native-inputs
     (list llvm-13
           zig-0.9-glibc-abi-tool))
    (native-search-paths
     (list $C_INCLUDE_PATH
           $CPLUS_INCLUDE_PATH
           $LIBRARY_PATH
           (search-path-specification
            (variable "GUIX_ZIG_PACKAGE_PATH")
            (files '("src/zig")))))
    (synopsis "General purpose programming language and toolchain")
    (description "Zig is a general-purpose programming language and
toolchain.  Among other features it provides
@itemize
@item an Optional type instead of null pointers,
@item manual memory management,
@item generic data structures and functions,
@item compile-time reflection and compile-time code execution,
@item integration with C using zig as a C compiler, and
@item concurrency via async functions.
@end itemize")
    (home-page "https://github.com/ziglang/zig")
    ;; Currently building zig can take up to 10GB of RAM for linking stage1:
    ;; https://github.com/ziglang/zig/issues/6485
    (supported-systems %64bit-supported-systems)
    ;; Stage3 can take a lot of time and isn't verbose.
    (properties `((max-silent-time . 9600)
                  ,@(clang-compiler-cpu-architectures "13")))
    (license license:expat)))

(define zig-0.10-glibc-abi-tool
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/glibc-abi-tool")
          (commit "b07bf67ab3c15881f13b9c3c03bcec04535760bb")))
    (file-name "glibc-abi-tool")
    (sha256
     (base32 "0csn3c9pj8wchwy5sk5lfnhjn8a3c8cp45fv7mkpi5bqxzdzf1na"))
    (modules '((guix build utils)))
    (snippet
     #~(substitute* "consolidate.zig"
         (("(@ctz.)u.., " _ prefix) prefix)
         (("(@popCount.)u.., " _ prefix) prefix)))))

(define-public zig-0.10
  (package
    (inherit zig-0.9)
    (name "zig")
    (version "0.10.1")
    (source
     (origin
       (inherit (zig-source
                 version version
                 "1sh5xjsksl52i4cfv1qj36sz5h0ln7cq4pdhgs3960mk8a90im7b"))
       (patches
        (search-patches
         "zig-0.10-build-respect-PKG_CONFIG-env-var.patch"
         "zig-0.9-use-baseline-cpu-by-default.patch"
         "zig-0.10-use-system-paths.patch"
         "zig-0.10-fix-runpath.patch"))))
    (arguments
     (substitute-keyword-arguments (package-arguments zig-0.9)
       ((#:tests? _ #t)
        (not (%current-target-system)))
       ((#:configure-flags flags ''())
        #~(cons "-DZIG_SHARED_LLVM=ON"
                #$flags))
       ((#:phases phases '%standard-phases)
        #~(modify-phases #$phases
            #$@(if (target-riscv64?)
                   `((delete 'adjust-tests))
                   '())
            (add-after 'patch-source-shebangs 'patch-more-shebangs
              (lambda* (#:key inputs #:allow-other-keys)
                ;; Zig uses information about an ELF file to determine the
                ;; version of glibc and other data for native builds.
                (substitute* "lib/std/zig/system/NativeTargetInfo.zig"
                  (("/usr/bin/env") (search-input-file inputs "bin/clang++")))))
            (replace 'check
              (lambda* (#:key tests? #:allow-other-keys)
                (when tests?
                  ;; error(libc_installation): msvc_lib_dir may not be empty for
                  ;; windows-msvc.
                  (unsetenv "ZIG_LIBC")
                  (invoke (string-append #$output "/bin/zig")
                          "build" "test"
                          ;; We're not testing the compiler bootstrap chain.
                          "-Dskip-stage1"
                          "-Dskip-stage2-tests"
                          ;; Non-native tests try to link and execute non-native
                          ;; binaries.
                          "-Dskip-non-native"))))))))
    (inputs
     (modify-inputs (package-inputs zig-0.9)
       (prepend zlib `(,zstd "lib"))
       (replace "clang" clang-15)
       (replace "lld" lld-15)))
    (native-inputs
     (modify-inputs (package-native-inputs zig-0.9)
       (replace "glibc-abi-tool" zig-0.10-glibc-abi-tool)
       (replace "llvm" llvm-15)))
    (properties `((max-silent-time . 9600)
                  ,@(clang-compiler-cpu-architectures "15")))))


;;;
;;; Bootstrap path for Zig 0.11.
;;; See also: <https://git.jakstys.lt/motiejus/zig-repro>.
;;;

;; Restore C++ stage 1 and build the initial zig1.wasm.
(define zig-0.10.0-538-source
  (let ((commit "bf316e550671cc71eb498b3cf799493627bb0fdc")
        (revision "538"))
    (zig-source
     (git-version "0.10.0" revision commit)
     commit "1dchc2bp842jlw0byssqzindv8cigpqcj2hk3752667jrrww13vv")))

(define zig-0.10.0-539-patch
  (let ((commit "28514476ef8c824c3d189d98f23d0f8d23e496ea"))
    (origin
      (method url-fetch)
      (uri (string-append
            "https://github.com/ziglang/zig/commit/" commit ".patch"))
      (file-name "zig-0.10.0-539.patch")
      (sha256
       (base32 "0qxxiafg2sd5rr4xhw0c12rygd7zh1rmf3x8hfialyxmsbi5pfxp")))))

(define zig-0.10.0-542-patch
  (let ((commit "3ba916584db5485c38ebf2390e8d22bc6d81bf8e"))
    (origin
      (method url-fetch)
      (uri (string-append
            "https://github.com/ziglang/zig/commit/" commit ".patch"))
      (file-name "zig-0.10.0-542.patch")
      (sha256
       (base32 "1l09gmbr3vqzinb63kvaskgs1d0mvm1m7w3ai3ngwg5zlabyya35")))))

(define zig-0.10.0-610
  (let ((commit "e7d28344fa3ee81d6ad7ca5ce1f83d50d8502118")
        (revision "610")
        (base zig-0.10))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "08pm3f4hh6djl3szhqgm7fa3qisdl2xh9jrp18m0z7bk2vd0bzw7"))
      (arguments
       (substitute-keyword-arguments (package-arguments base)
         ;; Patch for fixing RUNPATH not applied to intermediate versions.
         ((#:validate-runpath? _ #t) #f)
         ;; Patch for cross-compilation not applied to intermediate versions.
         ((#:modules modules '())
          (cons '(srfi srfi-1) modules))
         ((#:configure-flags flags ''())
          #~(filter (lambda (flag)
                      (not (string-contains flag "ZIG_TARGET_TRIPLE")))
                    #$flags))
         ;; Disable tests for intermediate versions.
         ((#:tests? _ #t) #f)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'unpack 'backup-source
                (lambda _
                  (copy-recursively "." "../source-backup")))
              (add-after 'backup-source 'prepare-source
                (lambda* (#:key native-inputs inputs #:allow-other-keys)
                  ;; Revert "actually remove stage1".
                  (invoke "patch" "--reverse" "--strip=1"
                          "--input" #+zig-0.10.0-542-patch)
                  ;; Revert "remove `-fstage1` option".
                  (false-if-exception
                   (invoke "patch" "--reverse" "--strip=1"
                           "--input" #+zig-0.10.0-539-patch))
                  ;; Resolve conflicts in previous patching.
                  (invoke
                   "patch" "--forward" "--strip=1" "--input"
                   #+(local-file
                      (search-patch
                       "zig-0.10.0-610-bootstrap-resolve-conflicts.patch")))
                  ;; Restore build system.
                  (rename-file "stage1/config.zig.in" "src/config.zig.in")
                  (substitute* "src/config.zig.in"
                    (("(have_stage1 = )false" _ prefix)
                     (string-append prefix "true")))
                  (for-each
                   (lambda (file)
                     (copy-file (in-vicinity #+zig-0.10.0-538-source file)
                                file))
                   '("build.zig" "CMakeLists.txt"))))
              (add-after 'install 'restore-source
                (lambda _
                  (for-each delete-file-recursively (find-files "."))
                  (copy-recursively "../source-backup" ".")))
              (add-after 'restore-source 'build-zig1
                (lambda _
                  (invoke (string-append #$output "/bin/zig")
                          "build" "update-zig1" "--verbose")))
              (add-after 'build-zig1 'install-zig1
                (lambda _
                  (install-file "stage1/zig1.wasm.zst"
                                (string-append #$output:zig1 "/bin"))))
              (delete 'install-glibc-abilists)))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (prepend binaryen)
         (delete "glibc-abi-tool")))
      (outputs '("out" "zig1")))))

;; Supply zig1.wasm.zst, build zig2 + zig1.wasm, install zig2 + zig1.wasm.zst.
(define zig-0.10.0-675
  (let ((commit "9d93b2ccf11f584320a2c5209dd2d94705167695")
        (revision "675")
        (base zig-0.10.0-610))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source
       (origin
         (inherit (zig-source
                   version commit
                   "1qsfsv8wg0kz616sgj7dw9ihdz5rsm80p3ambl5lnkrjhwym7z7x"))
         (patches (search-patches "zig-0.10.0-675-TypeOf-hack.patch"))))
      (arguments
       (substitute-keyword-arguments (package-arguments base)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'unpack 'set-host-triple
                (lambda _
                  (substitute* "CMakeLists.txt"
                    (("\\$\\{(ZIG_)?HOST_TARGET_TRIPLE\\}")
                     (zig-target
                      #$(platform-target
                         (lookup-platform-by-system (%current-system))))))))
              (replace 'prepare-source
                (lambda* (#:key native-inputs inputs #:allow-other-keys)
                  (install-file (search-input-file
                                 (or native-inputs inputs) "bin/zig1.wasm.zst")
                                "stage1")))
              (add-after 'prepare-source 'remove-stage3
                (lambda _
                  ;; Multiline substitution.
                  (invoke
                   "sed" "--in-place" "/^add_custom_target(stage3/,/^)$/d"
                   "CMakeLists.txt")))
              (replace 'install
                (lambda _
                  (install-file "zig2" (string-append #$output "/bin"))
                  (mkdir-p (string-append #$output "/lib"))
                  (copy-recursively "lib" (string-append #$output "/lib/zig"))))
              (replace 'build-zig1
                (lambda _
                  (invoke "./zig2" "build" "update-zig1" "--verbose")))
              (delete 'patch-more-shebangs)
              (delete 'backup-source)
              (delete 'restore-source)))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (prepend `(,base "zig1")))))))

;; Supply zig1.wasm.zst, build zig2 + zig1.wasm, install zig2 + zig1.wasm.
(define zig-0.10.0-722
  (let ((commit "d10fd78d4615f329141f5c19f893039d56aff425")
        (revision "722")
        (base zig-0.10.0-675))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0829wymcwph71zlwql6v7i7j9gr1m96acyp2xsr69vq2h98wmlap"))
      (arguments
       (substitute-keyword-arguments (package-arguments base)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'prepare-source
                (lambda* (#:key native-inputs inputs #:allow-other-keys)
                  (install-file (search-input-file
                                 (or native-inputs inputs) "bin/zig1.wasm.zst")
                                "stage1")
                  (invoke "zstd" "-d" "stage1/zig1.wasm.zst")
                  (make-file-writable "stage1/zig1.wasm")))
              (replace 'install-zig1
                (lambda _
                  (install-file "stage1/zig1.wasm"
                                (string-append #$output:zig1 "/bin"))))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (prepend zstd)
         (replace "zig" `(,base "zig1")))))))

;; Supply zig2, build zig1.wasm, install zig1.wasm.
(define zig-0.10.0-747
  (let ((commit "7b2a936173165002105ba5e76bed69654e132fea")
        (revision "747")
        (base zig-0.10.0-722))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source
       (origin
         (inherit (zig-source
                   version commit
                   "1z5ndywk4d1dcv2k3bw3n2zgjr3ysf3bi2ac4jhwqgnmzsw498wd"))
         (patches (search-patches "zig-0.10.0-747-CallOptions.patch"))))
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-722)
         ;; zig1.wasm is architecture-independent.
         ((#:target _ #f) #f)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'build-zig1
                (lambda _
                  (invoke "zig2" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))
              (delete 'prepare-source)
              (delete 'configure)
              (delete 'build)
              (delete 'install)))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out"))
         (delete "zstd"))))))

;; Supply zig1.wasm, build zig2 + zig1.wasm, install zig1.wasm.
(define zig-0.10.0-748
  (let ((commit "08b2d491bcd8c79c68495267cc71967661caea1e")
        (revision "748")
        (base zig-0.10.0-747))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "1iv1wjgj0nfbb19sp3zw4d8hmrhkah4cmklzxm8c32zsg673kv3i"))
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-722)
         ;; zig1.wasm is architecture-independent.
         ((#:target _ #f) #f)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'prepare-source
                (lambda* (#:key native-inputs inputs #:allow-other-keys)
                  (install-file (search-input-file
                                 (or native-inputs inputs) "bin/zig1.wasm")
                                "stage1")
                  (make-file-writable "stage1/zig1.wasm")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

;; Supply zig1.wasm, build zig2, install zig2.
(define zig-0.10.0-851
  (let ((commit "aac2d6b56f32134ea32fb3d984e3fcdfddd8aaf6")
        (revision "851")
        (base zig-0.10.0-748))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "026q8igib5a2wiqdxispijph7isx8g1m0p6xgclikrmwpkpr7wb8"))
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-748)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (delete 'build-zig1)
              (delete 'install-zig1)))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-853
  (let ((commit "2a5e1426aa9469fadb78e837d0100d689213b034")
        (revision "853")
        (base zig-0.10.0-851))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "18lqcf3vg6yi70hk6nzyv8mzw7rlhybawspk5z9s281bqv210v5s"))
      (arguments
       ;; zig1
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'build-zig1
                (lambda _
                  (invoke "zig2" "build" "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-961
  (let ((commit "54160e7f6aecb4628df633ceaef4c6d956429a3d")
        (revision "961")
        (base zig-0.10.0-853))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0f0n2bkygj8zxri275nisia3pdv2s4fikgnsnmag42bs747zn8bz"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-962
  (let ((commit "622311fb9ac7ee6d93dcb8cda4b608751f7e092a")
        (revision "962")
        (base zig-0.10.0-961))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "1yywzmxr6nwhdix5x9k5nrxa4n1nc8x8v1gqgyvwdhz47x9vw8b0"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-1027
  (let ((commit "a43fdc1620fa24c8c606f748505766bfd53d1049")
        (revision "1027")
        (base zig-0.10.0-962))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0w19qlzb2la5bnjalmv7n05m08lhz4x8c53hf34aqw66kagw47kj"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

;; Supply zig2, build zig1.wasm + zig2, install zig2.
(define zig-0.10.0-1073
  (let ((commit "4c1007fc044689b8cbc20634d73debb43df8efe1")
        (revision "1073")
        (base zig-0.10.0-1027))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "1mgvi3m2aph10c1ij9b4k6xs3jbp8hbswqgdnzxdi5y0ak7h1pd4"))
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-851)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-before 'build 'build-zig1
                (lambda _
                  (invoke "zig2" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))
              (delete 'prepare-source)))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-1497
  (let ((commit "a9b68308b9eeb494524e2b7ab0d63cfa6b623cd0")
        (revision "1497")
        (base zig-0.10.0-1073))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0ja2555h41kibkxyyjpzrp5rradm3bknxhaspzz3brcbc6xvac21"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-1505-source
  (let ((commit "fe4ea31f7e9e1c8caea6a1df107b91e8ea1a7b8a")
        (revision "1505"))
    (zig-source
     (git-version "0.10.0" revision commit)
     commit "0q91hz824l867dlzz885i4mlkjdr0v5nfk3drsnvkvz2q52r0ffx")))

(define zig-0.10.0-1506
  (let ((commit "f16c10a86b7183e99e54a70344f4681211cd52bb")
        (revision "1506")
        (base zig-0.10.0-1497))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "17qbwknv33xi8908f1kdapvvj331bmibvvjhsza04j3siq3rpbz7"))
      ;; zig2+zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-748)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'prepare-source 'restore-lib
                (lambda _
                  (delete-file-recursively "lib")
                  (copy-recursively
                   (string-append #+zig-0.10.0-1505-source "/lib")
                   "lib")))
              (replace 'build-zig1
                (lambda _
                  (invoke "./zig2" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-1637-source
  (let ((commit "4e6f21e2cb2c557b5c019f4acf445665a26edcba")
        (revision "1637"))
    (zig-source
     (git-version "0.10.0" revision commit)
     commit "1nd55j2c0br7rqx9fj6bkjyymkf1k6ms2m9f7byrc1ahggdyxrpv")))

(define zig-0.10.0-1638
  (let ((commit "7199d7c77715fe06606c5c89595e6852b3fa8c20")
        (revision "1638")
        (base zig-0.10.0-1506))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source
       (origin
         (inherit (zig-source
                   version commit
                   "15mvfgab9wglm1g5gakvqwb7l33v1vjwjwchb3pmhxmkxkrjkmgq"))
         (patches (search-patches "zig-0.10.0-1638-re-add-qualCast.patch"))))
      ;; zig2+zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-748)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'prepare-source 'restore-lib
                (lambda _
                  (delete-file-recursively "lib")
                  (copy-recursively
                   (string-append #+zig-0.10.0-1637-source "/lib")
                   "lib")))
              (replace 'build-zig1
                (lambda _
                  (invoke "./zig2" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-1657
  (let ((commit "321ccbdc525ab0f5862e42378b962c10ec54e4a1")
        (revision "1657")
        (base zig-0.10.0-1638))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0nv16z8fm1ihszlwvdncnza0pgykj1ca87pf1w8nr8prqhsc7kj7"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-1681
  (let ((commit "0bb178bbb2451238a326c6e916ecf38fbc34cab1")
        (revision "1681")
        (base zig-0.10.0-1657))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0kg1wnxxhjgd8fszbch039ngck1spyjvb1l0z2ja40ihnk5bxnsz"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-1712
  (let ((commit "705d2a3c2cd94faf8e16c660b3b342d6fe900e55")
        (revision "1712")
        (base zig-0.10.0-1681))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "08znnqyacjkdls4dhx6mis6yi6za0zv4abi2q3xl2304yjczm288"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-1713
  (let ((commit "09a84c8384dffc7884528947b879f32d93c1bd90")
        (revision "1713")
        (base zig-0.10.0-1712))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "1rbyqwd7iqbgwnws6rqr2d5bxxdh4z6phbg23hzm9i1xlxka6y6v"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-1888
  (let ((commit "c839c180ef1686794c039fc6d3c20a8716e87357")
        (revision "1888")
        (base zig-0.10.0-1713))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0kxgjzzqqknqimi0a0c75blgr2ic550nchbag4mv1yfrhr5y0x27"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-1891
  (let ((commit "ac1b0e832b4b9d151098050e1d29e28a568e215c")
        (revision "1891")
        (base zig-0.10.0-1888))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "15qjgbmygk05p86wqm170lxmalq2mr9f81slf8svb7akkmx5qls2"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-2558
  (let ((commit "d3a237a98c5a2ccf72a774b5f93425c02fea4bea")
        (revision "2558")
        (base zig-0.10.0-1891))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0q9583w919gvi91wbp529q54ijr8pldj8s0p2yapkbniadxxil7y"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (inputs
       (modify-inputs (package-inputs base)
         (replace "clang" clang-16)
         (replace "lld" lld-16)))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "llvm" llvm-16)
         (replace "zig" `(,base "zig1"))))
      (properties `((max-silent-time . 9600)
                    ,@(clang-compiler-cpu-architectures "16"))))))

(define zig-0.10.0-2565-source
  (let ((commit "856a9c2e3120d9ffa1166eed13641600230946da")
        (revision "2565"))
    (zig-source
     (git-version "0.10.0" revision commit)
     commit "00wqqckiyl6c3zcvgqxssnnv4ajip872ghrgv4mfrc8sllnhkdwa")))

(define zig-0.10.0-2566
  (let ((commit "e2fe1907ecac075e4d4a37776359144318b6055a")
        (revision "2566")
        (base zig-0.10.0-2558))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "1vy36ksv7jdxdkspi0jvmfz2xwvbc26x3rqns51wk3a39ngx1g2f"))
      (arguments
       ;; zig1
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'unpack 'restore-lib
                (lambda _
                  (let ((path "lib/std/start.zig"))
                    (copy-file (in-vicinity #+zig-0.10.0-2565-source path)
                               path))))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-2571
  (let ((commit "31738de2817f7932fa9237492f20fb736bc07dd3")
        (revision "2571")
        (base zig-0.10.0-2566))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0hak2yydzjjn61lpbmmvkvykc1imgb92qkn90p4wi4fw9nfsqq0v"))
      ;; zig2+zig1
      (arguments (package-arguments zig-0.10.0-748))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-2796-source
  (let ((commit "42ee364e7b698822a69cba4cd2bda17868657e05")
        (revision "2796"))
    (zig-source
     (git-version "0.10" revision commit)
     commit "0jd9q7bk6vsvjfma8d8iic7r9hc7j6xkz1ghw2vpra5q20fl86ba")))

(define zig-0.10.0-2797
  (let ((commit "35d82d31be3d2f2611049f41dc2616f898d70871")
        (revision "2797")
        (base zig-0.10.0-2571))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0av4qw7a41d9jmdmyachhisq98c3vjw1dqln1lgy1y3jxjsdf27h"))
      ;; zig2+zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-748)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-after 'prepare-source 'restore-lib
                (lambda _
                  (delete-file-recursively "lib")
                  (copy-recursively
                   (string-append #+zig-0.10.0-2796-source "/lib")
                   "lib")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-2824-source
  (let ((commit "8d88dcdc61c61e3410138f4402482131f5074a80")
        (revision "2824"))
    (zig-source
     (git-version "0.10" revision commit)
     commit "0xyhr98hyyb9b3c3d2lv6hxysaq1k1kmw9gynci0z9wm1y82rir8")))

(define zig-0.10.0-2838
  (let ((commit "a8de15f66a51d273cefa07eed0d8fd2952e92387")
        (revision "2838")
        (base zig-0.10.0-2797))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0hhz1hijg5hnw41s4p4p15gllpql5hn9my6a3d80jxv8nmd367q1"))
      ;; zig2+zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-748)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (add-before 'prepare-source 'backup-source
                (lambda _
                  (copy-recursively "lib" "../lib-backup")))
              (add-after 'prepare-source 'restore-lib
                (lambda _
                  (delete-file-recursively "lib")
                  (copy-recursively
                   (string-append #+zig-0.10.0-2824-source "/lib")
                   "lib")))
              (add-before 'build-zig1 'restore-source
                (lambda _
                  (delete-file-recursively "lib")
                  (copy-recursively "../lib-backup" "lib")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-3660
  (let ((commit "22c6b6c9a9378aaca75c83c2182a6d94298f6bc2")
        (revision "3660")
        (base zig-0.10.0-2838))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0dhcdi6008qqvy3ws2hhmj51wr213whbyghh7n9arai3zyg6y65g"))
      ;; zig2+zig1
      (arguments (package-arguments zig-0.10.0-748))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-3726
  (let ((commit "a6c8ee5231230947c928bbe1c6a39eb6e1bb9c5b")
        (revision "3726")
        (base zig-0.10.0-3660))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "148dhnzhm52lcwhvpwnnvpkpd3g6i1xh2vsac858agqr0slsd7g9"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-3728
  (let ((commit "a4d1edac8d65e1aa4b565f6fb11ab78541d97efa")
        (revision "3728")
        (base zig-0.10.0-3726))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "13vff9hqp83xhz0fab9wcwsf56hcz4sg3rwn1vziq85wkr9scj4b"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-3807
  (let ((commit "be0c69957e7489423606023ad820599652a60e15")
        (revision "3807")
        (base zig-0.10.0-3728))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "069w7d67imdn4qgdk7acddsfwl4dhs9nzna5k4h0cza2cl0xi0ic"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.10.0-3813
  (let ((commit "21ac0beb436f49fe49c6982a872f2dc48e4bea5e")
        (revision "3813")
        (base zig-0.10.0-3807))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0dmi1d8jg7y7zgi8xyq53g4g39ba4hnigyj491a5fj8xnkxqfrrb"))
      ;; zig2+zig1
      (arguments (package-arguments zig-0.10.0-748))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-3980
  (let ((commit "4bce7b1db964098e4a9163201fa3adcb26af6d97")
        (revision "3980")
        (base zig-0.10.0-3813))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0h76x1ak28dv5y60r4m4y524kwmf43ridwvsx3ahfql63jwxn0m3"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.10.0-3985
  (let ((commit "47d5bf26164b4ddb3228d17ae2158d1c29b8d040")
        (revision "3985")
        (base zig-0.10.0-3980))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.10.0" revision commit))
      (source (zig-source
               version commit
               "0w412aka8wjkkwyssqg8nvzb7qwaa29ywzwhg11bbwkpqyig36r4"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11-glibc-abi-tool
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/glibc-abi-tool")
          (commit "13576b1ea957882be7ff2c99f4cdc27454930219")))
    (file-name "glibc-abi-tool")
    (sha256
     (base32 "09m0ipixxw0dnal0zsgk6kvcz29y9s256b9y00s4hkhj95n630il"))
    (modules '((guix build utils)))
    (snippet
     #~(begin
         (substitute* "consolidate.zig"
           ((".*minor = 3[5678].*") "")
           (("(w\\.writeIntLittle.u16, )(@intCast.*);" _ prefix suffix)
            (string-append prefix "@as(u16, " suffix ");")))
         (with-directory-excursion "glibc"
           (for-each delete-file-recursively
                     '("2.35" "2.36" "2.37" "2.38")))))))

(define-public zig-0.11
  (package
    (inherit zig-0.10)
    (name "zig")
    (version "0.11.0")
    (source
     (origin
       (inherit (zig-source
                 version version
                 "0qh7c27cd4wcdjj0mbpkarvwypfk1js8hkyxs0z149qv75zkbrca"))
       (patches
        (search-patches
         "zig-0.11-build-respect-PKG_CONFIG-env-var.patch"
         "zig-0.9-use-baseline-cpu-by-default.patch"
         "zig-0.11-use-system-paths.patch"
         "zig-0.11-fix-runpath.patch"))))
    (arguments
     (substitute-keyword-arguments (package-arguments zig-0.10)
       ((#:phases phases '%standard-phases)
        #~(modify-phases #$phases
            (add-after 'unpack 'set-host-triple
              (lambda _
                (substitute* "CMakeLists.txt"
                  (("\\$\\{ZIG_HOST_TARGET_TRIPLE\\}")
                   (zig-target
                    #$(platform-target
                       (lookup-platform-by-system (%current-system))))))))
            (add-after 'unpack 'prepare-source
              (lambda* (#:key native-inputs inputs #:allow-other-keys)
                (install-file (search-input-file
                               (or native-inputs inputs) "bin/zig1.wasm")
                              "stage1")
                (make-file-writable "stage1/zig1.wasm")))
            (add-after 'install 'build-zig1
              (lambda _
                (invoke (string-append #$output "/bin/zig")
                        "build" "update-zig1" "--verbose")))
            (add-after 'build-zig1 'install-zig1
              (lambda _
                (install-file "stage1/zig1.wasm"
                              (string-append #$output:zig1 "/bin"))))
            ;; TODO: Disable tests for macOS target and run full test.
            ;; Issue with glibc in CPLUS_INCLUDE_PATH:
            ;; <https://github.com/ziglang/zig/issues/18063>.
            (replace 'check
              (lambda* (#:key tests? #:allow-other-keys)
                (when tests?
                  (invoke (string-append #$output "/bin/zig")
                          "test" "-I" "test" "test/behavior.zig"))))))))
    (inputs
     (modify-inputs (package-inputs zig-0.10)
       (replace "clang" clang-16)
       (replace "lld" lld-16)))
    (native-inputs
     (modify-inputs (package-native-inputs zig-0.10)
       (prepend binaryen `(,zig-0.10.0-3985 "zig1"))
       (replace "glibc-abi-tool" zig-0.11-glibc-abi-tool)
       (replace "llvm" llvm-16)))
    (outputs '("out" "zig1"))
    (properties `((max-silent-time . 9600)
                  ,@(clang-compiler-cpu-architectures "16")))))


;;;
;;; Bootstrap path for Zig 0.12.
;;; See also: <https://git.jakstys.lt/motiejus/zig-repro>.
;;;

(define zig-0.11.0-149
  (let ((commit "7a85ad151daece3d0bba3c8d23081502a0956c95")
        (revision "149")
        (base zig-0.11))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "1kb245d4wfs1dyv7ccw3xiawasggpln9qxfqwlp4gkdg50l1qyzw"))
      ;; zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'build-zig1
                (lambda _
                  (invoke "zig" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-384
  (let ((commit "88f5315ddfc6eaf3e28433504ec046fb3252db7c")
        (revision "384")
        (base zig-0.11.0-149))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "0ybql8l4mg8i79n353rc7gbx88kqgd371xrlvpmy69mxdffh5bas"))
      ;; zig2+zig1
      (arguments (package-arguments zig-0.10.0-748))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-494
  (let ((commit "a8d2ed806558cc1472f3a532169a4994abe17833")
        (revision "494")
        (base zig-0.11.0-384))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "04jb7la7ang0mip9qbrx57j1ls2n29svqafschxbh5j23pf74dql"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (inputs
       (modify-inputs (package-inputs base)
         (replace "clang" clang-17)
         (replace "lld" lld-17)))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "llvm" llvm-17)
         (replace "zig" `(,base "zig1"))))
      (properties `((max-silent-time . 9600)
                    ,@(clang-compiler-cpu-architectures "17"))))))

(define zig-0.11.0-587
  (let ((commit "6bd54a1d3ebd8d997158c57057ba742824cf7e0c")
        (revision "587")
        (base zig-0.11.0-494))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "16v6yrbwg1pc888fp3cmdbk2wyz0nm8xp66a14fi3akxyavsmkxm"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-631
  (let ((commit "21780899eb17a0cb795ff40e5fae6556c38ea13e")
        (revision "631")
        (base zig-0.11.0-587))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "19j3gbdsjsp602n2c1lp3i96yay94acsiasyzns8hs3v1sc952rp"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-638
  (let ((commit "9763573ebb4f05eaa1c0bd5598f8dd6aee20ae9c")
        (revision "638")
        (base zig-0.11.0-631))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "13620a6hlcaklmnxax4g3f4irddr9d15646s6bgn6ymwf6m4w4g0"))
      ;; zig1+zig2
      (arguments (package-arguments zig-0.10.0-1073))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-702
  (let ((commit "63bd2bff12992aef0ce23ae4b344e9cb5d65f05d")
        (revision "702")
        (base zig-0.11.0-638))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "049fpdgkarp834amymw0clvsk6g20742d3940la60na03rc4vy5x"))
      ;; zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'build-zig1
                (lambda _
                  (invoke "zig2" "build" "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-761
  (let ((commit "9a09651019b24a32945f73dd7a69562f2cf31581")
        (revision "761")
        (base zig-0.11.0-702))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "0d503vq76vl7m9fcmyqwx5nljy04fvjf06wfr7q7n5ircw5wjp0s"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-1967
  (let ((commit "6beae6c061a650ea2d695e6902683641df920aa8")
        (revision "1967")
        (base zig-0.11.0-761))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "0bah98h9rdaynwxlq4ibr925hmk69kwbrkgid2dgsksf6krb6sms"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-3245
  (let ((commit "4f782d1e853accbe1c4bfab2617c3813d4b1e59f")
        (revision "3245")
        (base zig-0.11.0-1967))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "0a4pnilfc528zl9ycwsi8kaqbq6q4bw3l1cpv50fpacsxgnsfjp3"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-3344
  (let ((commit "e646e0116196c2bd9668317366f5380f08c30e6e")
        (revision "3344")
        (base zig-0.11.0-3245))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "1vymn6qffmkhkl3rnp8zrxa1vwg8ayg5r2z3qz9bpfc6r2sb6ddq"))
      ;; zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              (replace 'build-zig1
                (lambda _
                  (invoke "zig2" "build" "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-3501
  (let ((commit "9b2345e182090e2f4c57e7684ec9739f195fdb1d")
        (revision "3501")
        (base zig-0.11.0-3344))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "0gwfnsjc3avx51cr5cwancms8s14hkrhqvk926cz3phgnn4jmpz0"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-3503
  (let ((commit "17673dcd6e3ffeb25fc9dc1cfc72334ab4e71b37")
        (revision "3503")
        (base zig-0.11.0-3501))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "09j6svmrlk9ybkz308vbdqqx87yc20yfj7jk59vj451478x4fcnb"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.11.0-3506
  (let ((commit "fb192df4f2d12dda5019e14bf6cab2693432cb36")
        (revision "3506")
        (base zig-0.11.0-3503))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "1k5qd1pf563wi4hk4qs29sxph38n7jd4ic5w7qw80pi3aq9c9vbx"))
      ;; zig2
      (arguments (package-arguments zig-0.10.0-851))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "zig1")))))))

(define zig-0.11.0-3604
  (let ((commit "7611d90ba011fb030523e669e85acfb6faae5d19")
        (revision "3604")
        (base zig-0.11.0-3506))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.11.0" revision commit))
      (source (zig-source
               version commit
               "1yl91rpqsnlf38hg77phpl5hy7ds0cg57agr23hjhy50z4vdj3m4"))
      ;; zig1
      (arguments (package-arguments zig-0.10.0-747))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.12-glibc-abi-tool
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/glibc-abi-tool")
          (commit "fc5d0a7046b76795e4219f8f168e118ec29fbc53")))
    (file-name "glibc-abi-tool")
    (sha256
     (base32 "1q9plbqkkk3jzrvsgcjmj5jjdncz4ym9p0snglz4kkjwwm65gqs1"))))

(define-public zig-0.12
  (package
    (inherit zig-0.11)
    (name "zig")
    (version "0.12.1")
    (source
     (origin
       (inherit (zig-source
                 version version
                 "0ssgfrsk116p16rwjwq1z2pvvcdij6s30s19bhzjms7maz4s77hb"))
       (patches
        (search-patches
         "zig-0.12-build-respect-PKG_CONFIG-env-var.patch"
         "zig-0.12-use-baseline-cpu-by-default.patch"
         "zig-0.12-use-system-paths.patch"
         "zig-0.12-fix-runpath.patch"))))
    (arguments
     (substitute-keyword-arguments (package-arguments zig-0.11)
       ((#:phases phases '%standard-phases)
        #~(modify-phases #$phases
            (replace 'patch-more-shebangs
              (lambda* (#:key inputs #:allow-other-keys)
                ;; Zig uses information about an ELF file to determine the
                ;; version of glibc and other data for native builds.
                (substitute* "lib/std/zig/system.zig"
                  (("/usr/bin/env")
                   (search-input-file inputs "bin/clang++")))))))))
    (inputs
     (modify-inputs (package-inputs zig-0.11)
       (replace "clang" clang-17)
       (replace "lld" lld-17)))
    (native-inputs
     (modify-inputs (package-native-inputs zig-0.11)
       (replace "glibc-abi-tool" zig-0.12-glibc-abi-tool)
       (replace "llvm" llvm-17)
       (replace "zig" `(,zig-0.11.0-3604 "zig1"))))
    (properties `((max-silent-time . 9600)
                  ,@(clang-compiler-cpu-architectures "17")))))


;;;
;;; Bootstrap path for Zig 0.13.
;;;

(define zig-0.12.0-109
  (let ((commit "b7799ef322103c8e449c45494c29fb4a8c9867df")
        (revision "109")
        (base zig-0.12))
    (package
      (inherit base)
      (name "zig")
      (version (git-version "0.12.0" revision commit))
      (source (zig-source
               version commit
               "1zy19w93wrd7dfdih8hfk9h3brkgaspaa60ipcmf08hlx6z2f0bz"))
      ;; zig1
      (arguments
       (substitute-keyword-arguments (package-arguments zig-0.10.0-747)
         ((#:phases phases '%standard-phases)
          #~(modify-phases #$phases
              ;; Build errors when zig1.wasm is not found.
              (add-after 'unpack 'prepare-source
                (lambda _
                  (invoke "touch" "stage1/zig1.wasm")))
              (replace 'build-zig1
                (lambda _
                  (invoke "zig" "build" "--zig-lib-dir" "lib"
                          "update-zig1" "--verbose")))))))
      (native-inputs
       (modify-inputs (package-native-inputs base)
         (replace "zig" `(,base "out")))))))

(define zig-0.13-glibc-abi-tool
  (origin
    (method git-fetch)
    (uri (git-reference
          (url "https://github.com/ziglang/glibc-abi-tool")
          (commit "fc5d0a7046b76795e4219f8f168e118ec29fbc53")))
    (file-name "glibc-abi-tool")
    (sha256
     (base32 "1q9plbqkkk3jzrvsgcjmj5jjdncz4ym9p0snglz4kkjwwm65gqs1"))))

(define-public zig-0.13
  (package
    (inherit zig-0.12)
    (name "zig")
    (version "0.13.0")
    (source
     (origin
       (inherit (zig-source
                 version version
                 "0ly8042lbsa8019g0d1jg4l06rxpq2530n9mijq66n4lmx7a5976"))
       (patches
        (search-patches
         "zig-0.13-build-respect-PKG_CONFIG-env-var.patch"
         "zig-0.12-use-baseline-cpu-by-default.patch"
         "zig-0.12-use-system-paths.patch"
         "zig-0.13-fix-runpath.patch"))))
    (inputs
     (modify-inputs (package-inputs zig-0.12)
       (replace "clang" clang-18)
       (replace "lld" lld-18)))
    (native-inputs
     (modify-inputs (package-native-inputs zig-0.12)
       (replace "glibc-abi-tool" zig-0.13-glibc-abi-tool)
       (replace "llvm" llvm-18)
       (replace "zig" `(,zig-0.12.0-109 "zig1"))))
    (properties `((max-silent-time . 9600)
                  ,@(clang-compiler-cpu-architectures "18")))))

(define-public zig zig-0.13)
