GNU bug report logs -
#60889
Add zig-build-system
Previous Next
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.
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):
[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):
[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: 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):
[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.