GNU bug report logs - #60889
Add zig-build-system

Previous Next

Package: guix-patches;

Reported by: Ekaitz Zarraga <ekaitz <at> elenq.tech>

Date: Tue, 17 Jan 2023 17:38:01 UTC

Severity: normal

Done: Ludovic Courtès <ludo <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 60889 in the body.
You can then email your comments to 60889 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#60889; Package guix-patches. (Tue, 17 Jan 2023 17:38:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Ekaitz Zarraga <ekaitz <at> elenq.tech>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Tue, 17 Jan 2023 17:38:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Ekaitz Zarraga <ekaitz <at> elenq.tech>
To: "guix-patches <at> gnu.org" <guix-patches <at> gnu.org>
Cc: Ludovic Courtès <ludo <at> gnu.org>,
 "efraim <at> flashner.co.il" <efraim <at> flashner.co.il>
Subject: Add zig-build-system
Date: Tue, 17 Jan 2023 17:36:42 +0000
[Message part 1 (text/plain, inline)]
Hi,

This is tentative patch for a zig-build-system and a package that makes use of it as a testing.

Please, share your thoughts and feelings about it.

Cheers,
Ekaitz
[0001-build-system-Add-zig-build-system.patch (text/x-patch, attachment)]
[0002-gnu-Add-tigerbeetle.patch (text/x-patch, attachment)]

Information forwarded to guix-patches <at> gnu.org:
bug#60889; Package guix-patches. (Fri, 20 Jan 2023 14:31:02 GMT) Full text and rfc822 format available.

Message #8 received at 60889 <at> debbugs.gnu.org (full text, mbox):

From: Ekaitz Zarraga <ekaitz <at> elenq.tech>
To: "60889 <at> debbugs.gnu.org" <60889 <at> debbugs.gnu.org>
Subject: Tentative cross-compilation support
Date: Fri, 20 Jan 2023 14:30:07 +0000
[Message part 1 (text/plain, inline)]
Hi,

Let me add a tentative cross-compilation support for the previous patch set.

I just tested it with the tigerbeetle package included and it generated an aarch64-linux-gnu binary with no problem but I'm not sure about the implementation.

It needs an in-depth review.

Cheers,
Ekaitz
[0003-Tentative-cross-compilation-support-for-zig.patch (text/x-patch, attachment)]

Information forwarded to guix-patches <at> gnu.org:
bug#60889; Package guix-patches. (Wed, 21 Jun 2023 15:07:01 GMT) Full text and rfc822 format available.

Message #11 received at 60889 <at> debbugs.gnu.org (full text, mbox):

From: Felix Lechner <felix.lechner <at> lease-up.com>
To: 60889 <at> debbugs.gnu.org
Cc: Ekaitz Zarraga <ekaitz <at> elenq.tech>
Subject: [PATCH v2] build-system: Add zig-build-system.
Date: Wed, 21 Jun 2023 08:06:13 -0700
From: Ekaitz Zarraga <ekaitz <at> elenq.tech>

* guix/build-system/zig.scm: New file.
* guix/build/zig-build-system.scm: New file.
* Makefile.am: Add them.
* doc/guix.texi: Document it.
* etc/snippets/yas/scheme-mode/guix-package (build-system): Add
  zig-build-system.
---

Hi Ekaitz,

Thanks for this important work! I rebased the build system below so
it applies cleanly to master.

I also moved tigerbeetle to the new Bug#64208 (together with the new
Wayland compositor called River) and will declare this bug as a
prerequisite for the other one.

Kind regards
Felix


 Makefile.am                               |   2 +
 doc/guix.texi                             |  20 ++++
 etc/snippets/yas/scheme-mode/guix-package |   5 +-
 guix/build-system/zig.scm                 | 124 ++++++++++++++++++++++
 guix/build/zig-build-system.scm           | 100 +++++++++++++++++
 5 files changed, 249 insertions(+), 2 deletions(-)
 create mode 100644 guix/build-system/zig.scm
 create mode 100644 guix/build/zig-build-system.scm

diff --git a/Makefile.am b/Makefile.am
index a386e6033c..bbcccdf7bc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -184,6 +184,7 @@ MODULES =					\
   guix/build-system/texlive.scm			\
   guix/build-system/tree-sitter.scm		\
   guix/build-system/trivial.scm			\
+  guix/build-system/zig.scm			\
   guix/ftp-client.scm				\
   guix/http-client.scm				\
   guix/gnupg.scm				\
@@ -270,6 +271,7 @@ MODULES =					\
   guix/build/graft.scm				\
   guix/build/bournish.scm			\
   guix/build/qt-utils.scm			\
+  guix/build/zig-build-system.scm		\
   guix/build/make-bootstrap.scm			\
   guix/search-paths.scm				\
   guix/packages.scm				\
diff --git a/doc/guix.texi b/doc/guix.texi
index c961f706ec..b302f883c4 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9980,6 +9980,26 @@ Python package is used to run the script can be specified with the
 @code{#:python} parameter.
 @end defvar
 
+@defvar zig-build-system
+This variable is exported by @code{(guix build-system zig)}.  It implements
+the build procedures for the Zig build system (@code{zig build} command).
+
+Selecting this build system adds @code{zig} to the package inputs, in
+addition to the packages of @code{gnu-build-system}.
+
+There is no @code{configure} phase because Zig packages typically do not
+need to be configured.  The @code{#:zig-build-flags} parameter is a list of
+flags that are passed to the @code{zig} command during the build.  The
+@code{#:zig-test-flags} parameter is a list of flags that are passed to the
+@code{zig test} command during the @code{check} phase.  The default compiler
+package can be overridden with the @code{#:zig} argument.
+
+The optional @code{zig-release-type} parameter declares the type of release.
+Possible values are: @code{safe}, @code{fast}, or @code{small}. The default
+value is @code{#f}, which causes the release flag to be omitted from the
+@code{zig} command.  That results in a @code{debug} build.
+@end defvar
+
 @defvar scons-build-system
 This variable is exported by @code{(guix build-system scons)}.  It
 implements the build procedure used by the SCons software construction
diff --git a/etc/snippets/yas/scheme-mode/guix-package b/etc/snippets/yas/scheme-mode/guix-package
index 724a392f81..3bb6307659 100644
--- a/etc/snippets/yas/scheme-mode/guix-package
+++ b/etc/snippets/yas/scheme-mode/guix-package
@@ -43,8 +43,9 @@
                                           "scons-build-system"
                                           "texlive-build-system"
                                           "trivial-build-system"
-                                          "waf-build-system")})
+                                          "waf-build-system"
+                                          "zig-build-system")})
     (home-page "$4")
     (synopsis "$5")
     (description "$6")
