* QtCreator Packaging
@ 2018-10-11 2:58 Brett Gilio
2018-10-11 7:11 ` Mikhail Kryshen
2018-10-11 8:41 ` Thorsten Wilms
0 siblings, 2 replies; 3+ messages in thread
From: Brett Gilio @ 2018-10-11 2:58 UTC (permalink / raw)
To: guix-devel
Hi all,
I am beginning my attempt to package QtCreator. My approach, thus
far,
has been to look over the build documentation for the project in
question, and then incrementally change the Scheme definition for
the
package. Usually, this works out pretty well, but here I am
running into
a configuring error that I am not sure how to make sense of
because (as
far as I can see) it is not reporting an error.
Here is the current package definition:
http://ix.io/1oTH
Here is the kill ring for the build:
http://ix.io/1oTJ
--
Brett M. Gilio
Free Software Foundation, Member
https://gnu.org/s/guix/ | https://emacs.org
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: QtCreator Packaging
2018-10-11 2:58 QtCreator Packaging Brett Gilio
@ 2018-10-11 7:11 ` Mikhail Kryshen
2018-10-11 8:41 ` Thorsten Wilms
1 sibling, 0 replies; 3+ messages in thread
From: Mikhail Kryshen @ 2018-10-11 7:11 UTC (permalink / raw)
To: Brett Gilio, guix-devel
[-- Attachment #1.1: Type: text/plain, Size: 1185 bytes --]
QtCreator does not have ./configure, you need to modify the configure
phase to invoke qmake.
I have already packaged QtCreator (we use it at university for a couple
of courses), but haven't yet prepared proper patches for inclusion in
Guix. See the attachment.
It uses monolithic qt package instead of modular qtbase etc. I modified
the qt package to enable qdoc (requires clang) and building of the
documentation.
Brett Gilio <brettg@posteo.net> writes:
> Hi all,
>
> I am beginning my attempt to package QtCreator. My approach, thus
> far,
> has been to look over the build documentation for the project in
> question, and then incrementally change the Scheme definition for
> the
> package. Usually, this works out pretty well, but here I am
> running into
> a configuring error that I am not sure how to make sense of
> because (as
> far as I can see) it is not reporting an error.
>
> Here is the current package definition:
> http://ix.io/1oTH
>
> Here is the kill ring for the build:
> http://ix.io/1oTJ
>
>
> --
> Brett M. Gilio
> Free Software Foundation, Member
> https://gnu.org/s/guix/ | https://emacs.org
>
--
Mikhail
[-- Attachment #1.2: qt.scm --]
[-- Type: text/plain, Size: 20253 bytes --]
(define-module (petrsu packages qt)
#:use-module (guix build-system gnu)
#:use-module (guix build-system trivial)
#:use-module (guix download)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (guix search-paths)
#:use-module (gnu packages llvm)
#:use-module ((gnu packages qt) #:prefix gnu:)
#:use-module (gnu packages base)
#:use-module (gnu packages commencement)
;; qt
#:use-module (gnu packages bison)
#:use-module (gnu packages compression)
#:use-module (gnu packages cups)
#:use-module (gnu packages databases)
#:use-module (gnu packages documentation)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages flex)
#:use-module (gnu packages freedesktop)
#:use-module (gnu packages gl)
#:use-module (gnu packages glib)
#:use-module (gnu packages gnuzilla)
#:use-module (gnu packages gperf)
#:use-module (gnu packages gstreamer)
#:use-module (gnu packages gtk)
#:use-module (gnu packages icu4c)
#:use-module (gnu packages image)
#:use-module (gnu packages linux)
#:use-module (gnu packages maths)
#:use-module (gnu packages pciutils)
#:use-module (gnu packages pcre)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages pulseaudio)
#:use-module (gnu packages python)
#:use-module (gnu packages ruby)
#:use-module (gnu packages sdl)
#:use-module (gnu packages tls)
#:use-module (gnu packages xdisorg)
#:use-module (gnu packages xorg)
#:use-module (gnu packages xml))
;; Модифицированный пакет из (gnu packages qt) c добавлением clang для
;; сборки qdoc и генерирования документации. Копия кода вместо
;; наследования, т. к. планирую отправить патч.
(define-public qt
(package
(name "qt")
(version "5.11.1")
(outputs '("out" "examples" "doc"))
(source (origin
(method url-fetch)
(uri
(string-append
"http://download.qt.io/official_releases/qt/"
(version-major+minor version)
"/" version
"/single/qt-everywhere-src-"
version ".tar.xz"))
(sha256
(base32
"0azva1wx298jh0xskymz8jic83yhxs1xfxf321wqd5lwiyq2qq1r"))
(modules '((guix build utils)))
(snippet
'(begin
;; Remove qtwebengine, which relies on a bundled copy of
;; chromium. Not only does it fail compilation in qt 5.5:
;; 3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc:362:10:
;; error: cannot convert ‘bool’ to ‘boolean’ in return
;; it might also pose security problems.
;; Alternatively, we could use the "-skip qtwebengine"
;; configuration option.
(delete-file-recursively "qtwebengine")
;; The following snippets are copied from their mondular-qt counterparts.
(for-each
(lambda (dir)
(delete-file-recursively (string-append "qtbase/src/3rdparty/" dir)))
(list "double-conversion" "freetype" "harfbuzz-ng"
"libpng" "libjpeg" "pcre2" "xcb"
"xkbcommon" "zlib"))
(for-each
(lambda (dir)
(delete-file-recursively dir))
(list "qtimageformats/src/3rdparty"
"qtmultimedia/examples/multimedia/spectrum/3rdparty"
"qtwayland/examples"
"qtscxml/tests/3rdparty"
"qtcanvas3d/examples/canvas3d/3rdparty"))
;; Tests depend on this example, which depends on the 3rd party code.
(substitute* "qtmultimedia/examples/multimedia/multimedia.pro"
(("spectrum") "#"))
(substitute* "qtxmlpatterns/tests/auto/auto.pro"
(("qxmlquery") "# qxmlquery")
(("xmlpatterns ") "# xmlpatterns"))
(substitute* "qtwebglplugin/tests/plugins/platforms/platforms.pro"
(("webgl") "# webgl"))
(substitute* "qtscxml/tests/auto/auto.pro"
(("scion") "#"))
(substitute* "qtnetworkauth/tests/auto/auto.pro"
(("oauth1 ") "# oauth1 "))
(substitute* "qtremoteobjects/tests/auto/qml/qml.pro"
(("integration") "# integration")
(("usertypes") "# usertypes"))
#t))))
(build-system gnu-build-system)
(propagated-inputs
`(("mesa" ,mesa)))
(inputs
`(("alsa-lib" ,alsa-lib)
("bluez" ,bluez)
("cups" ,cups)
("dbus" ,dbus)
("double-conversion" ,double-conversion)
("expat" ,expat)
("fontconfig" ,fontconfig)
("freetype" ,freetype)
("glib" ,glib)
("gstreamer" ,gstreamer)
("gst-plugins-base" ,gst-plugins-base)
("harfbuzz" ,harfbuzz)
("icu4c" ,icu4c)
("jasper" ,jasper)
("libinput" ,libinput-minimal)
("libjpeg" ,libjpeg)
("libmng" ,libmng)
("libpci" ,pciutils)
("libpng" ,libpng)
("libtiff" ,libtiff)
("libwebp" ,libwebp)
("libx11" ,libx11)
("libxcomposite" ,libxcomposite)
("libxcursor" ,libxcursor)
("libxext" ,libxext)
("libxfixes" ,libxfixes)
("libxi" ,libxi)
("libxinerama" ,libxinerama)
("libxkbcommon" ,libxkbcommon)
("libxml2" ,libxml2)
("libxrandr" ,libxrandr)
("libxrender" ,libxrender)
("libxslt" ,libxslt)
("libxtst" ,libxtst)
("mtdev" ,mtdev)
("mariadb" ,mariadb)
("nss" ,nss)
("openssl" ,openssl)
("postgresql" ,postgresql)
("pulseaudio" ,pulseaudio)
("pcre2" ,pcre2)
;("sqlite" ,sqlite)
("udev" ,eudev)
("unixodbc" ,unixodbc)
("wayland" ,wayland)
("xcb-util" ,xcb-util)
("xcb-util-image" ,xcb-util-image)
("xcb-util-keysyms" ,xcb-util-keysyms)
("xcb-util-renderutil" ,xcb-util-renderutil)
("xcb-util-wm" ,xcb-util-wm)
("zlib" ,zlib)
;; Required for QDoc
("clang" ,clang)))
(native-inputs
`(("bison" ,bison)
("flex" ,flex)
("gperf" ,gperf)
("perl" ,perl)
("pkg-config" ,pkg-config)
("python" ,python-2)
("ruby" ,ruby)
("which" ,(@ (gnu packages base) which))))
(arguments
`(;;#:parallel-build? #f ; Triggers race condition in qtbase module on Hydra.
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'set-environment
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((clang (assoc-ref inputs "clang")))
(setenv "LLVM_INSTALL_DIR" clang))
#t))
(add-after 'configure 'patch-bin-sh
(lambda _
(substitute* '("qtbase/configure"
"qtbase/mkspecs/features/qt_functions.prf"
"qtbase/qmake/library/qmakebuiltins.cpp")
(("/bin/sh") (which "sh")))
#t))
(replace 'configure
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out"))
(examples (assoc-ref outputs "examples"))
(doc (assoc-ref outputs "doc")))
(substitute* '("configure" "qtbase/configure")
(("/bin/pwd") (which "pwd")))
(substitute* "qtbase/src/corelib/global/global.pri"
(("/bin/ls") (which "ls")))
;; do not pass "--enable-fast-install", which makes the
;; configure process fail
(zero? (system*
"./configure"
"-verbose"
"-prefix" out
"-docdir" (string-append doc "/share/doc/qt5")
"-headerdir" (string-append out "/include/qt5")
"-archdatadir" (string-append out "/lib/qt5")
"-datadir" (string-append out "/share/qt5")
"-examplesdir" (string-append
examples "/share/doc/qt5/examples") ; 151MiB
"-opensource"
"-confirm-license"
;; These features require higher versions of Linux than the
;; minimum version of the glibc. See
;; src/corelib/global/minimum-linux_p.h. By disabling these
;; features Qt5 applications can be used on the oldest
;; kernels that the glibc supports, including the RHEL6
;; (2.6.32) and RHEL7 (3.10) kernels.
"-no-feature-getentropy" ; requires Linux 3.17
"-no-feature-renameat2" ; requires Linux 3.16
;; Do not build examples; for the time being, we
;; prefer to save the space and build time.
"-no-compile-examples"
;; Most "-system-..." are automatic, but some use
;; the bundled copy by default.
;"-system-sqlite"
"-system-harfbuzz"
"-system-pcre"
;; explicitly link with openssl instead of dlopening it
"-openssl-linked"
;; explicitly link with dbus instead of dlopening it
"-dbus-linked"
;; don't use the precompiled headers
"-no-pch"
;; drop special machine instructions not supported
;; on all instances of the target
,@(if (string-prefix? "x86_64"
(or (%current-target-system)
(%current-system)))
'()
'("-no-sse2"))
"-no-mips_dsp"
"-no-mips_dspr2")))))
(add-after 'install 'patch-mkspecs
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(archdata (string-append out "/lib/qt5"))
(mkspecs (string-append archdata "/mkspecs"))
(qt_config.prf (string-append
mkspecs "/features/qt_config.prf")))
;; For each Qt module, let `qmake' uses search paths in the
;; module directory instead of all in QT_INSTALL_PREFIX.
(substitute* qt_config.prf
(("\\$\\$\\[QT_INSTALL_HEADERS\\]")
"$$clean_path($$replace(dir, mkspecs/modules, ../../include/qt5))")
(("\\$\\$\\[QT_INSTALL_LIBS\\]")
"$$clean_path($$replace(dir, mkspecs/modules, ../../lib))")
(("\\$\\$\\[QT_HOST_LIBS\\]")
"$$clean_path($$replace(dir, mkspecs/modules, ../../lib))")
(("\\$\\$\\[QT_INSTALL_BINS\\]")
"$$clean_path($$replace(dir, mkspecs/modules, ../../bin))"))
;; Searches Qt tools in the current PATH instead of QT_HOST_BINS.
(substitute* (string-append mkspecs "/features/qt_functions.prf")
(("cmd = \\$\\$\\[QT_HOST_BINS\\]/\\$\\$2")
"cmd = $$system(which $${2}.pl 2>/dev/null || which $${2})"))
;; Resolve qmake spec files within qtbase by absolute paths.
(substitute*
(map (lambda (file)
(string-append mkspecs "/features/" file))
'("device_config.prf" "moc.prf" "qt_build_config.prf"
"qt_config.prf" "winrt/package_manifest.prf"))
(("\\$\\$\\[QT_HOST_DATA/get\\]") archdata)
(("\\$\\$\\[QT_HOST_DATA/src\\]") archdata))
#t)))
(add-after 'unpack 'patch-paths
;; Use the absolute paths for dynamically loaded libs, otherwise
;; the lib will be searched in LD_LIBRARY_PATH which typically is
;; not set in guix.
(lambda* (#:key inputs #:allow-other-keys)
;; libresolve
(let ((glibc (assoc-ref inputs ,(if (%current-target-system)
"cross-libc" "libc"))))
(substitute* '("qtbase/src/network/kernel/qdnslookup_unix.cpp"
"qtbase/src/network/kernel/qhostinfo_unix.cpp")
(("^\\s*(lib.setFileName\\(QLatin1String\\(\")(resolv\"\\)\\);)" _ a b)
(string-append a glibc "/lib/lib" b))))
;; X11/locale (compose path)
(substitute* "qtbase/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp"
;; Don't search in /usr/…/X11/locale, …
(("^\\s*m_possibleLocations.append\\(QStringLiteral\\(\"/usr/.*/X11/locale\"\\)\\);" line)
(string-append "// " line))
;; … but use libx11's path
(("^\\s*(m_possibleLocations.append\\(QStringLiteral\\()X11_PREFIX \"(/.*/X11/locale\"\\)\\);)" _ a b)
(string-append a "\"" (assoc-ref inputs "libx11") b)))
;; libGL
(substitute* "qtbase/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp"
(("^\\s*(QLibrary lib\\(QLatin1String\\(\")(GL\"\\)\\);)" _ a b)
(string-append a (assoc-ref inputs "mesa") "/lib/lib" b)))
;; libXcursor
(substitute* "qtbase/src/plugins/platforms/xcb/qxcbcursor.cpp"
(("^\\s*(QLibrary xcursorLib\\(QLatin1String\\(\")(Xcursor\"\\), 1\\);)" _ a b)
(string-append a (assoc-ref inputs "libxcursor") "/lib/lib" b))
(("^\\s*(xcursorLib.setFileName\\(QLatin1String\\(\")(Xcursor\"\\)\\);)" _ a b)
(string-append a (assoc-ref inputs "libxcursor") "/lib/lib" b)))
#t))
(add-after 'install 'build-doc
(lambda* (#:key inputs outputs make-flags #:allow-other-keys)
(let ((out (assoc-ref outputs "out"))
(doc (assoc-ref outputs "doc")))
;; qdoc fails without these, see QTBUG-67925
;; Can't use absolute path as it causes reference cycle between doc and out.
;; (setenv "QT_INSTALL_HEADERS" (string-append out "/include/qt5"))
(setenv "QT_INSTALL_HEADERS" "include/qt5")
(setenv "QT_INSTALL_DOCS" (string-append doc "/share/doc/qt5")))
(apply invoke "make" "docs" make-flags)))
(add-after 'build-doc 'install-doc
(lambda _
(invoke "make" "install_docs"))))))
(native-search-paths
(list (search-path-specification
(variable "QMAKEPATH")
(files '("lib/qt5")))
(search-path-specification
(variable "QML2_IMPORT_PATH")
(files '("lib/qt5/qml")))
(search-path-specification
(variable "QT_PLUGIN_PATH")
(files '("lib/qt5/plugins")))
(search-path-specification
(variable "XDG_DATA_DIRS")
(files '("share")))
(search-path-specification
(variable "XDG_CONFIG_DIRS")
(files '("etc/xdg")))))
(home-page "https://www.qt.io/")
(synopsis "Cross-platform GUI library")
(description "Qt is a cross-platform application and UI framework for
developers using C++ or QML, a CSS & JavaScript like language.")
(license (list license:lgpl2.1 license:lgpl3))
;; Qt 4: 'QBasicAtomicPointer' leads to build failures on MIPS;
;; see <http://hydra.gnu.org/build/112828>.
;; Qt 5: assembler error; see <http://hydra.gnu.org/build/112526>.
(supported-systems (delete "mips64el-linux" %supported-systems))))
(define-public qtcreator
(package
(name "qtcreator")
(version "4.7.0")
(source
(origin
(method url-fetch)
(uri (string-append "https://download.qt.io/official_releases/qtcreator/4.7/"
version
"/qt-creator-opensource-src-"
version ".tar.xz"))
(sha256
;; (base32 "1k23i1qsw6d06sy7g0vd699rbvwv6vbw211fy0nn0705a5zndbxv") ; 4.6.2
(base32 "16vm1gcq5g3zpcq21xdn31drzlar2hm5583kmkg6adnlz05qf6ab")))) ; 4.7.0
(build-system gnu-build-system)
(arguments
`(#:make-flags
(list (string-append "INSTALL_ROOT=" (assoc-ref %outputs "out")))
#:validate-runpath? #f
#:phases
(modify-phases %standard-phases
(replace 'configure
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out"))
(clang (assoc-ref inputs "clang"))
(llvm (assoc-ref inputs "llvm")))
(substitute* "src/shared/clang/clang_installation.pri"
(("\\$\\$system\\(\\$\\$llvm_config --libdir, lines\\)")
(string-append clang "/lib"))
(("\\$\\$system\\(\\$\\$llvm_config --includedir, lines\\)")
(string-append clang "/include")))
(invoke "qmake"
(string-append "LLVM_INSTALL_DIR=" llvm)))))
(add-after 'install 'build-doc
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "docs" make-flags)))
(add-after 'build-doc 'install-doc
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "install_docs" make-flags))))))
(native-inputs
`(("which" ,which)))
(inputs
`(("clang" ,clang)
("llvm" ,llvm)
("qt" ,qt)))
(home-page "https://www.qt.io/ide/")
(synopsis "Cross-platform IDE for Qt")
(description "Qt Creator is a cross-platform IDE (integrated
development environment) tailored to the needs of Qt developers.")
(license license:gpl3)))
;; Обернуть qtcreator так, чтобы он видел GCC и Qt из Guix.
(define-public qtcreator-wrapped
(package
(inherit qtcreator)
(name "qtcreator-wrapped")
(inputs
`(("gcc-toolchain" ,gcc-toolchain-8)
,@(package-inputs qtcreator)))
(arguments
(substitute-keyword-arguments (package-arguments qtcreator)
((#:phases phases)
`(modify-phases ,phases
(add-after 'install 'wrap-program
(lambda* (#:key inputs outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(qt (assoc-ref inputs "qt"))
(gcc (assoc-ref inputs "gcc-toolchain")))
(wrap-program (string-append out "/bin/qtcreator")
`("PATH" ":" prefix
(,(string-append qt "/bin")
,(string-append gcc "/bin")))
`("CPATH" ":" prefix
(,(string-append gcc "/include")))
`("LIBRARY_PATH" ":" prefix
(,(string-append gcc "/lib")))))
#t))))))))
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 658 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: QtCreator Packaging
2018-10-11 2:58 QtCreator Packaging Brett Gilio
2018-10-11 7:11 ` Mikhail Kryshen
@ 2018-10-11 8:41 ` Thorsten Wilms
1 sibling, 0 replies; 3+ messages in thread
From: Thorsten Wilms @ 2018-10-11 8:41 UTC (permalink / raw)
To: guix-devel
On 2018-10-11 04:58, Brett Gilio wrote:
> I am beginning my attempt to package QtCreator.
> Here is the current package definition:
> http://ix.io/1oTH
>
> Here is the kill ring for the build:
> http://ix.io/1oTJ
Hi, I'm rather ... new to this myself. That said, the critical line
seems to be:
/gnu/store/rbrandv7anzjxqkr40d7fkanzssslk4b-bash-minimal-4.4.19/bin/bash:
./configure: No such file or directory
Looking at
https://wiki.qt.io/Building_Qt_Creator_from_Git,
qmake is used instead of a ./configure. Here I thought `(build-system
gnu-build-system)` would be the wrong choice, but
https://www.gnu.org/software/guix/manual/en/html_node/Build-Systems.html
doesn't mention qmake or anything that strikes me as Qt-specific.
In the guix source tree, /gnu/packages: `grep -B 10 -A 10 qmake *` lists
some candidates with context to look at. A full package definition
picked out from there:
---
(define-public ghostwriter
(package
(name "ghostwriter")
(version "1.6.2")
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/wereturtle/ghostwriter.git")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32
"0251563zy0q69fzfacvalpx43y15cshb0bhshyd4w37061gh1c12"))))
(build-system gnu-build-system)
(native-inputs
`(("pkg-config" ,pkg-config)
("qttools" ,qttools))) ;for lrelease
(inputs
`(("hunspell" ,hunspell)
("qtbase" ,qtbase)
("qtmultimedia" ,qtmultimedia)
("qtsvg" ,qtsvg)
("qtwebkit" ,qtwebkit)))
(arguments
`(#:phases
(modify-phases %standard-phases
(replace 'configure
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(invoke "qmake" (string-append "PREFIX=" out)))))
(add-after 'configure 'create-translations
(lambda _
;; `lrelease` will not overwrite, so delete existing .qm files
(for-each delete-file (find-files "translations" ".*\\.qm"))
(apply invoke "lrelease" (find-files "translations"
".*\\.ts"))))
;; Ensure that icons are found at runtime.
(add-after 'install 'wrap-executable
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(wrap-program (string-append out "/bin/ghostwriter")
`("QT_PLUGIN_PATH" ":" prefix
,(map (lambda (label)
(string-append (assoc-ref inputs label)
"/lib/qt5/plugins/"))
'("qtsvg" "qtmultimedia"))))))))))
(home-page "https://wereturtle.github.io/ghostwriter/")
(synopsis "Write without distractions")
(description
"@code{ghostwriter} provides a relaxing, distraction-free writing
environment with Markdown markup.")
(license license:gpl3+))) ;icons/* under CC-BY-SA3
---
So the current pattern for building with qmake is to use `(build-system
gnu-build-system)` with modify-phases to replace configure. How that
replacement looks exactly varies between packages.
I'm surprised that python-pyqt has
(native-inputs `(("qtbase" ,qtbase))) ; for qmake
but other packages that replace configure do not.
--
Thorsten Wilms
thorwil's design for free software:
http://thorwil.wordpress.com/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-10-11 8:44 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-11 2:58 QtCreator Packaging Brett Gilio
2018-10-11 7:11 ` Mikhail Kryshen
2018-10-11 8:41 ` Thorsten Wilms
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.