(address . guix-patches@gnu.org)(name . Pierre-Henry Fröhring)(address . phfrohring@deeplinks.com)
This commit introduces a mix-build-system. The provided code ensures that the
following code runs without errors:
./pre-inst-env guix build elixir-machete
A key challenge is the lack of bit reproducibility, in part due to rebar3's
lack of bit reproducibility. Future patches may address this, and I welcome
feedback.
Given the changes, splitting them into focused patches might be best. As a
first-time contributor, I seek advice on a suitable patch sequence.
I also request guidance from the Guix community for a seamless
integration. Please suggest next steps for the mix-build-system integration.
Thank you.
---
gnu/packages/elixir-xyz.scm | 327 ++++++++++
gnu/packages/elixir.scm | 164 +++--
gnu/packages/emacs-xyz.scm | 20 +
gnu/packages/erlang-xyz.scm | 650 +++++++++++++++++++
gnu/packages/erlang.scm | 996 +++++++++---------------------
guix/build-system/mix.scm | 185 ++++++
guix/build-system/rebar.scm | 320 +++++++---
guix/build/mix-build-system.scm | 373 +++++++++++
guix/build/rebar-build-system.scm | 302 +++++----
9 files changed, 2377 insertions(+), 960 deletions(-)
create mode 100644 gnu/packages/elixir-xyz.scm
create mode 100644 gnu/packages/erlang-xyz.scm
create mode 100644 guix/build-system/mix.scm
create mode 100644 guix/build/mix-build-system.scm
Toggle diff (471 lines)
diff --git a/gnu/packages/elixir-xyz.scm b/gnu/packages/elixir-xyz.scm
new file mode 100644
index 00000000..767f9db7
--- /dev/null
+++ b/gnu/packages/elixir-xyz.scm
@@ -0,0 +1,327 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2023 Pierre-Henry Fröhring <phfrohring@deeplinks.com>
+;;;
+;;; 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 elixir-xyz)
+ #:use-module ((guix licenses)
+ #:prefix license:)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages erlang-xyz)
+ #:use-module (gnu packages linux)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix build-system mix)
+ #:use-module (guix download))
+
+(define-public elixir-nimble-parsec
+ (package
+ (name "elixir-nimble-parsec")
+ (version "1.3.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "0rxiw6jzz77v0j460wmzcprhdgn71g1hrz3mcc6djn7bnb0f70i6"))))
+ (build-system mix-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "Text-based parser combinators")
+ (description
+ "This library provides primitives for efficient parser combinators, allowing
+for higher-level combinators through composition.")
+ (home-page "https://hexdocs.pm/nimble_parsec/")
+ (license license:asl2.0)))
+
+(define-public elixir-makeup
+ (package
+ (name "elixir-makeup")
+ (version "1.1.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "19jpprryixi452jwhws3bbks6ki3wni9kgzah3srg22a3x8fsi8a"))))
+ (build-system mix-build-system)
+ (propagated-inputs (list elixir-nimble-parsec))
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "Syntax highlighter for source code")
+ (description
+ "Makeup is a generic syntax highlighter in the style of Pygments suitable for use in code hosting,
+forums, wikis or other applications that need to prettify source code.")
+ (home-page "https://hexdocs.pm/makeup/")
+ (license license:bsd-2)))
+
+(define-public elixir-telemetry-metrics
+ (package
+ (name "elixir-telemetry-metrics")
+ (version "0.6.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "1iilk2n75kn9i95fdp8mpxvn3rcn3ghln7p77cijqws13j3y1sbv"))))
+ (build-system mix-build-system)
+ ;; There is no test/ in the source.
+ (arguments
+ (list
+ #:tests? #f))
+ (propagated-inputs (list erlang-telemetry))
+ (synopsis
+ "Provides a common interface for defining metrics based on Telemetry events")
+ (description
+ "Common interface for defining metrics based on :telemetry events. Metrics are
+aggregations of Telemetry events with specific name, providing a
+view of the system's behaviour over time.")
+ (home-page "https://hexdocs.pm/telemetry_metrics/")
+ (license license:asl2.0)))
+
+(define-public elixir-jason
+ (package
+ (name "elixir-jason")
+ (version "1.4.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "18d70i31bz11nr6vgsjn5prvhkvwqbyf3xq22ck5cnsnzp6ixc7v"))))
+ (build-system mix-build-system)
+ ;; There is no test/ in the source.
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "JSON parser and generator")
+ (description
+ "Parser and generator are written in pure Elixir and optimized for speed. They
+are at least twice as fast as other Elixir/Erlang libraries (e.g.
+Poison). The performance is comparable to jiffy, which is implemented in C as
+a NIF.")
+ (home-page "https://hexdocs.pm/jason/")
+ (license license:asl2.0)))
+
+(define-public elixir-file-system
+ (package
+ (name "elixir-file-system")
+ (version "0.2.10")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "1p0myxmnjjds8bbg69dd6fvhk8q3n7lb78zd4qvmjajnzgdmw6a1"))))
+ (build-system mix-build-system)
+ (inputs (list inotify-tools))
+ (arguments
+ (list
+ #:tests? #f ;There is no test/ in the source.
+ #:phases #~(modify-phases %standard-phases
+ (add-after 'unpack 'rm-priv
+ (lambda _
+ ;; This directory represents source code not needed on UNIX systems.
+ ;; Since we aim at UNIX systems, it is deleted.
+ (delete-file-recursively "priv"))))))
+ (synopsis "File system change watcher")
+ (description "Provides a file system change watcher wrapper based on
+[fs](https://github.com/synrc/fs).")
+ (home-page "https://hexdocs.pm/file_system/")
+ (license license:wtfpl2)))
+
+(define-public elixir-bunt
+ (package
+ (name "elixir-bunt")
+ (version "0.2.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "19bp6xh052ql3ha0v3r8999cvja5d2p6cph02mxphfaj4jsbyc53"))))
+ (build-system mix-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "256 color ANSI coloring in the terminal")
+ (description "256 color ANSI coloring in the terminal.")
+ (home-page "https://hexdocs.pm/bunt/")
+ (license license:expat)))
+
+(define-public elixir-inch-ex
+ (package
+ (name "elixir-inch-ex")
+ (version "2.0.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "1a4rjcy3hn5pc40si1d1y7qg0b0mnxx6pw825la67ky8r9gfrl4n"))))
+ (build-system mix-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (propagated-inputs (list elixir-bunt elixir-jason))
+ (synopsis
+ "Offers a Mix task for suggestions on enhancing your inline documentation")
+ (description
+ "This package provides a Mix task that gives you hints where to improve your
+inline docs.")
+ (home-page "https://hex.pm/packages/inch_ex")
+ (license license:expat)))
+
+(define-public elixir-castore
+ (package
+ (name "elixir-castore")
+ (version "1.0.4")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "1y44amb8falsmrfzpkmf7qp6215g9kdl76g91dpna4af2jwc264l"))))
+ (build-system mix-build-system)
+ ;; There is no test/ in the source.
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "Up-to-date CA certificate store")
+ (description "Up-to-date CA certificate store.")
+ (home-page "https://hexdocs.pm/castore/")
+ (license license:asl2.0)))
+
+(define-public elixir-excoveralls
+ (package
+ (name "elixir-excoveralls")
+ (version "0.18.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "02x69ll5scvraky0k5gacvnnmldv5k04kgk02x087d9w3y8vn28i"))))
+ (build-system mix-build-system)
+ (propagated-inputs (list elixir-castore elixir-jason))
+ ;; No test/ folder.
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis "Coverage report tool with coveralls.io integration")
+ (description
+ "Library that reports test coverage statistics, with the option to
+post to coveralls.io service. It uses Erlang's cover to generate coverage
+information, and posts the test coverage results to coveralls.io through the
+JSON API.")
+ (home-page "https://hexdocs.pm/excoveralls/")
+ (license license:expat)))
+
+(define-public elixir-credo
+ (package
+ (name "elixir-credo")
+ (version "1.7.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "18jqi9s9r1587njzdxycvmmbma30cay9iamni4f3ih54jmh1r1z9"))))
+ (build-system mix-build-system)
+ (propagated-inputs (list elixir-bunt elixir-file-system elixir-jason))
+ (native-inputs (list elixir-excoveralls elixir-inch-ex))
+ (synopsis "Static code analysis tool")
+ (description
+ "Credo is a static code analysis tool for the Elixir language with a focus on
+teaching and code consistency. Credo can show you refactoring opportunities in
+your code, complex code fragments, warn you about common mistakes, show
+inconsistencies in your naming scheme and - if needed - help you enforce a
+desired coding style.")
+ (home-page "https://hexdocs.pm/credo/")
+ (license license:expat)))
+
+(define-public elixir-erlex
+ (package
+ (name "elixir-erlex")
+ (version "0.2.6")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "0x8c1j62y748ldvlh46sxzv5514rpzm809vxn594vd7y25by5lif"))))
+ (build-system mix-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (synopsis
+ "Convert Erlang style structs and error messages to equivalent Elixir")
+ (description
+ "Converted structs and error messages are useful for pretty printing things
+like Dialyzer errors and Observer .state. NOTE: Because this code calls the
+Elixir formatter, it requires Elixir 1.6+.")
+ (home-page "https://hexdocs.pm/erlex/")
+ (license license:asl2.0)))
+
+(define-public elixir-dialyxir
+ (package
+ (name "elixir-dialyxir")
+ (version "1.4.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "00cqwhd1wabwds44jz94rvvr8z8cp12884d3lp69fqkrszb9bdw4"))))
+ (build-system mix-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (propagated-inputs (list elixir-erlex))
+ (synopsis "Mix tasks to simplify use of Dialyzer")
+ (description
+ "Mix Tasks are usable from the directory of the mix project you want to analyze.")
+ (home-page "https://hexdocs.pm/dialyxir/")
+ (license license:asl2.0)))
+
+(define-public elixir-machete
+ (package
+ (name "elixir-machete")
+ (version "0.2.8")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (hexpm-uri name version))
+ (sha256
+ (base32 "0952603bmqsf6v3ja99zpbnbx5d52i4xksjkfj3irl45ccq5pgq9"))))
+ (build-system mix-build-system)
+ (native-inputs (list elixir-credo elixir-dialyxir))
+ (synopsis "Literate test matchers for ExUnit")
+ (description
+ "Machete provides ergonomic match operators that act as building blocks to let
+you define test expectations that can match data against any combination of
+literals, variables, or parametrically defined matchers.")
+ (home-page "https://hexdocs.pm/machete/")
+ (license license:expat)))
+
+;;;
+;;; Avoid adding new packages to the end of this file. To reduce the chances
+;;; of a merge conflict, place them above by existing packages with similar
+;;; functionality or similar names.
+;;;
diff --git a/gnu/packages/elixir.scm b/gnu/packages/elixir.scm
index 724b4251..d1ac1d07 100644
--- a/gnu/packages/elixir.scm
+++ b/gnu/packages/elixir.scm
@@ -7,6 +7,7 @@
;;; Copyright © 2018 Nikita <nikita@n0.is>
;;; Copyright © 2021 Oskar Köök <oskar@maatriks.ee>
;;; Copyright © 2021 Cees de Groot <cg@evrl.com>
+;;; Copyright © 2023 Pierre-Henry Fröhring <phfrohring@deeplinks.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -24,14 +25,21 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages elixir)
- #:use-module ((guix licenses) #:prefix license:)
+ #:use-module ((guix licenses)
+ #:prefix license:)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages erlang)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages)
+ #:use-module (guix build utils)
+ #:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
+ #:use-module (guix download)
#:use-module (guix gexp)
#:use-module (guix git-download)
#:use-module (guix packages)
- #:use-module (gnu packages)
- #:use-module (gnu packages erlang)
- #:use-module (gnu packages version-control))
+ #:use-module (guix search-paths)
+ #:use-module (guix utils))
(define-public elixir
(package
@@ -52,57 +60,109 @@ (define-public elixir
(list
#:test-target "test"
#:parallel-tests? #f ;see <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32171#23>
- #:make-flags #~(list (string-append "PREFIX=" #$output))
- #:phases
- #~(modify-phases %standard-phases
- (add-after 'unpack 'make-git-checkout-writable
- (lambda _
- (for-each make-file-writable (find-files "."))))
- (add-after 'make-git-checkout-writable 'replace-paths
- (lambda* (#:key inputs #:allow-other-keys)
- ;; Note: references end up obfuscated in binary BEAM files where
- ;; they may be invisible to the GC and graft code:
- ;; <https://issues.guix.gnu.org/54304#11>.
- (substitute* '("lib/mix/lib/mix/release.ex"
- "lib/mix/lib/mix/tasks/release.init.ex")
- (("#!/bin/sh")
- (string-append "#!" (search-input-file inputs "/bin/sh"))))
- (substitute* "bin/elixir"
- (("ERTS_BIN=\n")
- (string-append
- "ERTS_BIN="
- ;; Elixir Releases will prepend to ERTS_BIN the path of
- ;; a copy of erl. We detect if a release is being generated
- ;; by checking the initial ERTS_BIN value: if it's empty, we
- ;; are not in release mode and can point to the actual erl
- ;; binary in Guix store.
- "\nif [ -z \"$ERTS_BIN\" ]; then ERTS_BIN="
- (string-drop-right (search-input-file inputs "/bin/erl") 3)
- "; fi\n")))
- (substitute* "bin/mix"
- (("#!/usr/bin/env elixir")
- (string-append "#!" #$output "/bin/elixir")))))
- (add-before 'build 'make-current
- ;; The Elixir compiler checks whether or not to compile files by
- ;; inspecting their timestamps. When the timestamp is equal to the
- ;; epoch no compilation will be performed. Some tests fail when
- ;; files are older than Jan 1, 2000.
- (lambda _
- (for-each (lambda (file)
- (let ((recent 1400000000))
- (utime file recent recent 0 0)))
- (find-files "." ".*"))))
- (add-before 'check 'set-home
- (lambda* (#:key inputs #:allow-other-keys)
- ;; Some tests require access to a home directory.
- (setenv "HOME" "/tmp")))
- (delete 'configure))))
- (inputs
- (list erlang git))
+ #:make-flags #~(list (string-append "PREFIX="
+ #$output))
+ #:phases #~(modify-phases %standard-phases
+ (add-after 'unpack 'make-git-checkout-writable
+ (lambda _
+ (for-each make-file-writable
+ (find-files "."))))
+ (add-after 'make-git-checkout-writable 'replace-paths
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Note: references end up obfuscated in binary BEAM files where
+ ;; they may be invisible to the GC and graft code:
+ ;; <https://issues.guix.gnu.org/54304#11>.
+ (substitute* '("lib/mix/lib/mix/release.ex"
+ "lib/mix/lib/mix/tasks/release.init.ex")
+ (("#!/bin/sh")
+ (string-append "#!"
+ (search-input-file inputs "/bin/sh"))))
+ (substitute* "bin/elixir"
+ (("ERTS_BIN=\n")
+ (string-append "ERTS_BIN="
+ ;; Elixir Releases will prepend to ERTS_BIN the path of
+ ;; a copy of erl. We detect if a release is being generated
+ ;; by checking the initial ERTS_BIN value: if it's empty, we
+ ;; are not in release mode and can point to the actual erl
+ ;; binary in Guix store.
+ "\nif [ -z \"$ERTS_BIN\" ]; then ERTS_BIN="
+ (string-drop-right (search-input-file inputs
+ "/bin/erl") 3)
+ "; fi\n")))
+ (substitute* "bin/mix"
+ (("#!/usr/bin/env elixir")
+ (string-append "#!"
+ #$output "/bin/elixir")))))
+ (add-before 'build 'make-current
+ ;; The Elixir compiler checks whether or not to compile files by
+ ;; inspecting their timestamps. When the timestamp is equal to the
+ ;; epoch no compilation will be performed. Some tests fail when
+ ;; files are older than Jan 1, 2000.
+ (lambda _
+ (for-each (lambda (file)
+ (let ((recent 1400000000))
+ (utime file recent recent 0 0)))
+ (find-files "." ".*"))))
+ (add-before 'check 'set-home
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Some tests require access to a home directory.
+ (setenv "HOME" "/tmp")))
+ (delete 'configure)
+ (add-aft
This message was truncated. Download the full message here.