From: Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
To: guix-devel <guix-devel@gnu.org>
Subject: [PATCH]: Add IcedTea 6
Date: Tue, 27 Jan 2015 16:33:04 +0100 [thread overview]
Message-ID: <idj1tmg8ci7.fsf@bimsb-sys02.mdc-berlin.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 1897 bytes --]
Hi Guix,
attached is a patch that gives us the liberated OpenJDK in the form of
IcedTea (version 6). IcedTea 6 is built with GCJ. Unfortunately, it
needs Ant, which cannot be built with GCJ, so it depends on a binary
bootstrap Ant.
There are a couple of issues with this patch set that I'm aware of:
* IcedTea 6 is built without JavaScript support as this would require
Rhino.
* I'm not happy with replacing the unpack phase and I don't like to
refer to the OpenJDK source tarball by its full name
"openjdk-6-src-b34-20_jan_2015.tar.xz". Is there a way around this?
* The test suite has been disabled. I have been able to fix most issues
relating to the build environment (mostly hardcoded paths and
corrupted PATH variable), but even then many tests fail. One group of
tests depends on a shell wrapper around Xvfb, which is currently not
part of the xorg-server package. A considerable number of tests fails
upstream (see http://builder.classpath.org/icedtea/icedtea6/test/ for
logs).
* All this patching of tests is really not pretty. I'm not sure if
there's a better or more concise way to achieve this. I also don't
know which of these steps should better be implemented as snippets.
* The patch to
openjdk/jdk/src/share/classes/java/util/CurrencyData.properties
really should be implemented upstream.
* the make check-* targets do not return a non-zero status code upon
failure. This doesn't affect us now because tests are disabled
anyway, but using (and (zero? ...)) is just wishful thinking.
* the synopsis tells us about IcedTea (the build harness), but actually
what we get after the build is a liberated OpenJDK. The same problem
affects the description, which probably should describe the purpose of
OpenJDK instead.
I would be happy to receive comments on the above issues (or others that
you find with the patch).
~~ Ricardo
[-- Attachment #2: 0001-gnu-Add-IcedTea-6.patch --]
[-- Type: text/x-patch, Size: 20724 bytes --]
From 13490591fe7ad774e8ec95626113138d828366fb Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
Date: Tue, 23 Dec 2014 12:32:25 +0100
Subject: [PATCH] gnu: Add IcedTea 6
* gnu/packages/java.scm: New file.
* gnu-system.am (GNU_SYSTEM_MODULES): Add it.
---
gnu-system.am | 1 +
gnu/packages/java.scm | 407 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 408 insertions(+)
create mode 100644 gnu/packages/java.scm
diff --git a/gnu-system.am b/gnu-system.am
index 5fc42ba..6e6e221 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -147,6 +147,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/inkscape.scm \
gnu/packages/irssi.scm \
gnu/packages/iso-codes.scm \
+ gnu/packages/java.scm \
gnu/packages/jrnl.scm \
gnu/packages/kde.scm \
gnu/packages/ld-wrapper.scm \
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
new file mode 100644
index 0000000..f0ac63e
--- /dev/null
+++ b/gnu/packages/java.scm
@@ -0,0 +1,407 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; 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 java)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages attr)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages cpio)
+ #:use-module (gnu packages cups)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages fontutils)
+ #:use-module (gnu packages gawk)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages gnuzilla) ;nss
+ #:use-module (gnu packages ghostscript) ;lcms
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages image)
+ #:use-module (gnu packages linux) ;alsa
+ #:use-module (gnu packages wget)
+ #:use-module (gnu packages which)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages perl)
+ #:use-module (gnu packages mit-krb5)
+ #:use-module (gnu packages xml)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages zip)
+ #:use-module (gnu packages texinfo))
+
+(define-public icedtea6
+ (package
+ (name "icedtea6")
+ (version "1.13.6")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "http://icedtea.wildebeest.org/download/source/icedtea6-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "16ac3f7kkln5skg202vllagkhjxrwd47h56diwzhfidhwjlz7410"))))
+ (build-system gnu-build-system)
+ (arguments
+ `(;; There are many failing tests.
+ ;;
+ ;; * Hotspot VM tests:
+ ;; FAILED: compiler/7082949/Test7082949.java
+ ;; FAILED: compiler/7088020/Test7088020.java
+ ;; FAILED: runtime/6929067/Test6929067.sh
+ ;; FAILED: serviceability/sa/jmap-hashcode/Test8028623.java
+ ;; => Test results: passed: 161; failed: 4
+ ;;
+ ;; * langtools tests:
+ ;; FAILED: com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java
+ ;; FAILED: tools/javac/6627362/T6627362.java
+ ;; FAILED: tools/javac/7003595/T7003595.java
+ ;; FAILED: tools/javac/7024568/T7024568.java
+ ;; FAILED: tools/javap/4111861/T4111861.java
+ ;; FAILED: tools/javap/ListTest.java
+ ;; FAILED: tools/javap/OptionTest.java
+ ;; FAILED: tools/javap/T4884240.java
+ ;; FAILED: tools/javap/T4975569.java
+ ;; --> fails because of insignificant whitespace differences
+ ;; in output of javap
+ ;; FAILED: tools/javap/T6868539.java
+ ;; => Test results: passed: 1,445; failed: 10
+ ;;
+ ;; * JDK tests:
+ ;; Tests are incomplete because of a segfault after this test:
+ ;; javax/crypto/spec/RC5ParameterSpec/RC5ParameterSpecEquals.java
+ ;; A bug report has already been filed upstream:
+ ;; http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2188
+ ;;
+ ;; The tests require xvfb-run, a wrapper script around Xvfb, which
+ ;; has not been packaged yet. Without it many AWT tests fail, so I
+ ;; made no attempts to make a list of failing JDK tests. At least
+ ;; 222 tests are failing of which at least 132 are AWT tests.
+ #:tests? #f
+ #:configure-flags
+ (let* ((gcjdir (assoc-ref %build-inputs "gcj"))
+ (ecj (string-append gcjdir "/share/java/ecj.jar"))
+ (jdk (string-append gcjdir "/lib/jvm/"))
+ (gcj (string-append gcjdir "/bin/gcj")))
+ `("--enable-bootstrap"
+ "--enable-nss"
+ "--without-rhino"
+ "--disable-downloading"
+ "--disable-tests" ;they are run in the check phase instead
+ ,(string-append "--with-openjdk-src-dir=" "./openjdk")
+ ,(string-append "--with-javac=" jdk "/bin/javac")
+ ,(string-append "--with-ecj-jar=" ecj)
+ ,(string-append "--with-gcj=" gcj)
+ ,(string-append "--with-jdk-home=" jdk)
+ ,(string-append "--with-java=" jdk "/bin/java")))
+ #:phases
+ (alist-replace
+ 'unpack
+ (lambda* (#:key source inputs #:allow-other-keys)
+ (let ((target (string-append ,name "-" ,version)))
+ (and (zero? (system* "tar" "xvf" source))
+ (zero? (system* "tar" "xvjf" (assoc-ref inputs "ant-bootstrap")))
+ (chdir target))
+ (mkdir "openjdk")
+ (with-directory-excursion "openjdk"
+ (copy-file (assoc-ref inputs "openjdk6-src")
+ "openjdk-6-src-b34-20_jan_2015.tar.xz")
+ (system* "tar" "xvf" "openjdk-6-src-b34-20_jan_2015.tar.xz"))))
+ (alist-cons-after
+ 'unpack 'patch-paths
+ (lambda _
+ (patch-shebang "../apache-ant-1.9.4/bin/ant")
+
+ (substitute* "Makefile.in"
+ ;; link against libgcj to avoid linker error
+ (("-o native-ecj")
+ "-lgcj -o native-ecj")
+ ;; do not leak information about the build host
+ (("DISTRIBUTION_ID=\"\\$\\(DIST_ID\\)\"")
+ "DISTRIBUTION_ID=\"\\\"guix\\\"\""))
+
+ ;; shebang in patches so that they apply cleanly
+ (substitute* '("patches/jtreg-jrunscript.patch"
+ "patches/hotspot/hs23/drop_unlicensed_test.patch")
+ (("#!/bin/sh") (string-append "#!" (which "sh"))))
+
+ ;; fix path to alsa header in patch
+ (substitute* "patches/openjdk/6799141-split_out_versions.patch"
+ (("ALSA_INCLUDE=/usr/include/alsa/version.h")
+ (string-append "ALSA_INCLUDE="
+ (assoc-ref %build-inputs "alsa-lib")
+ "/include/alsa/version.h")))
+
+ ;; buildtree.make generates shell scripts, so we need to replace
+ ;; the generated shebang
+ (substitute* '("openjdk/hotspot/make/linux/makefiles/buildtree.make")
+ (("/bin/sh") (which "bash")))
+
+ (let ((corebin (string-append
+ (assoc-ref %build-inputs "coreutils") "/bin/"))
+ (binbin (string-append
+ (assoc-ref %build-inputs "binutils") "/bin/"))
+ (grepbin (string-append
+ (assoc-ref %build-inputs "grep") "/bin/")))
+ (substitute* '("openjdk/jdk/make/common/shared/Defs-linux.gmk"
+ "openjdk/corba/make/common/shared/Defs-linux.gmk")
+ (("UNIXCOMMAND_PATH = /bin/")
+ (string-append "UNIXCOMMAND_PATH = " corebin))
+ (("USRBIN_PATH = /usr/bin/")
+ (string-append "USRBIN_PATH = " corebin))
+ (("DEVTOOLS_PATH *= */usr/bin/")
+ (string-append "DEVTOOLS_PATH = " corebin))
+ (("COMPILER_PATH *= */usr/bin/")
+ (string-append "COMPILER_PATH = "
+ (assoc-ref %build-inputs "gcc") "/bin/")))
+
+ ;; fix hard-coded utility paths
+ (substitute* '("openjdk/jdk/make/common/shared/Defs-utils.gmk"
+ "openjdk/corba/make/common/shared/Defs-utils.gmk")
+ (("ECHO *=.*echo")
+ (string-append "ECHO = " (which "echo")))
+ (("^GREP *=.*grep")
+ (string-append "GREP = " (which "grep")))
+ (("EGREP *=.*egrep")
+ (string-append "EGREP = " (which "egrep")))
+ (("CPIO *=.*cpio")
+ (string-append "CPIO = " (which "cpio")))
+ (("READELF *=.*readelf")
+ (string-append "READELF = " (which "readelf")))
+ (("^ *AR *=.*ar")
+ (string-append "AR = " (which "ar")))
+ (("^ *TAR *=.*tar")
+ (string-append "TAR = " (which "tar")))
+ (("AS *=.*as")
+ (string-append "AS = " (which "as")))
+ (("LD *=.*ld")
+ (string-append "LD = " (which "ld")))
+ (("STRIP *=.*strip")
+ (string-append "STRIP = " (which "strip")))
+ (("NM *=.*nm")
+ (string-append "NM = " (which "nm")))
+ (("^SH *=.*sh")
+ (string-append "SH = " (which "bash")))
+ (("^FIND *=.*find")
+ (string-append "FIND = " (which "find")))
+ (("LDD *=.*ldd")
+ (string-append "LDD = " (which "ldd")))
+ (("NAWK *=.*nawk")
+ (string-append "NAWK = " (which "gawk")))
+ (("NAWK *=.*gawk")
+ (string-append "NAWK = " (which "gawk")))
+ (("XARGS *=.*xargs")
+ (string-append "XARGS = " (which "xargs")))
+ (("UNZIP *=.*unzip")
+ (string-append "UNZIP = " (which "unzip")))
+ (("ZIPEXE *=.*zip")
+ (string-append "ZIPEXE = " (which "zip")))
+ (("SED *=.*sed")
+ (string-append "SED = " (which "sed"))))
+
+ ;; Some of these timestamps cause problems as they are more than
+ ;; 10 years ago, failing the build process.
+ (substitute*
+ "openjdk/jdk/src/share/classes/java/util/CurrencyData.properties"
+ (("AZ=AZM;2005-12-31-20-00-00;AZN") "AZ=AZN")
+ (("MZ=MZM;2006-06-30-22-00-00;MZN") "MZ=MZN")
+ (("RO=ROL;2005-06-30-21-00-00;RON") "RO=RON")
+ (("TR=TRL;2004-12-31-22-00-00;TRY") "TR=TRY"))))
+ (alist-cons-before
+ 'configure 'set-paths
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((gcjdir (assoc-ref %build-inputs "gcj"))
+ (gcjlib (string-append gcjdir "/lib"))
+ (antpath (string-append (getcwd) "/../apache-ant-1.9.4")))
+ (setenv "CC" (which "gcc"))
+ (setenv "CPATH"
+ (string-append (assoc-ref %build-inputs "libxrender")
+ "/include/X11/extensions" ":"
+ (assoc-ref %build-inputs "libxtst")
+ "/include/X11/extensions" ":"
+ (assoc-ref %build-inputs "libxinerama")
+ "/include/X11/extensions" ":"
+ (or (getenv "CPATH") "")))
+ (setenv "ALT_CUPS_HEADERS_PATH"
+ (string-append (assoc-ref %build-inputs "cups")
+ "/include"))
+ (setenv "ALT_FREETYPE_HEADERS_PATH"
+ (string-append (assoc-ref %build-inputs "freetype")
+ "/include"))
+ (setenv "ALT_FREETYPE_LIB_PATH"
+ (string-append (assoc-ref %build-inputs "freetype")
+ "/lib"))
+ (setenv "LD_LIBRARY_PATH"
+ (string-append antpath "/lib" ":" gcjlib))
+ (setenv "PATH" (string-append antpath "/bin:"
+ (getenv "PATH")))))
+ (alist-cons-before
+ 'check 'fix-tests
+ (lambda _
+ ;; Fix PATH in test environment
+ (substitute* "src/jtreg/com/sun/javatest/regtest/Main.java"
+ (("PATH=/bin:/usr/bin")
+ (string-append "PATH=" (getenv "PATH"))))
+ (substitute* "src/jtreg/com/sun/javatest/util/SysEnv.java"
+ (("/usr/bin/env") (which "env")))
+
+ ;; Hotspot tests
+ (with-directory-excursion "openjdk/hotspot/test/"
+ (substitute* "jprt.config"
+ (("PATH=\"\\$\\{path4sdk\\}\"")
+ (string-append "PATH=" (getenv "PATH")))
+ (("make=/usr/bin/make")
+ (string-append "make=" (which "make"))))
+ (substitute* '("runtime/6626217/Test6626217.sh"
+ "runtime/7110720/Test7110720.sh")
+ (("/bin/rm") (which "rm"))
+ (("/bin/cp") (which "cp"))
+ (("/bin/mv") (which "mv"))))
+
+ ;; JDK tests
+ (with-directory-excursion "openjdk/jdk/test/"
+ (substitute* "com/sun/jdi/JdbReadTwiceTest.sh"
+ (("/bin/pwd") (which "pwd")))
+ (substitute* "com/sun/jdi/ShellScaffold.sh"
+ (("/bin/kill") (which "kill")))
+ (substitute* "start-Xvfb.sh"
+ (("/usr/bin/X11/Xvfb") (which "Xvfb"))
+ (("/usr/bin/nohup") (which "nohup")))
+ (substitute* "javax/security/auth/Subject/doAs/Test.sh"
+ (("/bin/rm") (which "rm")))
+ (substitute* "tools/launcher/MultipleJRE.sh"
+ (("echo \"#!/bin/sh\"")
+ (string-append "echo \"#!" (which "rm") "\""))
+ (("/usr/bin/zip") (which "zip")))
+ (substitute* "com/sun/jdi/OnThrowTest.java"
+ (("#!/bin/sh") (string-append "#!" (which "sh"))))
+ (substitute* "java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java"
+ (("/usr/bin/uptime") (which "uptime")))
+ (substitute* "java/lang/ProcessBuilder/Basic.java"
+ (("/usr/bin/env") (which "env"))
+ (("/bin/false") (which "false"))
+ (("/bin/true") (which "true"))
+ (("/bin/cp") (which "cp"))
+ (("/bin/sh") (which "sh")))
+ (substitute* "java/lang/ProcessBuilder/FeelingLucky.java"
+ (("/bin/sh") (which "sh")))
+ (substitute* "java/lang/ProcessBuilder/Zombies.java"
+ (("/usr/bin/perl") (which "perl"))
+ (("/bin/ps") (which "ps"))
+ (("/bin/true") (which "true")))
+ (substitute* "java/lang/Runtime/exec/ConcurrentRead.java"
+ (("/usr/bin/tee") (which "tee")))
+ (substitute* "java/lang/Runtime/exec/ExecWithDir.java"
+ (("/bin/true") (which "true")))
+ (substitute* "java/lang/Runtime/exec/ExecWithInput.java"
+ (("/bin/cat") (which "cat")))
+ (substitute* "java/lang/Runtime/exec/ExitValue.java"
+ (("/bin/sh") (which "sh"))
+ (("/bin/true") (which "true"))
+ (("/bin/kill") (which "kill")))
+ (substitute* "java/lang/Runtime/exec/LotsOfDestroys.java"
+ (("/usr/bin/echo") (which "echo")))
+ (substitute* "java/lang/Runtime/exec/LotsOfOutput.java"
+ (("/usr/bin/cat") (which "cat")))
+ (substitute* "java/lang/Runtime/exec/SleepyCat.java"
+ (("/bin/cat") (which "cat"))
+ (("/bin/sleep") (which "sleep"))
+ (("/bin/sh") (which "sh")))
+ (substitute* "java/lang/Runtime/exec/StreamsSurviveDestroy.java"
+ (("/bin/cat") (which "cat")))
+ (substitute* "java/rmi/activation/CommandEnvironment/SetChildEnv.java"
+ (("/bin/chmod") (which "chmod")))
+ (substitute* "java/util/zip/ZipFile/Assortment.java"
+ (("/bin/sh") (which "sh")))))
+ (alist-replace
+ 'check
+ (lambda _
+ (and (zero? (system* "make" "check-hotspot"))
+ (zero? (system* "make" "check-langtools"))
+ (zero? (system* "make" "check-jdk"))))
+ (alist-replace
+ 'install
+ (lambda _
+ (copy-recursively "openjdk.build" %output))
+ %standard-phases))))))))
+ (native-inputs
+ `(("ant-bootstrap"
+ ,(origin
+ (method url-fetch)
+ (uri "https://www.apache.org/dist/ant/binaries/apache-ant-1.9.4-bin.tar.bz2")
+ (sha256
+ (base32
+ "1kw801p8h5x4f0g8i5yknppssrj5a3xy1aqrkpfnk22bd1snbh90"))))
+ ("alsa-lib" ,alsa-lib)
+ ("attr" ,attr)
+ ("autoconf" ,autoconf)
+ ("automake" ,automake)
+ ("coreutils" ,coreutils)
+ ("diffutils" ,diffutils) ;for tests
+ ("gawk" ,gawk)
+ ("grep" ,grep)
+ ("libtool" ,libtool)
+ ("pkg-config" ,pkg-config)
+ ("cups" ,cups)
+ ("wget" ,wget)
+ ("which" ,which)
+ ("cpio" ,cpio)
+ ("zip" ,zip)
+ ("unzip" ,unzip)
+ ("fastjar" ,fastjar)
+ ("libxslt" ,libxslt) ;for xsltproc
+ ("mit-krb5" ,mit-krb5)
+ ("nss" ,nss)
+ ("libx11" ,libx11)
+ ("libxt" ,libxt)
+ ("libxtst" ,libxtst)
+ ("libxi" ,libxi)
+ ("libxinerama" ,libxinerama)
+ ("libxrender" ,libxrender)
+ ("libjpeg" ,libjpeg)
+ ("libpng" ,libpng)
+ ("giflib" ,giflib)
+ ("perl" ,perl)
+ ("procps" ,procps) ;for "free", even though I'm not sure we should use it
+ ("openjdk6-src"
+ ,(origin
+ (method url-fetch)
+ (uri "https://java.net/downloads/openjdk6/openjdk-6-src-b34-20_jan_2015.tar.xz")
+ (sha256
+ (base32
+ "0lafxvi255r22pjljkj9x6liacqdgin8smdmh6nzkdjjw7hv9l8k"))))
+ ("lcms" ,lcms)
+ ("zlib" ,zlib)
+ ("gtk" ,gtk+-2)
+ ("fontconfig" ,fontconfig)
+ ("freetype" ,freetype)
+ ("gcj" ,gcj-4.8)))
+ (home-page "http://icedtea.classpath.org")
+ (synopsis "A harness to build OpenJDK using Free Software build tools")
+ (description
+ "The IcedTea project provides a harness to build the source code from
+http://openjdk.java.net using Free Software build tools along with additional
+features such as a Free Software plugin and web start implementation and an
+LLVM-based JIT.")
+ ;; IcedTea is released under the GPL2 + Classpath exception, which is the
+ ;; same license as both GNU Classpath and OpenJDK.
+ (license license:gpl2+)))
--
1.9.3
next reply other threads:[~2015-01-27 15:33 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-27 15:33 Ricardo Wurmus [this message]
2015-01-27 21:55 ` [PATCH]: Add IcedTea 6 Ludovic Courtès
2015-01-28 15:47 ` Ricardo Wurmus
2015-01-28 16:13 ` Ludovic Courtès
2015-01-29 9:47 ` Ricardo Wurmus
2015-01-29 22:44 ` Andreas Enge
2015-02-15 12:52 ` Andreas Enge
2015-02-15 13:54 ` Ricardo Wurmus
2015-02-15 14:44 ` Andreas Enge
2015-02-15 15:57 ` Ricardo Wurmus
2015-02-15 16:05 ` Andreas Enge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=idj1tmg8ci7.fsf@bimsb-sys02.mdc-berlin.net \
--to=ricardo.wurmus@mdc-berlin.de \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.