Add zig-build-system

  • Done
  • quality assurance status badge
Details
3 participants
  • Ekaitz Zarraga
  • Felix Lechner
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ekaitz Zarraga
Severity
normal
E
E
Ekaitz Zarraga wrote on 17 Jan 2023 18:36
(name . guix-patches@gnu.org)(address . guix-patches@gnu.org)
7NnZFxGvY0oj1TtDERAWi3dMBqoRv2AJoGBlaDPJA6vueGK91igAml6SLzMhNJyc1TssJW--OgezzmxLl5yv5MSgd7Wz6MRkORfOT62_f3w=@elenq.tech
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
From d492455090e97445cd0595ed1117bb564ad41640 Mon Sep 17 00:00:00 2001
From: Ekaitz Zarraga <ekaitz@elenq.tech>
Date: Thu, 15 Dec 2022 13:02:25 +0100
Subject: [PATCH 2/2] gnu: Add tigerbeetle.

* gnu/packages/zig.scm (tigerbeetle): New variable.
---
gnu/packages/zig.scm | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)

Toggle diff (50 lines)
diff --git a/gnu/packages/zig.scm b/gnu/packages/zig.scm
index cda93bed2e..2ff65b3b1a 100644
--- a/gnu/packages/zig.scm
+++ b/gnu/packages/zig.scm
@@ -25,7 +25,8 @@ (define-module (gnu packages zig)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix build-system cmake)
#:use-module (gnu packages)
- #:use-module (gnu packages llvm))
+ #:use-module (gnu packages llvm)
+ #:use-module (guix build-system zig))
(define-public zig
(package
@@ -104,3 +105,33 @@ (define-public zig
;; https://github.com/ziglang/zig/issues/6485
(supported-systems %64bit-supported-systems)
(license license:expat)))
+
+
+(define-public tigerbeetle
+ (let ((commit-id "2022-12-12-weekly")
+ (revision "0"))
+ (package
+ (name "tigerbeetle")
+ (version (string-append revision "-" commit-id))
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/tigerbeetledb/tigerbeetle.git")
+ (commit commit-id)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "18rawl8rhyplw8hpa3fzbq9fqg088x0calz688c7zdff6y6f6mcr"))))
+ (build-system zig-build-system)
+
+ (arguments
+ `(#:zig-release-type "safe"))
+
+ (synopsis "Distributed financial accounting database designed for mission
+critical safety and performance")
+
+ (description "Financial accounting database designed for mission critical
+safet y and performance to power the future of financial
+services.")
+ (home-page "https://github.com/tigerbeetledb/tigerbeetle.git")
+ (license license:asl2.0))))
--
2.38.0
E
E
Ekaitz Zarraga wrote on 20 Jan 2023 15:30
Tentative cross-compilation support
(name . 60889@debbugs.gnu.org)(address . 60889@debbugs.gnu.org)
PDZsAr1BD5WsurIdUYX_Vj9n4LMJWthlnv7eUJ4Vjaa4_AMJINdDTW5DuLnTN3yYRA2TJ-SbJIxs7W1dXtkZD3RRNZXT8X_TPT8uGad8TMo=@elenq.tech
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
F
F
Felix Lechner wrote on 21 Jun 2023 17:06
[PATCH v2] build-system: Add zig-build-system.
(address . 60889@debbugs.gnu.org)(name . Ekaitz Zarraga)(address . ekaitz@elenq.tech)
9709080a22a38e340bdb709e0a0d8b305a1eb3a0.1687359946.git.felix.lechner@lease-up.com
From: Ekaitz Zarraga <ekaitz@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

Toggle diff (306 lines)
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@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@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
F
F
Felix Lechner wrote on 21 Jun 2023 17:07
(address . control@debbugs.gnu.org)
CAFHYt56qpE0N3AgEk97JAQY1cfLLD3bWw95DkSnMfgYePX5yxg@mail.gmail.com
block 64208 by 60889
thanks
L
L
Ludovic Courtès wrote on 21 Oct 2023 00:02
(name . Felix Lechner)(address . felix.lechner@lease-up.com)
877cnht0jr.fsf_-_@gnu.org
Hi Ekaitz & Felix,

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

Toggle quote (9 lines)
> From: Ekaitz Zarraga <ekaitz@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’.
Toggle diff (14 lines)
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}.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 60889@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 60889
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch