Message ID | 7e0456e51a420958dc9a2809f1e52e2ad444ace6.1631195387.git.liliana.prikler@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [bug#47006,1/2] gnu: lld: Update to 12.0.0. | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | success | View Laminar job |
cbaines/issue | success | View issue |
Hi Liliana, Thanks for taking a look at the recent patch and sending an updated one. I've been tinkering with the recent zig patch as well, so I have a few comments. Liliana Prikler <liliana.prikler@gmail.com> writes: > * gnu/packages/zig.scm: New file. > * gnu/local.mk (GNU_SYSTEM_MODULES): Add it here. > --- > gnu/local.mk | 1 + > gnu/packages/zig.scm | 83 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 84 insertions(+) > create mode 100644 gnu/packages/zig.scm > > diff --git a/gnu/local.mk b/gnu/local.mk > index 2a56c4a9e2..710e5bd9df 100644 > --- a/gnu/local.mk > +++ b/gnu/local.mk > @@ -598,6 +598,7 @@ GNU_SYSTEM_MODULES = \ > %D%/packages/xdisorg.scm \ > %D%/packages/xorg.scm \ > %D%/packages/xfce.scm \ > + %D%/packages/zig.scm \ > %D%/packages/zile.scm \ > %D%/packages/zwave.scm \ > \ > diff --git a/gnu/packages/zig.scm b/gnu/packages/zig.scm > new file mode 100644 > index 0000000000..8b9a863b4d > --- /dev/null > +++ b/gnu/packages/zig.scm > @@ -0,0 +1,83 @@ > +;;; GNU Guix --- Functional package management for GNU > +;;; Copyright © 2021 Leo Prikler <leo.prikler@student.tugraz.at> > +;;; > +;;; 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 packages) > + #: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 llvm)) > + > +(define-public zig > + (package > + (name "zig") > + (version "0.8.1") > + (source > + (origin > + (method git-fetch) > + (uri (git-reference > + (url "https://github.com/ziglang/zig.git") > + (commit version))) > + (file-name (git-file-name name version)) > + (sha256 > + (base32 "147qx7xgj0r353wh5ragzn6kmm1vrf31i8038z3zqwjnqqgqxi6c")))) > + (build-system cmake-build-system) > + ;; Zig is based on and builds itself using the Clang toolchain, > + ;; so add it both as inputs and native-inputs. > + (inputs > + `(("clang" ,clang-12) > + ("lld" ,lld-12) > + ("llvm" ,llvm-12))) > + (native-inputs > + `(("clang" ,clang-12) > + ("lld" ,lld-12) > + ("llvm" ,llvm-12))) Zig is perfectly happy compiling itself with GCC, and I believe it's the default. I'm pretty sure it either needs no native tools, or only llvm, but I wasn't able to test without compiling a whole GCC cross-toolchain. For cross compiling, you will also need to add "-DZIG_TARGET_TRIPLE=" to configure flags, and you might want to look into adding "-DZIG_TARGET_MCPU" (should take the same values as LLVM's -mcpu) to change the baseline CPU for ARM systems since we build for ARM7 by default. > + (arguments > + `(#:tests? #f ; no check target Did you mean to leave this in? ;) > + #:phases > + (modify-phases %standard-phases > + (add-after 'unpack 'save-unpack-dir > + (lambda _ > + ;; HACK: Passing unpacked source directory to 'check phase. > + (setenv "ZIG_SOURCE_DIR" (getcwd)) > + #t)) > + (add-after 'configure 'set-home > + (lambda _ > + (setenv "HOME" (getcwd)) ; zig writes to $HOME/.cache > + #t)) > + (delete 'check) > + (add-after 'install 'check > + (lambda* (#:key outputs tests? #:allow-other-keys) > + (when tests? > + (with-directory-excursion (getenv "ZIG_SOURCE_DIR") > + (invoke (string-append (assoc-ref outputs) "out") "/bin/zig" > + "build" "test")))))))) Full tests take quite a while, (it's supposed to be "an hour or two") so it may eventually be a good idea to limit what we test, such as using "-Dskip-release", which tests without optimization. IMO that should be enough for catching any Guix-based issues with 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") > + (license license:expat))) I don't know if it affects the license, but Zig bundles the source for *many* components, such as glibc, musl, mingw, wasi, and from LLVM: libcxx, libcxxabi, libunwind, and tsan. Zig doesn't seem to honor LIBRARY_PATH, but oddly enough it honors NIX_LDFLAGS and NIX_CFLAGS_COMPILE, so if we want it to see external libraries, something like this is needed: --8<---------------cut here---------------start------------->8--- (add-after 'check 'wrap-binary (lambda* (#:key outputs #:allow-other-keys) ;; TODO: test with 'zig cc' (wrap-program (string-append (assoc-ref outputs "out") "/bin/zig") `("NIX_LDFLAGS" prefix ("${LIBRARY_PATH:+-L${LIBRARY_PATH//:/ -L}}")) `("NIX_CFLAGS_COMPILE" prefix (,(string-append "${CPLUS_INCLUDE_PATH:+-isystem " "${CPLUS_INCLUDE_PATH//:/ -isystem }}")))))) --8<---------------cut here---------------end--------------->8--- I haven't tested this with 'zig cc', but this worked for compiling [0]. [0] https://github.com/andrewrk/tetris Hope that helps, -- Sarah
Hi Sarah, Am Donnerstag, den 09.09.2021, 09:31 -0700 schrieb Sarah Morgensen: > Liliana Prikler <liliana.prikler@gmail.com> writes: > > > * gnu/packages/zig.scm: New file. > > * gnu/local.mk (GNU_SYSTEM_MODULES): Add it here. > > --- > > gnu/local.mk | 1 + > > gnu/packages/zig.scm | 83 > > ++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 84 insertions(+) > > create mode 100644 gnu/packages/zig.scm > > > > diff --git a/gnu/local.mk b/gnu/local.mk > > index 2a56c4a9e2..710e5bd9df 100644 > > --- a/gnu/local.mk > > +++ b/gnu/local.mk > > @@ -598,6 +598,7 @@ GNU_SYSTEM_MODULES = > > \ > > %D%/packages/xdisorg.scm \ > > %D%/packages/xorg.scm \ > > %D%/packages/xfce.scm \ > > + %D%/packages/zig.scm \ > > %D%/packages/zile.scm \ > > %D%/packages/zwave.scm \ > > \ > > diff --git a/gnu/packages/zig.scm b/gnu/packages/zig.scm > > new file mode 100644 > > index 0000000000..8b9a863b4d > > --- /dev/null > > +++ b/gnu/packages/zig.scm > > @@ -0,0 +1,83 @@ > > +;;; GNU Guix --- Functional package management for GNU > > +;;; Copyright © 2021 Leo Prikler <leo.prikler@student.tugraz.at> > > +;;; > > +;;; 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 packages) > > + #: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 llvm)) > > + > > +(define-public zig > > + (package > > + (name "zig") > > + (version "0.8.1") > > + (source > > + (origin > > + (method git-fetch) > > + (uri (git-reference > > + (url "https://github.com/ziglang/zig.git") > > + (commit version))) > > + (file-name (git-file-name name version)) > > + (sha256 > > + (base32 > > "147qx7xgj0r353wh5ragzn6kmm1vrf31i8038z3zqwjnqqgqxi6c")))) > > + (build-system cmake-build-system) > > + ;; Zig is based on and builds itself using the Clang > > toolchain, > > + ;; so add it both as inputs and native-inputs. > > + (inputs > > + `(("clang" ,clang-12) > > + ("lld" ,lld-12) > > + ("llvm" ,llvm-12))) > > + (native-inputs > > + `(("clang" ,clang-12) > > + ("lld" ,lld-12) > > + ("llvm" ,llvm-12))) > > Zig is perfectly happy compiling itself with GCC, and I believe it's > the default. I'm pretty sure it either needs no native tools, or > only llvm, but I wasn't able to test without compiling a whole GCC > cross-toolchain. > > For cross compiling, you will also need to add "-DZIG_TARGET_TRIPLE=" > to configure flags, and you might want to look into adding > "-DZIG_TARGET_MCPU" (should take the same values as LLVM's -mcpu) to > change the baseline CPU for ARM systems since we build for ARM7 by > default. I don't think we set mcpu for LLVM or Clang, so that one should be fine. As for ZIG_TARGET_TRIPLET and the native inputs, do you have an amended patch already lying around? > > + (arguments > > + `(#:tests? #f ; no check target > > Did you mean to leave this in? ;) Pretty sure that was a copypaste error at some point, good catch. > > + #:phases > > + (modify-phases %standard-phases > > + (add-after 'unpack 'save-unpack-dir > > + (lambda _ > > + ;; HACK: Passing unpacked source directory to 'check > > phase. > > + (setenv "ZIG_SOURCE_DIR" (getcwd)) > > + #t)) > > + (add-after 'configure 'set-home > > + (lambda _ > > + (setenv "HOME" (getcwd)) ; zig writes to > > $HOME/.cache > > + #t)) > > + (delete 'check) > > + (add-after 'install 'check > > + (lambda* (#:key outputs tests? #:allow-other-keys) > > + (when tests? > > + (with-directory-excursion (getenv "ZIG_SOURCE_DIR") > > + (invoke (string-append (assoc-ref outputs) "out") > > "/bin/zig" > > + "build" "test")))))))) > > Full tests take quite a while, (it's supposed to be "an hour or two") > so it may eventually be a good idea to limit what we test, such as > using "-Dskip-release", which tests without optimization. IMO that > should be enough for catching any Guix-based issues with Zig. Is that a configure flag or a test flag? > > + (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") > > + (license license:expat))) > > I don't know if it affects the license, but Zig bundles the source > for *many* components, such as glibc, musl, mingw, wasi, and from > LLVM: libcxx, libcxxabi, libunwind, and tsan. Good catch, could we unbundle some/all of those? > Zig doesn't seem to honor LIBRARY_PATH, but oddly enough it honors > NIX_LDFLAGS and NIX_CFLAGS_COMPILE, so if we want it to see external > libraries, something like this is needed: > > --8<---------------cut here---------------start------------->8--- > (add-after 'check 'wrap-binary > (lambda* (#:key outputs #:allow-other-keys) > ;; TODO: test with 'zig cc' > (wrap-program (string-append (assoc-ref outputs "out") > "/bin/zig") > `("NIX_LDFLAGS" prefix > ("${LIBRARY_PATH:+-L${LIBRARY_PATH//:/ -L}}")) > `("NIX_CFLAGS_COMPILE" prefix > (,(string-append > "${CPLUS_INCLUDE_PATH:+-isystem " > "${CPLUS_INCLUDE_PATH//:/ -isystem }}")))))) > --8<---------------cut here---------------end--------------->8--- That is rather inelegant. I'd prefer we patch zig to honor LIBRARY_PATH, CPLUS_INCLUDE_FLAGS and what other important environment variables we find. Thanks
diff --git a/gnu/local.mk b/gnu/local.mk index 2a56c4a9e2..710e5bd9df 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -598,6 +598,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/xdisorg.scm \ %D%/packages/xorg.scm \ %D%/packages/xfce.scm \ + %D%/packages/zig.scm \ %D%/packages/zile.scm \ %D%/packages/zwave.scm \ \ diff --git a/gnu/packages/zig.scm b/gnu/packages/zig.scm new file mode 100644 index 0000000000..8b9a863b4d --- /dev/null +++ b/gnu/packages/zig.scm @@ -0,0 +1,83 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2021 Leo Prikler <leo.prikler@student.tugraz.at> +;;; +;;; 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 packages) + #: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 llvm)) + +(define-public zig + (package + (name "zig") + (version "0.8.1") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/ziglang/zig.git") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "147qx7xgj0r353wh5ragzn6kmm1vrf31i8038z3zqwjnqqgqxi6c")))) + (build-system cmake-build-system) + ;; Zig is based on and builds itself using the Clang toolchain, + ;; so add it both as inputs and native-inputs. + (inputs + `(("clang" ,clang-12) + ("lld" ,lld-12) + ("llvm" ,llvm-12))) + (native-inputs + `(("clang" ,clang-12) + ("lld" ,lld-12) + ("llvm" ,llvm-12))) + (arguments + `(#:tests? #f ; no check target + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'save-unpack-dir + (lambda _ + ;; HACK: Passing unpacked source directory to 'check phase. + (setenv "ZIG_SOURCE_DIR" (getcwd)) + #t)) + (add-after 'configure 'set-home + (lambda _ + (setenv "HOME" (getcwd)) ; zig writes to $HOME/.cache + #t)) + (delete 'check) + (add-after 'install 'check + (lambda* (#:key outputs tests? #:allow-other-keys) + (when tests? + (with-directory-excursion (getenv "ZIG_SOURCE_DIR") + (invoke (string-append (assoc-ref outputs) "out") "/bin/zig" + "build" "test")))))))) + (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") + (license license:expat)))