-    (license $7)))
\ No newline at end of file
+    (license $7)))
diff --git a/guix/build-system/zig.scm b/guix/build-system/zig.scm
new file mode 100644
index 0000000000..16b8a712cc
--- /dev/null
+++ b/guix/build-system/zig.scm
@@ -0,0 +1,124 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2023 Ekaitz Zarraga <ekaitz <at> elenq.tech>
+;;;
+;;; 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 (guix build-system zig)
+  #:use-module (guix search-paths)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (guix monads)
+  #:use-module (guix packages)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26)
+  #:export (zig-build-system))
+
+
+(define (default-zig)
+  "Return the default zig package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((zig (resolve-interface '(gnu packages zig))))
+    (module-ref zig 'zig)))
+
+(define %zig-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build zig-build-system)
+    (guix build syscalls)
+    ,@%gnu-build-system-modules))
+
+(define* (zig-build name inputs
+                    #:key
+                    source
+                    (tests? #t)
+                    (test-target #f)
+                    (zig-build-flags ''())
+                    (zig-test-flags ''())
+                    (zig-release-type #f)
+                    (phases '%standard-phases)
+                    (outputs '("out"))
+                    (search-paths '())
+                    (system (%current-system))
+                    (guile #f)
+                    (imported-modules %zig-build-system-modules)
+                    (modules '((guix build zig-build-system)
+                               (guix build utils))))
+  "Build SOURCE using Zig, and with INPUTS."
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+          (zig-build #:name #$name
+                     #:source #+source
+                     #:system #$system
+                     #:test-target #$test-target
+                     #:zig-build-flags #$zig-build-flags
+                     #:zig-test-flags #$zig-test-flags
+                     #:zig-release-type #$zig-release-type
+                     #:tests? #$tests?
+                     #:phases #$phases
+                     #:outputs #$(outputs->gexp outputs)
+                     #:search-paths '#$(sexp->gexp
+                                        (map search-path-specification->sexp
+                                             search-paths))
+                     #:inputs #$(input-tuples->gexp inputs)))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+    (gexp->derivation name builder
+                      #:system system
+                      #:guile-for-build guile)))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (zig (default-zig))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+
+  (define private-keywords
+    '(#:target #:zig #:inputs #:native-inputs #:outputs))
+
+  ;; TODO: support cross-compilation
+  ;; It's as simple as adding some build flags to `zig-build-flags`
+  ;; -Dtarget=aarch64-linux-musl, for example.
+  (and (not target)
+       (bag
+         (name name)
+         (system system)
+         (target target)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+
+                        ;; Keep the standard inputs of 'gnu-build-system'
+                        ;; TODO: do we need this?
+                        ,@(standard-packages)))
+         (build-inputs `(("zig" ,zig)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build zig-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define zig-build-system
+  (build-system
+    (name 'zig)
+    (description
+     "Zig build system, to build Zig packages")
+    (lower lower)))
diff --git a/guix/build/zig-build-system.scm b/guix/build/zig-build-system.scm
new file mode 100644
index 0000000000..d414ebfb17
--- /dev/null
+++ b/guix/build/zig-build-system.scm
@@ -0,0 +1,100 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2023 Ekaitz Zarraga <ekaitz <at> elenq.tech>
+;;;
+;;; 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 (guix build zig-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module (guix build utils)
+  #:use-module (ice-9 popen)
+  #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 ftw)
+  #:use-module (ice-9 format)
+  #:use-module (ice-9 match)
+  #:use-module (rnrs io ports)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            zig-build))
+
+;; Interesting guide here:
+;; 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* (build #:key
+                zig-build-flags
+                zig-release-type       ;; "safe", "fast" or "small" empty for a
+                                       ;; debug build"
+                #:allow-other-keys)
+  "Build a given Zig package."
+
+  (setenv "DESTDIR" "out")
+  (let ((call `("zig" "build"
+                     "--prefix"             ""            ;; Don't add /usr
+                     "--prefix-lib-dir"     "lib"
+                     "--prefix-exe-dir"     "bin"
+                     "--prefix-include-dir" "include"
+                     ,@(if zig-release-type
+                         (list (string-append "-Drelease-" zig-release-type))
+                         '())
+                     ,@zig-build-flags)))
+  (format #t "running: ~s~%" call)
+  (apply invoke call)))
+
+(define* (check #:key tests?
+                zig-test-flags
+                #:allow-other-keys)
+  "Run all the tests"
+  (when tests?
+    (let ((old-destdir (getenv "DESTDIR")))
+      (setenv "DESTDIR" "test-out") ;; Avoid colisions with the build output
+      (let ((call `("zig" "build" "test"
+                    ,@zig-test-flags)))
+        (format #t "running: ~s~%" call)
+        (apply invoke call))
+      (if old-destdir
+        (setenv "DESTDIR" old-destdir)
+        (unsetenv "DESTDIR")))))
+
+(define* (install #:key inputs outputs #:allow-other-keys)
+  "Install a given Zig package."
+  (let ((out (assoc-ref outputs "out")))
+    (copy-recursively "out" out)))
+
+(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 'build build)
+    (replace 'check check)
+    (replace 'install install)))
+
+
+(define* (zig-build #:key inputs (phases %standard-phases)
+                      #:allow-other-keys #:rest args)
+  "Build the given Zig package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
-- 
2.40.1





Added indication that bug 60889 blocks64208 Request was from Felix Lechner <felix.lechner <at> lease-up.com> to control <at> debbugs.gnu.org. (Wed, 21 Jun 2023 15:09:02 GMT) Full text and rfc822 format available.

Reply sent to Ludovic Courtès <ludo <at> gnu.org>:
You have taken responsibility. (Fri, 20 Oct 2023 22:04:01 GMT) Full text and rfc822 format available.

Notification sent to Ekaitz Zarraga <ekaitz <at> elenq.tech>:
bug acknowledged by developer. (Fri, 20 Oct 2023 22:04:02 GMT) Full text and rfc822 format available.

Message #18 received at 60889-done <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Felix Lechner <felix.lechner <at> lease-up.com>
Cc: 60889-done <at> debbugs.gnu.org, Ekaitz Zarraga <ekaitz <at> elenq.tech>
Subject: Re: bug#60889: Add zig-build-system
Date: Sat, 21 Oct 2023 00:02:32 +0200
[Message part 1 (text/plain, inline)]
Hi Ekaitz & Felix,

Felix Lechner <felix.lechner <at> lease-up.com> skribis:

> From: Ekaitz Zarraga <ekaitz <at> elenq.tech>
>
> * guix/build-system/zig.scm: New file.
> * guix/build/zig-build-system.scm: New file.
> * Makefile.am: Add them.
> * doc/guix.texi: Document it.
> * etc/snippets/yas/scheme-mode/guix-package (build-system): Add
>   zig-build-system.

Applied with the changes below, thank you!

Ludo’.

[Message part 2 (text/x-patch, inline)]
diff --git a/doc/guix.texi b/doc/guix.texi
index 1928cd016f..60d3ab3336 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -10221,7 +10221,8 @@ Build Systems
 
 @defvar zig-build-system
 This variable is exported by @code{(guix build-system zig)}.  It implements
-the build procedures for the Zig build system (@code{zig build} command).
+the build procedures for the @uref{https://ziglang.org/, Zig}
+build system (@command{zig build} command).
 
 Selecting this build system adds @code{zig} to the package inputs, in
 addition to the packages of @code{gnu-build-system}.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 18 Nov 2023 12:24:11 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.