aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 David Thompson <dthompson2@worcester.edu>
;;; Copyright © 2014 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2014 Cyrill Schenkel <cyrill.schenkel@gmail.com>
;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
;;; Copyright © 2016, 2018, 2019, 2020 Leo Famulari <leo@famulari.name>
;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019 Evan Straw <evan.straw99@gmail.com>
;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2020 Lars-Dominik Braun <lars@6xq.net>
;;; Copyright © 2020–2023 Simon Streit <simon@netpanic.org>
;;; Copyright © 2021 Noah Evans <noah@nevans.me>
;;;
;;; 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 mpd)
  #:use-module (gnu packages)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix git-download)
  #:use-module (guix utils)
  #:use-module (guix build-system cmake)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system meson)
  #:use-module (guix build-system python)
  #:use-module (gnu packages audio)
  #:use-module (gnu packages autotools)
  #:use-module (gnu packages avahi)
  #:use-module (gnu packages base)
  #:use-module (gnu packages bash)
  #:use-module (gnu packages boost)
  #:use-module (gnu packages cdrom)
  #:use-module (gnu packages cpp)
  #:use-module (gnu packages file-systems)
  #:use-module (gnu packages freedesktop) ;elogind
  #:use-module (gnu packages gettext)
  #:use-module (gnu packages gnome)
  #:use-module (gnu packages gnupg)
  #:use-module (gnu packages gtk)
  #:use-module (gnu packages icu4c)
  #:use-module (gnu packages libusb)
  #:use-module (gnu packages lua)
  #:use-module (gnu packages readline)
  #:use-module (gnu packages ruby)
  #:use-module (gnu packages check)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages documentation)
  #:use-module (gnu packages glib)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages mp3)
  #:use-module (gnu packages music)
  #:use-module (gnu packages ncurses)
  #:use-module (gnu packages pcre)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages pretty-print)
  #:use-module (gnu packages python)
  #:use-module (gnu packages python-xyz)
  #:use-module (gnu packages pulseaudio)
  #:use-module (gnu packages qt)
  #:use-module (gnu packages serialization)
  #:use-module (gnu packages sphinx)
  #:use-module (gnu packages sqlite)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages video)
  #:use-module (gnu packages web)
  #:use-module (gnu packages xiph)
  #:use-module (gnu packages xml))

(define-public libmpdclient
  (package
    (name "libmpdclient")
    (version "2.20")
    (source (origin
              (method url-fetch)
              (uri
               (string-append "https://musicpd.org/download/libmpdclient/"
                              (car (string-split version #\.))
                              "/libmpdclient-" version ".tar.xz"))
              (sha256
               (base32
                "0z979qcjc0dqmpn3q9j174a29akx3zmavz6q6hg31hrrx5l3yy8q"))))
    (build-system meson-build-system)
    (native-inputs
     (list pkg-config
           ;; For building HTML documentation.
           doxygen
           ;; For tests.
           check))
    (arguments
     `(#:configure-flags
       (list "-Ddocumentation=true"
             "-Dtest=true")))
    (synopsis "Music Player Daemon client library")
    (description "A stable, documented, asynchronous API library for
interfacing MPD in the C, C++ & Objective C languages.")
    (home-page "https://www.musicpd.org/libs/libmpdclient/")
    (license license:bsd-3)))

(define-public mpd
  (package
    (name "mpd")
    (version "0.23.15")
    (source (origin
              (method url-fetch)
              (uri
               (string-append "https://musicpd.org/download/mpd/"
                              (version-major+minor version)
                              "/mpd-" version ".tar.xz"))
              (sha256
               (base32
                "06k60ych9crifyx6zfc98hdcihixq5nba1c9rwngib6ik8ik40am"))))
    (build-system meson-build-system)
    (arguments
     (list
      #:configure-flags #~(list "-Ddocumentation=enabled"
                                "-Dsystemd=enabled"
                                "-Dtest=true")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'enable-elogind
            (lambda _
              (substitute* "src/lib/systemd/meson.build"
                (("libsystemd") "libelogind"))
              ;; XXX: systemd dependency overwritten internally, leads to bad
              ;;      errors
              (substitute* "src/lib/systemd/meson.build"
                (("systemd_dep = declare_dependency" all)
                 (string-append "_" all)))
              (substitute* "meson.build"
                (("systemd_dep,") "systemd_dep, _systemd_dep,"))))
          (add-after 'install 'split-package
            (lambda _
              ;; The HTML manual accounts for over 40% of the disk
              ;; space used by the package.
              (let* ((old (string-append #$output "/share/doc"))
                     (new (string-append #$output:doc "/share/doc")))
                (mkdir-p (dirname new))
                (rename-file old new)))))))
    (inputs (append
             (if (target-linux?) (list liburing) '())
             (list ao
                   alsa-lib
                   avahi
                   boost
                   chromaprint
                   curl
                   dbus
                   elogind
                   expat
                   ffmpeg
                   flac
                   fmt
                   glib
                   icu4c
                   ;; The LAME decoder comes from FFmpeg, but is added here so that
                   ;; configure picks up the LAME encoder.
                   lame
                   libgme
                   libid3tag
                   libmpdclient
                   libnfs
                   libopenmpt
                   libsamplerate
                   libshout
                   libsndfile
                   libvorbis
                   opus
                   pcre2
                   pipewire
                   pulseaudio
                   soxr
                   sqlite
                   yajl
                   zlib
                   zziplib)))
    (native-inputs (list pkg-config python-sphinx googletest
                         ;; See test/meson.build for information about these
                         ;; additional dependencies.
                         ;;
                         ;; Used when zziplib feature is enabled.
                         zip))
    (outputs (list "out" "doc"))
    ;; Missing optional inputs:
    ;;   libcdio_paranoia
    ;;   libmms
    ;;   libadplug
    ;;   libaudiofile
    ;;   faad2
    ;;   fluidsynth
    ;;   libmpg123
    ;;   libmodplug
    ;;   libmpcdec
    ;;   libsidplay2
    ;;   libwavpack
    ;;   libwildmidi
    ;;   libtwolame
    ;;   libroar
    ;;   libjack
    ;;   OpenAL
    (synopsis "Music Player Daemon")
    (description "Music Player Daemon (MPD) is a flexible, powerful,
server-side application for playing music.  Through plugins and libraries it
can play a variety of sound files while being controlled by its network
protocol.")
    (home-page "https://www.musicpd.org/")
    (properties `((release-monitoring-url . "https://musicpd.org")))
    (license license:gpl2)))

(define-public mpd-mpc
  (package
    (name "mpd-mpc")
    (version "0.34")
    (source (origin
              (method url-fetch)
              (uri
               (string-append "https://www.musicpd.org/download/mpc/"
                              (car (string-split version #\.))
                              "/mpc-" version ".tar.xz"))
              (sha256
               (base32
                "086sdx88zvgbv4j9kw4qlrsw1n621d6j6403pcid045wahv3y7k9"))))
    (build-system meson-build-system)
    (arguments
     (list #:phases
           #~(modify-phases %standard-phases
               (add-after 'unpack 'remove-bogus-rsync-requirement
                 ;; Meson thinks a maintainer ‘upload to musicpd.org’ task
                 ;; merits a hard dependency on rsync.  Convince it otherwise.
                 ;; Don't use ‘true’ so that the build will fail if it is ever
                 ;; actually invoked.
                 (lambda _
                   (substitute* "doc/meson.build"
                     (("rsync") "ls"))))
               (add-after 'install 'move-completion
                 (lambda* (#:key outputs #:allow-other-keys)
                   (let* ((out (assoc-ref outputs "out"))
                          (contrib (string-append out "/share/doc/mpc/contrib"))
                          (completion
                           (string-append out "/etc/bash_completion.d/")))
                     (mkdir-p completion)
                     (rename-file (string-append contrib "/mpc-completion.bash")
                                  (string-append completion "/mpc"))))))))
    (inputs (list libmpdclient))
    (native-inputs
     (list pkg-config python-sphinx))
    (synopsis "Music Player Daemon client")
    (description "MPC is a minimalist command line interface to MPD, the music
player daemon.")
    (home-page "https://www.musicpd.org/clients/mpc/")
    (license license:gpl2)))

(define-public ncmpc
  (package
    (name "ncmpc")
    (version "0.49")
    (source (origin
              (method url-fetch)
              (uri
               (string-append "http://musicpd.org/download/ncmpc/"
                              (version-major version)
                              "/ncmpc-" version ".tar.xz"))
              (sha256
               (base32
                "0afgcbqk4gqhc26wlw6vsnyv5gl5ciq0qyv4miicyswyvq7frfv5"))))
    (build-system meson-build-system)
    (inputs (list boost pcre libmpdclient ncurses))
    (native-inputs
     (list gettext-minimal              ; for xgettext
           pkg-config
           python-sphinx))
    (synopsis "Curses Music Player Daemon client")
    (description "ncmpc is a fully featured MPD client, which runs in a
terminal using ncurses.")
    (home-page "https://www.musicpd.org/clients/ncmpc/")
    (license license:gpl2)))

(define-public ncmpcpp
  (package
    (name "ncmpcpp")
    (version "0.9.2")
    (source (origin
              (method url-fetch)
              (uri
               (string-append "https://ncmpcpp.rybczak.net/stable/ncmpcpp-"
                              version ".tar.bz2"))
              (sha256
               (base32
                "06rs734n120jp51hr0fkkhxrm7zscbhpdwls0m5b5cccghazdazs"))))
    (build-system gnu-build-system)
    (inputs (list libmpdclient
                  boost
                  readline
                  ncurses
                  taglib
                  icu4c
                  curl))
    (native-inputs
     (list pkg-config))
    (arguments
     '(#:configure-flags
       '("BOOST_LIB_SUFFIX=" "--with-taglib" "--enable-clock")))
    (synopsis "Featureful ncurses based MPD client inspired by ncmpc")
    (description "Ncmpcpp is an mpd client with a UI very similar to ncmpc,
but it provides new useful features such as support for regular expressions
for library searches, extended song format, items filtering, the ability to
sort playlists, and a local file system browser.")
    (home-page "https://ncmpcpp.rybczak.net/")
    (license license:gpl2+)))

(define-public mpdscribble
  (package
    (name "mpdscribble")
    (version "0.24")
    (source (origin
              (method url-fetch)
              (uri (string-append "http://www.musicpd.org/download/mpdscribble/"
                                  version "/mpdscribble-" version ".tar.xz"))
              (sha256
               (base32
                "1rx8n8pvx3a6n6z51pgy00p4rs93iqy95d3ha9q7xf5k92kwpd7n"))))
    (build-system meson-build-system)
    (inputs (list boost curl libgcrypt libmpdclient))
    (native-inputs (list pkg-config))
    (synopsis "MPD client for track scrobbling")
    (description "mpdscribble is a Music Player Daemon client which submits
information about tracks being played to a scrobbler, such as Libre.FM.")
    (home-page "https://www.musicpd.org/clients/mpdscribble/")
    (license license:gpl2+)))

(define-public python-mpd2
  (package
    (name "python-mpd2")
    (version "3.0.4")
    (source (origin
              (method url-fetch)
              (uri (pypi-uri "python-mpd2" version))
              (sha256
               (base32
                "1r8saq1460yfa0sxfrvxqs2r453wz2xchlc9gzbpqznr49786rvs"))))
    (build-system python-build-system)
    (arguments
     '(#:phases
       (modify-phases %standard-phases
         (replace 'check
           (lambda _ (invoke "python" "-m" "pytest" "mpd/tests.py"))))))
    (native-inputs
     (list python-mock python-pytest))
    (home-page "https://github.com/Mic92/python-mpd2")
    (synopsis "Python MPD client library")
    (description "Python-mpd2 is a Python library which provides a client
interface for the Music Player Daemon.")
    (license license:lgpl3+)))

(define-public sonata
  (package
    (name "sonata")
    (version "1.7.0")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                     (url "https://github.com/multani/sonata")
                     (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0rl8w7s2asff626clzfvyz987l2k4ml5dg417mqp9v8a962q0v2x"))))
    (build-system python-build-system)
    (arguments
     `(#:modules ((guix build gnu-build-system)
                  (guix build python-build-system)
                  ((guix build glib-or-gtk-build-system) #:prefix glib-or-gtk:)
                  (guix build utils))
       #:imported-modules (,@%default-gnu-imported-modules
                           (guix build python-build-system)
                           (guix build glib-or-gtk-build-system))
       #:phases
       (modify-phases %standard-phases
         (add-after 'install 'glib-or-gtk-wrap
           (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap))
         (add-after 'install 'wrap-sonata
           (lambda* (#:key outputs #:allow-other-keys)
             (let ((out               (assoc-ref outputs "out"))
                   (gi-typelib-path   (getenv "GI_TYPELIB_PATH")))
               (wrap-program (string-append out "/bin/sonata")
                 `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path)))))))))
    (native-inputs
     (list gettext-minimal))
    (inputs
     (list bash-minimal
           python-mpd2
           gtk+
           gsettings-desktop-schemas
           gobject-introspection
           adwaita-icon-theme
           gvfs
           python-pygobject))
    (synopsis "Elegant client for the Music Player Daemon")
    (description "Sonata is an elegant graphical client for the Music Player
Daemon (MPD).  It supports playlists, multiple profiles (connecting to different
MPD servers, search and multimedia key support.")
    (home-page "https://www.nongnu.org/sonata/")
    (license license:gpl3+)))

(define-public ashuffle
  (package
    (name "ashuffle")
    (version "3.13.4")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/joshkunz/ashuffle")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "09dvar0aglyy2h9y115ymgryd8l6npc2y2ccdzij0b70f47ncqmf"))))
    (native-inputs (list pkg-config))
    (inputs
     (list abseil-cpp-cxxstd17
           googletest
           libmpdclient
           yaml-cpp))
    (build-system meson-build-system)
    (arguments
     (list #:configure-flags
           #~'("-Dtests=enabled"
               "-Dunsupported_use_system_absl=true"
               "-Dunsupported_use_system_gtest=true"
               "-Dunsupported_use_system_yamlcpp=true")))
    (home-page "https://github.com/joshkunz/ashuffle")
    (synopsis "Automatic library-wide shuffle for mpd")
    (description "ashuffle is an application for automatically shuffling your
MPD library in a similar way to many other music players' 'shuffle library'
feature. ashuffle works like any other MPD client, and can be used alongside
other MPD frontends.")
    (license license:expat)))

(define-public mpdris2
  (package
    (name "mpdris2")
    (version "0.9.1")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/eonpatapon/mpDris2")
                    (commit version)))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "17ys8ccr3h6vix0agvhz859slz0phhk7lwqn5bg4az8s7zgqm3nm"))))
    (build-system gnu-build-system)
    ;; Manually wrap the binary, because we’re not using python-build-system.
    (arguments
     (list
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'install 'wrap-program
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((python-path (getenv "GUIX_PYTHONPATH")))
                (wrap-program (string-append #$output "/bin/mpDris2")
                  `("GUIX_PYTHONPATH" ":" prefix (,python-path)))))))))
    (inputs
     (list bash-minimal
           python
           python-dbus
           python-mpd2
           python-mutagen
           python-pygobject))
    (native-inputs
     (list autoconf
           automake
           gettext-minimal
           intltool
           which))
    (synopsis "MPRIS V2.1 support for MPD")
    (description "mpDris2 is a client for the Music Player Daemon providing
MPRIS 2 support.")
    (home-page "https://github.com/eonpatapon/mpDris2")
    (license license:gpl3+)))

(define-public cantata
  (package
    (name "cantata")
    (version "2.5.0")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/CDrummond/"
                                  "cantata/releases/download/v" version "/"
                                  "cantata-" version ".tar.bz2"))
              (sha256
               (base32
                "090ph8kb2vicjaajn64kmfppb90ix0pnxj525shglyjn7ymh0zpb"))))
    (build-system cmake-build-system)
    (arguments
     `(#:tests? #f)) ; No test suite
    (native-inputs
     (list pkg-config))
    (inputs
     (list avahi
           eudev
           ffmpeg
           libcdio-paranoia
           libmusicbrainz
           libebur128
           libmtp
           mpg123
           qtbase-5
           qtmultimedia-5
           qtsvg-5
           taglib
           zlib))
    (synopsis "Graphical MPD Client")
    (description "Cantata is a graphical client for the Music Player Daemon
(MPD), using the Qt5 toolkit.  Its user interface is highly customizable,
supporting multiple collections, ratings, and dynamic playlists.  A local cache
of the music library will be created to provide a hierarchy of albums and
artists along with albumart.")
    (home-page "https://github.com/cdrummond/cantata")
    (license license:gpl3+)))

(define-public mcg
  (package
    (name "mcg")
    (version "3.1")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://gitlab.com/coderkun/mcg")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "087d3gvx8z1yj7rg9d9h1x02vkw57h4v6xf5pxqyhqyk2435kk17"))))
    (build-system meson-build-system)
    (arguments
     (list
      #:glib-or-gtk? #t
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'install 'wrap-program
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((prog (string-append (assoc-ref outputs "out")
                                         "/bin/mcg")))
                (wrap-program prog
                  `("GUIX_PYTHONPATH" = (,(getenv "GUIX_PYTHONPATH")))
                  `("GI_TYPELIB_PATH" = (,(getenv "GI_TYPELIB_PATH"))))))))))
    (inputs (list avahi
                  bash-minimal
                  dconf
                  gsettings-desktop-schemas
                  gtk+
                  python
                  python-pygobject))
    (native-inputs (list desktop-file-utils
                         gettext-minimal
                         `(,glib "bin")
                         gobject-introspection
                         `(,gtk+ "bin")
                         pkg-config))
    (synopsis "Covergrid for the MPD")
    (description
     "mcg (CoverGrid) is a client for the Music Player Daemon (MPD), focusing
on albums instead of single tracks.  It is not intended to be a replacement
for your favorite MPD client but an addition to get a better
album-experience.")
    (home-page "https://gitlab.com/coderkun/mcg")
    (license license:gpl3+)))

(define-public mpdevil
  (package
    (name "mpdevil")
    (version "1.10.2")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/SoongNoonien/mpdevil")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32 "0ghmw3xiz567qd1iv1ggkv6zl1jb5d40mz27npk2zvlpikmqpc6c"))))
    (build-system meson-build-system)
    (arguments
     (list
      #:glib-or-gtk? #t
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'glib-or-gtk-wrap 'python-and-gi-wrap
            (lambda _
              (let ((prog (string-append #$output "/bin/mpdevil")))
                (wrap-program prog
                  `("GUIX_PYTHONPATH" = (,(getenv "GUIX_PYTHONPATH")))
                  `("GI_TYPELIB_PATH" = (,(getenv "GI_TYPELIB_PATH"))))))))))
    (inputs (list bash-minimal
                  gtk+
                  python
                  python-mpd2
                  python-pycairo
                  python-pygobject))
    (native-inputs (list gettext-minimal `(,glib "bin")))
    (home-page "https://github.com/SoongNoonien/mpdevil")
    (synopsis "Music browser for the MPD")
    (description "mpdevil is a music browser for the Music Player Daemon (MPD),
which is focused on playing local music without the need of managing playlists.
Instead of maintaining a client side database of your music library,
mpdevil loads all tags and covers on demand.")
    (license license:gpl3+)))

(define-public mympd
  (package
    (name "mympd")
    (version "13.0.6")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/jcorporation/myMPD")
                    (commit (string-append "v" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "17mx6qkdcnm4z6qw0ns8wmihahcnk3kidfcr6fapa34cdadsjapg"))))
    (outputs '("out" "doc"))
    (build-system cmake-build-system)
    (arguments
     (list
      #:configure-flags
      #~(list "-DCMAKE_INSTALL_LOCALSTATEDIR=/var"
              "-DMYMPD_BUILD_TESTING=ON"
              "-DMYMPD_DOC_HTML=ON")
      #:phases
      #~(modify-phases %standard-phases
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                ;; The following test requires network connectivity.
                (invoke "ctest" "--exclude-regex" "test_http_client"))))
          (add-after 'install 'move-doc
            (lambda _
              (let ((old (string-append #$output "/share/doc"))
                    (new (string-append #$output:doc "/share/doc")))
                (mkdir-p (dirname new))
                (rename-file old new)))))))
    (native-inputs (list jekyll jq perl pkg-config))
    (inputs (list flac libid3tag lua openssl pcre2))
    (home-page "https://jcorporation.github.io/")
    (synopsis "Web-based MPD client")
    (description "MyMPD is a mobile-friendly web client for the Music Player
Daemon (MPD).")
    (license license:gpl3+)))
ice-9 match) (srfi srfi-26) (guix build union)) (let ((out (assoc-ref %outputs "out"))) (match %build-inputs (((names . directories) ...) (union-build out directories))) ;; Create 'cc' and 'c++' so that one can use it as a ;; drop-in replacement for the default tool chain and ;; have configure scripts find the compiler. (symlink "clang" (string-append out "/bin/cc")) (symlink "clang++" (string-append out "/bin/c++")) (union-build (assoc-ref %outputs "debug") (list (assoc-ref %build-inputs "libc-debug"))) (union-build (assoc-ref %outputs "static") (list (assoc-ref %build-inputs "libc-static"))) #t)))) (native-search-paths (append (package-native-search-paths clang) (list (search-path-specification ;copied from glibc (variable "GUIX_LOCPATH") (files '("lib/locale")))))) (search-paths (package-search-paths clang)) (license (package-license clang)) (properties (package-properties clang)) ;for 'compiler-cpu-architectures' (home-page "https://clang.llvm.org") (synopsis "Complete Clang toolchain for C/C++ development") (description "This package provides a complete Clang toolchain for C/C++ development to be installed in user profiles. This includes Clang, as well as libc (headers and binaries, plus debugging symbols in the @code{debug} output), and Binutils.") (outputs '("out" "debug" "static")) (inputs `(("clang" ,clang) ("ld-wrapper" ,(car (assoc-ref (%final-inputs) "ld-wrapper"))) ("binutils" ,binutils) ("libomp" ,libomp) ;used when linking with '-fopenmp' ("libc" ,glibc) ("libc-debug" ,glibc "debug") ("libc-static" ,glibc "static"))))) (define %llvm-monorepo-hashes '(("14.0.6" . "14f8nlvnmdkp9a9a79wv67jbmafvabczhah8rwnqrgd5g3hfxxxx") ("15.0.7" . "12sggw15sxq1krh1mfk3c1f07h895jlxbcifpwk3pznh4m1rjfy2") ("16.0.6" . "0jxmapg7shwkl88m4mqgfjv4ziqdmnppxhjz6vz51ycp2x4nmjky") ("17.0.6" . "1a7rq3rgw5vxm8y39fyzr4kv7w97lli4a0c1qrkchwk8p0n07hgh") ("18.1.8" . "1l9wm0g9jrpdf309kxjx7xrzf13h81kz8bbp0md14nrz38qll9la"))) (define %llvm-patches '(("14.0.6" . ("clang-14.0-libc-search-path.patch" "clang-runtime-14-glibc-2.36-compat.patch" "clang-14-remove-crypt-interceptors.patch")) ("15.0.7" . ("clang-15.0-libc-search-path.patch" "clang-16-remove-crypt-interceptors.patch")) ("16.0.6" . ("clang-16.0-libc-search-path.patch" "clang-16-remove-crypt-interceptors.patch")) ("17.0.6" . ("clang-17.0-libc-search-path.patch" "clang-17.0-link-dsymutil-latomic.patch")) ("18.1.8" . ("clang-18.0-libc-search-path.patch" "clang-17.0-link-dsymutil-latomic.patch")))) (define (llvm-monorepo version) (origin (method git-fetch) (uri (git-reference (url "https://github.com/llvm/llvm-project") (commit (string-append "llvmorg-" version)))) (file-name (git-file-name "llvm-project" version)) (sha256 (base32 (assoc-ref %llvm-monorepo-hashes version))) (patches (map search-patch (assoc-ref %llvm-patches version))))) ;;; TODO: Make the base llvm all other LLVM inherit from on core-updates. (define-public llvm-15 (package (name "llvm") (version "15.0.7") (source (llvm-monorepo version)) (build-system cmake-build-system) (outputs '("out" "opt-viewer")) (arguments (list #:configure-flags #~(list ;; These options are required for cross-compiling LLVM according ;; to <https://llvm.org/docs/HowToCrossCompileLLVM.html>. #$@(if (%current-target-system) (or (and=> (system->llvm-target-arch) (lambda (llvm-target-arch) #~((string-append "-DLLVM_TABLEGEN=" #+(file-append this-package "/bin/llvm-tblgen")) #$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE=" (%current-target-system)) #$(string-append "-DLLVM_TARGET_ARCH=" llvm-target-arch) #$(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target))))) (raise (condition (&package-unsupported-target-error (package this-package) (target (%current-target-system)))))) '()) ;; Note: sadly, the build system refuses the use of ;; -DBUILD_SHARED_LIBS=ON and the large static archives are needed to ;; build clang-runtime, so we cannot delete them. "-DLLVM_BUILD_LLVM_DYLIB=ON" "-DLLVM_LINK_LLVM_DYLIB=ON" "-DLLVM_ENABLE_FFI=ON" "-DLLVM_ENABLE_RTTI=ON" ;for some third-party utilities "-DLLVM_INSTALL_UTILS=ON" ;needed for rustc "-DLLVM_PARALLEL_LINK_JOBS=1") ;cater to smaller build machines ;; Don't use '-g' during the build, to save space. #:build-type "Release" #:phases #~(modify-phases %standard-phases (add-after 'unpack 'change-directory (lambda _ (chdir "llvm"))) (add-after 'install 'install-opt-viewer (lambda* (#:key outputs #:allow-other-keys) (let* ((opt-viewer-share (string-append #$output:opt-viewer "/share"))) (mkdir-p opt-viewer-share) (rename-file (string-append #$output "/share/opt-viewer") opt-viewer-share))))))) (native-inputs (list python-wrapper perl)) (inputs (list libffi)) (propagated-inputs (list zlib)) ;to use output from llvm-config (home-page "https://www.llvm.org") (synopsis "Optimizing compiler infrastructure") (description "LLVM is a compiler infrastructure designed for compile-time, link-time, runtime, and idle-time optimization of programs from arbitrary programming languages. It currently supports compilation of C and C++ programs, using front-ends derived from GCC 4.0.1. A new front-end for the C family of languages is in development. The compiler infrastructure includes mirror sets of programming tools as well as libraries with equivalent functionality.") (license license:asl2.0) (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))))) (define-public llvm-14 (package (inherit llvm-15) (version "14.0.6") (source (llvm-monorepo version)) (arguments (list #:configure-flags #~(list ;; These options are required for cross-compiling LLVM according ;; to <https://llvm.org/docs/HowToCrossCompileLLVM.html>. #$@(if (%current-target-system) (or (and=> (system->llvm-target-arch) (lambda (llvm-target-arch) #~((string-append "-DLLVM_TABLEGEN=" #+(file-append this-package "/bin/llvm-tblgen")) #$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE=" (%current-target-system)) #$(string-append "-DLLVM_TARGET_ARCH=" llvm-target-arch) #$(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target))))) (raise (condition (&package-unsupported-target-error (package this-package) (target (%current-target-system)))))) '()) ;; undefined reference to `__atomic_fetch_add_8' in lib/libLLVMOrcJIT.so.14 #$@(if (target-ppc32?) (list "-DCMAKE_SHARED_LINKER_FLAGS=-latomic") `()) "-DCMAKE_SKIP_BUILD_RPATH=FALSE" "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE" "-DBUILD_SHARED_LIBS:BOOL=TRUE" "-DLLVM_ENABLE_FFI:BOOL=TRUE" "-DLLVM_ENABLE_RTTI:BOOL=TRUE" ;for some third-party utilities "-DLLVM_INSTALL_UTILS=ON") ;needed for rustc ;; Don't use '-g' during the build, to save space. #:build-type "Release" #:phases #~(modify-phases %standard-phases (add-after 'unpack 'change-directory (lambda _ (chdir "llvm"))) (add-after 'install 'install-opt-viewer (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (opt-viewer-out (assoc-ref outputs "opt-viewer")) (opt-viewer-share-dir (string-append opt-viewer-out "/share")) (opt-viewer-dir (string-append opt-viewer-share-dir "/opt-viewer"))) (mkdir-p opt-viewer-share-dir) (rename-file (string-append out "/share/opt-viewer") opt-viewer-dir))))))) (native-inputs `(("python" ,python-wrapper) ("perl" ,perl))))) (define-public clang-runtime-15 (clang-runtime-from-llvm llvm-15)) (define-public clang-runtime-14 (clang-runtime-from-llvm llvm-14)) (define-public clang-15 (clang-from-llvm llvm-15 clang-runtime-15 #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-15))) (sha256 (base32 "1lagnspm5limxh1cp5jlixnzlhf09905d4rqra1kpgj6dps2x6l0"))))) (define-public clang-14 (clang-from-llvm llvm-14 clang-runtime-14 #:legacy-build-shared-libs? #t #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-14))) (sha256 (base32 "0rhq4wkmvr369nkk059skzzw7jx6qhzqhmiwmqg4sp66avzviwvw"))))) (define-public libomp-15 (package (name "libomp") (version (package-version llvm-15)) (source (llvm-monorepo version)) (build-system cmake-build-system) ;; XXX: Note this gets built with GCC because building with Clang itself ;; fails (missing <atomic>, even when libcxx is added as an input.) (arguments (list #:configure-flags #~(list "-DLIBOMP_USE_HWLOC=ON" "-DOPENMP_TEST_C_COMPILER=clang" "-DOPENMP_TEST_CXX_COMPILER=clang++") #:test-target "check-libomp" #:phases #~(modify-phases %standard-phases (add-after 'unpack 'chdir-to-source-and-install-license (lambda _ (chdir "openmp") (install-file "LICENSE.TXT" (string-append #$output "/share/doc"))))))) (native-inputs (list clang-15 llvm-15 perl pkg-config python)) (inputs (list `(,hwloc "lib"))) (home-page "https://openmp.llvm.org") (synopsis "OpenMP run-time support library") (description "This package provides the run-time support library developed by the LLVM project for the OpenMP multi-theaded programming extension. This package notably provides @file{libgomp.so}, which is has a binary interface compatible with that of libgomp, the GNU Offloading and Multi Processing Library.") (properties `((release-monitoring-url . ,%llvm-release-monitoring-url) (upstream-name . "openmp"))) (license license:expat))) (define-public clang-toolchain-15 (make-clang-toolchain clang-15 libomp-15)) (define-public libomp-14 (package (inherit libomp-15) (version (package-version llvm-14)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "07zby3gwy5c8jssabrhjk3nsxlwipnm6sk4dsvck1l5d0br1ywsg")) (file-name (string-append "libomp-" version ".tar.xz")))) (arguments (substitute-keyword-arguments (package-arguments libomp-15) ((#:phases phases) #~(modify-phases #$phases (replace 'chdir-to-source-and-install-license (lambda _ (chdir #$(string-append "../openmp-" version ".src")) (install-file "LICENSE.TXT" (string-append #$output "/share/doc")))))))) (native-inputs (modify-inputs (package-native-inputs libomp-15) (replace "clang" clang-14) (replace "llvm" llvm-14))))) (define-public clang-toolchain-14 (make-clang-toolchain clang-14 libomp-14)) (define-public llvm-13 (package (inherit llvm-14) (version "13.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "0d681xiixmx9inwvz14vi3xsznrcryk06a8rvk9cljiq5kc80szc")))) (arguments (substitute-keyword-arguments (package-arguments llvm-14) ((#:phases phases '%standard-phases) #~(modify-phases #$phases (delete 'change-directory))))) (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))))) (define-public clang-runtime-13 (clang-runtime-from-llvm llvm-13 "1z2xr9nn4mgc3hn9ark2k5y4wznpk47xppkp63bcbagr6589acvv" '("clang-runtime-13-glibc-2.36-compat.patch" "clang-13-remove-crypt-interceptors.patch"))) (define-public clang-13 (clang-from-llvm llvm-13 clang-runtime-13 "1j8pr5kk8iqyb4jds3yl7c6x672617h4ngkpl4575j7mk4nrwykq" #:legacy-build-shared-libs? #t #:patches '("clang-13.0-libc-search-path.patch") #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-13))) (sha256 (base32 "1l4jjdqfl9hrh0fwzv27hc263zc6x61h09vs4ni3yla8i1cwhayc"))))) (define-public libomp-13 (package (inherit libomp-14) (version (package-version llvm-13)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "0kvbr4j6ldpssiv7chgqra5y77n7jwbyxlwcl7z32v31f49jcybb")) (file-name (string-append "libomp-" version ".tar.xz")))) (arguments '(#:configure-flags '("-DLIBOMP_USE_HWLOC=ON" "-DOPENMP_TEST_C_COMPILER=clang" "-DOPENMP_TEST_CXX_COMPILER=clang++" ;; Work around faulty target detection, fixed in 14: ;; https://github.com/llvm/llvm-project/issues/52910 "-DLIBOMPTARGET_BUILD_AMDGCN_BCLIB=OFF") #:test-target "check-libomp")) (native-inputs (modify-inputs (package-native-inputs libomp-14) (replace "clang" clang-13) (replace "llvm" llvm-13))))) (define-public clang-toolchain-13 (make-clang-toolchain clang-13 libomp-13)) (define-public llvm-12 (package (inherit llvm-13) (version "12.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1pzx9zrmd7r3481sbhwvkms68fwhffpp4mmz45dgrkjpyl2q96kx")))) (arguments (substitute-keyword-arguments (package-arguments llvm-13) ((#:phases phases) #~(modify-phases #$phases #$@(if (assoc "config" (package-native-inputs this-package)) #~((add-after 'unpack 'update-config (lambda* (#:key inputs native-inputs #:allow-other-keys) (let ((config.guess (search-input-file (or inputs native-inputs) "/bin/config.guess"))) (copy-file config.guess "cmake/config.guess"))))) #~()) (add-before 'build 'shared-lib-workaround ;; Even with CMAKE_SKIP_BUILD_RPATH=FALSE, llvm-tblgen ;; doesn't seem to get the correct rpath to be able to run ;; from the build directory. Set LD_LIBRARY_PATH as a ;; workaround. (lambda _ (setenv "LD_LIBRARY_PATH" (string-append (getcwd) "/lib")))))))))) (define-public clang-runtime-12 (clang-runtime-from-llvm llvm-12 "1950rg294izdwkaasi7yjrmadc9mzdd5paf0q63jjcq2m3rdbj5l" '("clang-runtime-13-glibc-2.36-compat.patch"))) (define-public clang-12 (clang-from-llvm llvm-12 clang-runtime-12 "0px4gl27az6cdz6adds89qzdwb1cqpjsfvrldbz9qvpmphrj34bf" #:legacy-build-shared-libs? #t #:patches '("clang-12.0-libc-search-path.patch") #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-12))) (sha256 (base32 "1r9a4fdz9ci58b5z2inwvm4z4cdp6scrivnaw05dggkxz7yrwrb5"))))) (define-public libomp-12 (package (inherit libomp-13) (version (package-version llvm-12)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "14dh0r6h2xh747ffgnsl4z08h0ri04azi9vf79cbz7ma1r27kzk0")) (file-name (string-append "libomp-" version ".tar.xz")))) (arguments '(#:configure-flags '("-DLIBOMP_USE_HWLOC=ON" "-DOPENMP_TEST_C_COMPILER=clang" "-DOPENMP_TEST_CXX_COMPILER=clang++") #:test-target "check-libomp")) (native-inputs (modify-inputs (package-native-inputs libomp-13) (replace "clang" clang-12) (replace "llvm" llvm-12))))) (define-public clang-toolchain-12 (make-clang-toolchain clang-12 libomp-12)) (define-public llvm-11 (package (inherit llvm-12) (version "11.1.0") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (patches (search-patches "llvm-8-missing-include.patch")) (sha256 (base32 "199yq3a214avcbi4kk2q0ajriifkvsr0l2dkx3a666m033ihi1ff")))))) (define-public clang-runtime-11 (clang-runtime-from-llvm llvm-11 "0x1j8ngf1zj63wlnns9vlibafq48qcm72p4jpaxkmkb4qw0grwfy" '("clang-runtime-13-glibc-2.36-compat.patch"))) (define-public clang-11 (clang-from-llvm llvm-11 clang-runtime-11 "12sm91qx2m79cvj75a9aazf2x8xybjbd593dv6v7rxficpq8i0ha" #:legacy-build-shared-libs? #t #:patches '("clang-11.0-libc-search-path.patch") #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-11))) (sha256 (base32 "18n1w1hkv931xzq02b34wglbv6zd6sd0r5kb8piwvag7klj7qw3n"))))) (define-public libomp-11 (package (inherit libomp-12) (version (package-version llvm-11)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "0bh5cswgpc79awlq8j5i7hp355adaac7s6zaz0zwp6mkflxli1yi")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-12) (replace "clang" clang-11) (replace "llvm" llvm-11))))) (define-public clang-toolchain-11 (make-clang-toolchain clang-11 libomp-11)) (define-public llvm-10 (package (inherit llvm-11) (version "10.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (patches (search-patches "llvm-8-missing-include.patch")) (sha256 (base32 "1wydhbp9kyjp5y0rc627imxgkgqiv3dfirbqil9dgpnbaw5y7n65")))) (native-inputs `(("python" ,python-wrapper) ("perl" ,perl) ;; In llvm-11 riscv64 support was added manually to config.guess. ,@(if (target-riscv64?) `(("config" ,config)) '()))))) (define-public clang-runtime-10 (clang-runtime-from-llvm llvm-10 "1yjqjri753w0fzmxcyz687nvd97sbc9rsqrxzpq720na47hwh3fr" '("clang-runtime-13-glibc-2.36-compat.patch"))) (define-public clang-10 (clang-from-llvm llvm-10 clang-runtime-10 "091bvcny2lh32zy8f3m9viayyhb2zannrndni7325rl85cwgr6pr" #:legacy-build-shared-libs? #t #:patches '("clang-10.0-libc-search-path.patch") #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-10))) (sha256 (base32 "06n1yp638rh24xdxv9v2df0qajxbjz4w59b7dd4ky36drwmpi4yh"))))) (define-public libomp-10 (package (inherit libomp-11) (version (package-version llvm-10)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "0i4bn84lkpm5w3qkpvwm5z6jdj8fynp7d3bcasa1xyq4is6757yi")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-11) (replace "clang" clang-10) (replace "llvm" llvm-10))))) (define-public clang-toolchain-10 (make-clang-toolchain clang-10 libomp-10)) (define-public llvm-9 (package (inherit llvm-10) (version "9.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "16hwp3qa54c3a3v7h8nlw0fh5criqh0hlr1skybyk0cz70gyx880")) (patches (search-patches "llvm-8-missing-include.patch" "llvm-9-fix-bitcast-miscompilation.patch" "llvm-9-fix-scev-miscompilation.patch" "llvm-9-fix-lpad-miscompilation.patch")))) (arguments (if (target-riscv64?) (substitute-keyword-arguments (package-arguments llvm-10) ((#:phases phases) #~(modify-phases #$phases (add-after 'unpack 'patch-dsymutil-link (lambda _ (substitute* "tools/dsymutil/CMakeLists.txt" (("endif\\(APPLE\\)") (string-append "endif(APPLE)\n\n" "if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES \"riscv64\")\n" " target_link_libraries(dsymutil PRIVATE atomic)\n" "endif()")))))))) (package-arguments llvm-10))))) (define-public clang-runtime-9 (clang-runtime-from-llvm llvm-9 "0xwh79g3zggdabxgnd0bphry75asm1qz7mv3hcqihqwqr6aspgy2" '("clang-runtime-9-libsanitizer-mode-field.patch" "clang-runtime-9-glibc-2.36-compat.patch"))) (define-public clang-9 (clang-from-llvm llvm-9 clang-runtime-9 "0ls2h3iv4finqyflyhry21qhc9cm9ga7g1zq21020p065qmm2y2p" #:legacy-build-shared-libs? #t #:patches '("clang-9.0-libc-search-path.patch"))) (define-public libomp-9 (package (inherit libomp-10) (version (package-version llvm-9)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "1knafnpp0f7hylx8q20lkd6g1sf0flly572dayc5d5kghh7hd52w")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-10) (replace "clang" clang-9) (replace "llvm" llvm-9))))) (define-public clang-toolchain-9 (make-clang-toolchain clang-9 libomp-9)) (define-public llvm-8 (package (inherit llvm-9) (version "8.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1rvm5gqp5v8hfn17kqws3zhk94w4kxndal12bqa0y57p09nply24")) (patches (search-patches "llvm-8-fix-build-with-gcc-10.patch" "llvm-8-missing-include.patch")))) (license license:ncsa))) (define-public clang-runtime-8 (clang-runtime-from-llvm llvm-8 "0dqqf8f930l8gag4d9qjgn1n0pj0nbv2anviqqhdi1rkhas8z0hi" '("clang-runtime-9-libsanitizer-mode-field.patch" "clang-runtime-9-glibc-2.36-compat.patch"))) (define-public clang-8 (clang-from-llvm llvm-8 clang-runtime-8 "0ihnbdl058gvl2wdy45p5am55bq8ifx8m9mhcsgj9ax8yxlzvvvh" #:legacy-build-shared-libs? #t #:patches '("clang-8.0-libc-search-path.patch"))) (define-public libomp-8 (package (inherit libomp-9) (version (package-version llvm-8)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "0b3jlxhqbpyd1nqkpxjfggm5d9va5qpyf7d4i5y7n4a1mlydv19y")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-9) (replace "clang" clang-8) (replace "llvm" llvm-8))) (license license:ncsa))) (define-public clang-toolchain-8 (make-clang-toolchain clang-8 libomp-8)) (define-public llvm-7 (package (inherit llvm-8) (version "7.1.0") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "0r1p5didv4rkgxyvbkyz671xddg6i3dxvbpsi1xxipkla0l9pk0v")))))) (define-public clang-runtime-7 (clang-runtime-from-llvm llvm-7 "1n48p8gjarihkws0i2bay5w9bdwyxyxxbpwyng7ba58jb30dlyq5" '("clang-runtime-9-libsanitizer-mode-field.patch" "clang-runtime-9-glibc-2.36-compat.patch"))) (define-public clang-7 (clang-from-llvm llvm-7 clang-runtime-7 "0vc4i87qwxnw9lci4ayws9spakg0z6w5w670snj9f8g5m9rc8zg9" #:legacy-build-shared-libs? #t #:patches '("clang-7.0-libc-search-path.patch"))) (define-public libomp-7 (package (inherit libomp-8) (version (package-version llvm-7)) (source (origin (method url-fetch) (uri (llvm-uri "openmp" version)) (sha256 (base32 "1dg53wzsci2kra8lh1y0chh60h2l8h1by93br5spzvzlxshkmrqy")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-8) (replace "clang" clang-7) (replace "llvm" llvm-7))))) (define-public clang-toolchain-7 (make-clang-toolchain clang-7 libomp-7)) (define-public llvm-6 (package (inherit llvm-7) (version "6.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1qpls3vk85lydi5b4axl0809fv932qgsqgdgrk098567z4jc7mmn")))))) (define-public clang-runtime-6 (clang-runtime-from-llvm llvm-6 "1fcr3jn24yr8lh36nc0c4ikli4744i2q9m1ik67p1jymwwaixkgl" '("clang-runtime-9-libsanitizer-mode-field.patch" "clang-runtime-9-glibc-2.36-compat.patch"))) (define-public clang-6 (clang-from-llvm llvm-6 clang-runtime-6 "0rxn4rh7rrnsqbdgp4gzc8ishbkryhpl1kd3mpnxzpxxhla3y93w" #:legacy-build-shared-libs? #t #:patches '("clang-6.0-libc-search-path.patch"))) (define-public libomp-6 (package (inherit libomp-7) (version (package-version llvm-6)) (source (origin (method url-fetch) (uri (string-append "https://releases.llvm.org/" version "/openmp-" version ".src.tar.xz")) (sha256 (base32 "0nhwfba9c351r16zgyjyfwdayr98nairky3c2f0b2lc360mwmbv6")) (file-name (string-append "libomp-" version ".tar.xz")))) (native-inputs (modify-inputs (package-native-inputs libomp-7) (replace "clang" clang-6) (replace "llvm" llvm-6))))) (define-public clang-toolchain-6 (make-clang-toolchain clang-6 libomp-6)) (define-public llvm-3.9.1 (package (inherit llvm-6) (name "llvm") (version "3.9.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1vi9sf7rx1q04wj479rsvxayb6z740iaz3qniwp266fgp5a07n8z")))) (outputs '("out")) (arguments (substitute-keyword-arguments (package-arguments llvm) ((#:phases phases) #~(modify-phases #$phases (add-before 'build 'shared-lib-workaround ;; Even with CMAKE_SKIP_BUILD_RPATH=FALSE, llvm-tblgen ;; doesn't seem to get the correct rpath to be able to run ;; from the build directory. Set LD_LIBRARY_PATH as a ;; workaround. (lambda _ (setenv "LD_LIBRARY_PATH" (string-append (getcwd) "/lib")))) (delete 'install-opt-viewer))))))) (define-public clang-runtime-3.9.1 (clang-runtime-from-llvm llvm-3.9.1 "16gc2gdmp5c800qvydrdhsp0bzb97s8wrakl6i8a4lgslnqnf2fk" '("clang-runtime-3.9-libsanitizer-mode-field.patch" "clang-runtime-asan-build-fixes.patch" "clang-runtime-esan-build-fixes.patch" "clang-3.5-libsanitizer-ustat-fix.patch"))) (define-public clang-3.9.1 (clang-from-llvm llvm-3.9.1 clang-runtime-3.9.1 "0qsyyb40iwifhhlx9a3drf8z6ni6zwyk3bvh0kx2gs6yjsxwxi76" #:legacy-build-shared-libs? #t #:patches '("clang-3.8-libc-search-path.patch"))) (define-public llvm-3.8 (package (inherit llvm-3.9.1) (name "llvm") (version "3.8.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf")) (patches (search-patches "llvm-3.x.1-fix-build-with-gcc.patch")))))) (define-public clang-runtime-3.8 (clang-runtime-from-llvm llvm-3.8 "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d" '("clang-runtime-asan-build-fixes.patch" "clang-runtime-3.8-libsanitizer-mode-field.patch" "clang-3.5-libsanitizer-ustat-fix.patch"))) (define-public clang-3.8 (clang-from-llvm llvm-3.8 clang-runtime-3.8 "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc" #:legacy-build-shared-libs? #t #:patches '("clang-3.8-libc-search-path.patch"))) (define-public llvm-3.7 (package (inherit llvm-3.8) (version "3.7.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 "1masakdp9g2dan1yrazg7md5am2vacbkb3nahb3dchpc1knr8xxy")) (patches (search-patches "llvm-3.x.1-fix-build-with-gcc.patch")))))) (define-public clang-runtime-3.7 (clang-runtime-from-llvm llvm-3.7 "10c1mz2q4bdq9bqfgr3dirc6hz1h3sq8573srd5q5lr7m7j6jiwx" '("clang-runtime-asan-build-fixes.patch" "clang-runtime-3.8-libsanitizer-mode-field.patch" "clang-3.5-libsanitizer-ustat-fix.patch" "clang-runtime-3.7-fix-build-with-python3.patch"))) (define-public clang-3.7 (clang-from-llvm llvm-3.7 clang-runtime-3.7 "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn" #:legacy-build-shared-libs? #t #:patches '("clang-3.5-libc-search-path.patch"))) (define-public llvm-3.6 (package (inherit llvm-3.7) (version "3.6.2") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (patches (search-patches "llvm-3.6-fix-build-with-gcc-10.patch")) (sha256 (base32 "153vcvj8gvgwakzr4j0kndc0b7wn91c2g1vy2vg24s6spxcc23gn")))))) (define-public llvm-3.5 (package (inherit llvm-3.6) (version "3.5.2") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (patches (search-patches "llvm-3.5-fix-clang-build-with-gcc5.patch")) (sha256 (base32 "0xf5q17kkxsrm2gsi93h4pwlv663kji73r2g4asb97klsmb626a4")))))) (define-public clang-runtime-3.5 (let ((runtime (clang-runtime-from-llvm llvm-3.5 "1hsdnzzdr5kglz6fnv3lcsjs222zjsy14y8ax9dy6zqysanplbal" '("clang-runtime-asan-build-fixes.patch" "clang-runtime-3.5-libsanitizer-mode-field.patch" "clang-3.5-libsanitizer-ustat-fix.patch")))) (package/inherit runtime (arguments (substitute-keyword-arguments (package-arguments runtime) ((#:phases phases '%standard-phases) `(modify-phases ,phases ;; glibc no longer includes rpc/xdr.h, so we use the headers from ;; libtirpc. (add-after 'unpack 'find-rpc-includes (lambda* (#:key inputs #:allow-other-keys) (setenv "CPATH" (string-append (search-input-directory inputs "/include/tirpc") ":" (or (getenv "CPATH") ""))) (setenv "CPLUS_INCLUDE_PATH" (string-append (search-input-directory inputs "/include/tirpc") ":" (or (getenv "CPLUS_INCLUDE_PATH") ""))))))))) (inputs `(("libtirpc" ,libtirpc) ("llvm" ,llvm-3.5)))))) (define-public clang-3.5 (clang-from-llvm llvm-3.5 clang-runtime-3.5 "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg" #:legacy-build-shared-libs? #t #:patches '("clang-3.5-libc-search-path.patch"))) (define-public llvm-16 (package (inherit llvm-15) (version "16.0.6") (source (llvm-monorepo version)) (arguments (substitute-keyword-arguments (package-arguments llvm-15) ;; The build daemon goes OOM on i686-linux on this phase. ((#:phases phases #~'%standard-phases) (if (target-x86-32?) #~(modify-phases #$phases (delete 'make-dynamic-linker-cache)) phases)))))) (define-public clang-runtime-16 (clang-runtime-from-llvm llvm-16)) (define-public clang-16 (clang-from-llvm llvm-16 clang-runtime-16 #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-16))) (sha256 (base32 "0cbgffciql06a1i0ybyyqbnkkr4g7x8cxaar5a5v3415vd27hk0p"))))) (define-public libomp-16 (package (inherit libomp-15) (version (package-version llvm-16)) (source (llvm-monorepo version)) (native-inputs (modify-inputs (package-native-inputs libomp-15) (replace "clang" clang-16) (replace "llvm" llvm-16))))) (define-public clang-toolchain-16 (make-clang-toolchain clang-16 libomp-16)) (define-public llvm-17 (package (inherit llvm-15) (version "17.0.6") (source (llvm-monorepo version)) (arguments (substitute-keyword-arguments (package-arguments llvm-15) ;; The build daemon goes OOM on i686-linux on this phase. ((#:phases phases #~'%standard-phases) (if (target-x86-32?) #~(modify-phases #$phases (delete 'make-dynamic-linker-cache)) phases)))))) (define-public clang-runtime-17 (clang-runtime-from-llvm llvm-17)) (define-public clang-17 (clang-from-llvm llvm-17 clang-runtime-17 #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-17))) (sha256 (base32 "1f8szx762c325916gjxb5lw7zxyidynwnvx6fxxqscsx8514cxxa"))))) (define-public libomp-17 (package (inherit libomp-15) (version (package-version llvm-17)) (source (llvm-monorepo version)) (native-inputs (modify-inputs (package-native-inputs libomp-15) (replace "clang" clang-17) (replace "llvm" llvm-17))))) (define-public clang-toolchain-17 (make-clang-toolchain clang-17 libomp-17)) (define-public llvm-18 (package (inherit llvm-15) (version "18.1.8") (source (llvm-monorepo version)) (arguments (substitute-keyword-arguments (package-arguments llvm-15) ;; The build daemon goes OOM on i686-linux on this phase. ((#:phases phases #~'%standard-phases) (if (target-x86-32?) #~(modify-phases #$phases (delete 'make-dynamic-linker-cache)) phases)))))) (define-public clang-runtime-18 (clang-runtime-from-llvm llvm-18)) (define-public clang-18 (clang-from-llvm llvm-18 clang-runtime-18 #:tools-extra (origin (method url-fetch) (uri (llvm-uri "clang-tools-extra" (package-version llvm-18))) (sha256 (base32 "1wd7y1a0db4y51swlq6dmm9hrv8pvmv158yi9f10dlayv7y7g275"))))) (define-public libomp-18 (package (inherit libomp-15) (version (package-version llvm-18)) (source (llvm-monorepo version)) (native-inputs (modify-inputs (package-native-inputs libomp-15) (replace "clang" clang-18) (replace "llvm" llvm-18))))) (define-public clang-toolchain-18 (make-clang-toolchain clang-18 libomp-18)) ;; Default LLVM and Clang version. (define-public libomp libomp-13) (define-public llvm llvm-13) (define-public clang-runtime clang-runtime-13) (define-public clang clang-13) (define-public clang-toolchain clang-toolchain-13) (define-public llvm-for-rocm (package ;; Based on LLVM 14 as of v5.0.0 (inherit llvm-14) (name "llvm-for-rocm") (version "5.6.0") ;this must match '%rocm-version' (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/RadeonOpenCompute/llvm-project.git") (commit (string-append "rocm-" version)))) (file-name (git-file-name name version)) (sha256 (base32 "1kg6q6aqijjrwaznj0gr3nd01gykrnqqnk8vz8wyfifr18l9jrgx")))) (arguments (substitute-keyword-arguments (package-arguments llvm-14) ((#:configure-flags flags) #~(list"-DLLVM_ENABLE_PROJECTS=llvm;clang;lld" "-DLLVM_TARGETS_TO_BUILD=AMDGPU;X86" "-DCMAKE_SKIP_BUILD_RPATH=FALSE" "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE" "-DBUILD_SHARED_LIBS:BOOL=TRUE" "-DLLVM_VERSION_SUFFIX=")))) (properties `((hidden? . #t) ,@(package-properties llvm-14))))) (define-public libunwind-headers (package (name "libunwind-headers") (version "13.0.0") (source (origin (method url-fetch) (uri (llvm-uri "libunwind" version)) (sha256 (base32 "1qb5ickp7qims5q7sxacj3fwq1kklvnl94k3v9hpl5qn284iky1n")))) (build-system cmake-build-system) (arguments '(#:phases (modify-phases (map (lambda (phase) (assq phase %standard-phases)) '(set-paths unpack)) (add-after 'unpack 'install (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (mkdir out) (copy-recursively "include" (string-append out "/include")))))))) (home-page "https://clang.llvm.org/docs/Toolchain.html") (synopsis "LLVM libunwind header files") (description "This package contains header files for the LLVM C++ unwinding library.") (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))) (license license:asl2.0))) ;with LLVM exceptions (define-public lld-15 (package (name "lld") (version (package-version llvm-15)) (source (llvm-monorepo version)) (build-system cmake-build-system) (inputs (list llvm-15)) (arguments '(#:build-type "Release" ;; TODO: Tests require the lit tool, which isn't installed by the LLVM ;; package. #:tests? #f #:phases (modify-phases %standard-phases (add-after 'unpack 'change-directory (lambda _ (chdir "lld")))))) (home-page "https://lld.llvm.org/") (synopsis "Linker from the LLVM project") (description "LLD is a high-performance linker, built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project.") (license license:asl2.0))) ; With LLVM exception (define-public lld-14 (package (inherit lld-15) (version "14.0.6") (source (llvm-monorepo version)) (inputs (list llvm-14)))) (define-public lld-13 (package (inherit lld-14) (version "13.0.1") (source (origin (method url-fetch) (uri (llvm-uri "lld" version)) (sha256 (base32 "1yscckcszfr234k4svhybdbsnz6w65x8pldl6c2nhyxzx12zfsk6")))) (native-inputs ;; Note: check <https://bugs.llvm.org/show_bug.cgi?id=49228> to see ;; whether this is still necessary. (list libunwind-headers)) (inputs (list llvm-13)) (arguments '(#:build-type "Release" ;; TODO: Tests require the lit tool, which isn't installed by the LLVM ;; package. #:tests? #f)) (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))))) (define-public lld-12 (package (inherit lld-13) (version "12.0.1") (source (origin (method url-fetch) (uri (llvm-uri "lld" version)) (sha256 (base32 "0qg3fgc7wj34hdkqn21y03zcmsdd01szhhm1hfki63iifrm3y2v9")))) (inputs (modify-inputs (package-inputs lld) (replace "llvm" llvm-12))))) (define-public lld-11 (package (inherit lld-12) (version "11.0.0") (source (origin (method url-fetch) (uri (llvm-uri "lld" version)) (sha256 (base32 "077xyh7sij6mhp4dc4kdcmp9whrpz332fa12rwxnzp3wgd5bxrzg")))) (inputs (modify-inputs (package-inputs lld) (replace "llvm" llvm-11))))) (define-public lld-16 (package (inherit lld-15) (version (package-version llvm-16)) (source (llvm-monorepo version)) (inputs (list llvm-16)))) (define-public lld-17 (package (inherit lld-15) (version (package-version llvm-17)) (source (llvm-monorepo version)) (inputs (list llvm-17)))) (define-public lld-18 (package (inherit lld-15) (version (package-version llvm-18)) (source (llvm-monorepo version)) (inputs (list llvm-18)))) (define-public lld lld-14) (define* (make-lld-wrapper lld #:key lld-as-ld?) "Return a LLD wrapper. When LLD-AS-LD? is true, create a 'ld' symlink that points to 'lld'." (package (inherit lld) (name (if lld-as-ld? "lld-as-ld-wrapper" "lld-wrapper")) (source #f) (native-inputs '()) (inputs (list (make-ld-wrapper "ld.lld-wrapper" #:binutils lld #:linker "ld.lld") (make-ld-wrapper "lld-wrapper" #:binutils lld #:linker "lld"))) (propagated-inputs '()) (build-system trivial-build-system) (arguments (list #:builder #~(let ((ld.lld (string-append #$(this-package-input "ld.lld-wrapper") "/bin/ld.lld")) (lld (string-append #$(this-package-input "lld-wrapper") "/bin/lld"))) (mkdir #$output) (mkdir (string-append #$output "/bin")) (symlink ld.lld (string-append #$output "/bin/ld.lld")) (symlink lld (string-append #$output "/bin/lld")) (when #$lld-as-ld? (symlink ld.lld (string-append #$output "/bin/ld")))))) (synopsis "LLD linker wrapper") (description "This is a linker wrapper for LLD; like @code{ld-wrapper}, it wraps the linker to add any missing @code{-rpath} flags, and to detect any misuse of libraries outside of the store."))) ;;; A LLD wrapper suitable to use with -fuse-ld and GCC or with Clang. (define-public lld-wrapper (make-lld-wrapper lld)) ;;; A LLD wrapper that can be used as a (near) drop-in replacement to GNU ld. (define-public lld-as-ld-wrapper-15 (make-lld-wrapper lld-15 #:lld-as-ld? #t)) (define-public lld-as-ld-wrapper (make-lld-wrapper lld #:lld-as-ld? #t)) (define-public lldb (package (name "lldb") (version (package-version llvm-17)) (source (llvm-monorepo version)) (build-system cmake-build-system) (arguments (list #:configure-flags #~(list "-DOPENMP_TEST_CXX_COMPILER=clang++") #:phases #~(modify-phases %standard-phases (add-after 'unpack 'chdir-to-source (lambda _ (chdir "lldb")))))) (native-inputs (list pkg-config swig)) (inputs (list clang-17 llvm-17 ;; Optional (but recommended) inputs. ncurses libedit xz libxml2 lua python)) (home-page "https://lldb.llvm.org/") (synopsis "Low level debugger") (description "LLDB is a high performance debugger built as a set of reusable components which highly leverage existing libraries in the larger LLVM project.") (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))) (license license:asl2.0))) ;with LLVM exceptions (define-public libcxx (package (name "libcxx") (version (package-version llvm-15)) (source (llvm-monorepo version)) (build-system cmake-build-system) (arguments (list #:tests? #f #:configure-flags #~(list "-DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi" "-DCMAKE_C_COMPILER=clang" "-DCMAKE_CXX_COMPILER=clang++" ;; libc++.so is actually a GNU ld style linker script, however, ;; CMake still tries to fix the RUNPATH of it during the install ;; step. This argument tells CMake to use the install directory ;; as RUNPATH and don't attempt to patch it. ;; See also: https://gitlab.kitware.com/cmake/cmake/-/issues/22963 "-DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE") #:phases #~(modify-phases %standard-phases (add-after 'unpack 'enter-subdirectory (lambda _ (chdir "runtimes"))) (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH (lambda* (#:key inputs #:allow-other-keys) (let ((gcc (assoc-ref inputs "gcc"))) ;; Hide GCC's C++ headers so that they do not interfere with ;; the ones we are attempting to build. (setenv "CPLUS_INCLUDE_PATH" (string-join (delete (string-append gcc "/include/c++") (string-split (getenv "CPLUS_INCLUDE_PATH") #\:)) ":")) (format #t "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" (getenv "CPLUS_INCLUDE_PATH")) #t)))))) (native-inputs (list clang llvm python)) (home-page "https://libcxx.llvm.org") (synopsis "C++ standard library") (description "This package provides an implementation of the C++ standard library for use with Clang, targeting C++11, C++14 and above.") (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))) (license license:expat))) ;; Libcxx files specifically used by PySide2. (define-public libcxx-6 (package (inherit libcxx) (version (package-version llvm-6)) (source (origin (method url-fetch) (uri (llvm-uri "libcxx" version)) (sha256 (base32 "0rzw4qvxp6qx4l4h9amrq02gp7hbg8lw4m0sy3k60f50234gnm3n")))) (arguments (list #:phases #~(modify-phases %standard-phases (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH (lambda* (#:key inputs #:allow-other-keys) (let ((gcc (assoc-ref inputs "gcc"))) ;; Hide GCC's C++ headers so that they do not interfere with ;; the ones we are attempting to build. (setenv "CPLUS_INCLUDE_PATH" (string-join (delete (string-append gcc "/include/c++") (string-split (getenv "CPLUS_INCLUDE_PATH") #\:)) ":")) (format #t "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" (getenv "CPLUS_INCLUDE_PATH")) #t)))))) (native-inputs (list clang-6 llvm-6)))) (define-public libcxxabi-6 (package (name "libcxxabi") (version "6.0.1") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/llvm/llvm-project") (commit (string-append "llvmorg-" version)))) (file-name (git-file-name name version)) (sha256 (base32 "0ki6796b5z08kh3a3rbysr5wwb2dkl6wal5dzd03i4li5xfkvx1g")))) (build-system cmake-build-system) (arguments (list #:configure-flags #~(list (string-append "-DLIBCXXABI_LIBCXX_INCLUDES=" #$(this-package-native-input "libcxx") "/include") "-DCMAKE_C_COMPILER=clang" "-DCMAKE_CXX_COMPILER=clang++") #:phases #~(modify-phases (@ (guix build cmake-build-system) %standard-phases) (add-after 'unpack 'chdir (lambda _ (chdir "libcxxabi"))) (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH (lambda* (#:key inputs #:allow-other-keys) (let ((gcc (assoc-ref inputs "gcc"))) ;; Hide GCC's C++ headers so that they do not interfere with ;; the ones we are attempting to build. (setenv "CPLUS_INCLUDE_PATH" (string-join (cons (string-append (assoc-ref inputs "libcxx") "/include/c++/v1") (delete (string-append gcc "/include/c++") (string-split (getenv "CPLUS_INCLUDE_PATH") #\:))) ":")) (format #true "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" (getenv "CPLUS_INCLUDE_PATH"))))) (add-after 'install 'install-headers (lambda* (#:key outputs #:allow-other-keys) (let ((include-dir (string-append (assoc-ref outputs "out") "/include"))) (install-file "../libcxxabi/include/__cxxabi_config.h" include-dir) (install-file "../libcxxabi/include/cxxabi.h" include-dir))))))) (native-inputs (list clang-6 llvm-6 libcxx-6)) (home-page "https://libcxxabi.llvm.org") (synopsis "C++ standard library support") (description "This package provides an implementation of low level support for a standard C++ library.") (license license:expat))) (define-public libcxx+libcxxabi-6 (package (inherit libcxx-6) (name "libcxx+libcxxabi") (version (package-version libcxx-6)) (arguments (list #:configure-flags #~(list "-DLIBCXX_CXX_ABI=libcxxabi" (string-append "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=" #$(this-package-native-input "libcxxabi") "/include")) #:phases #~(modify-phases (@ (guix build cmake-build-system) %standard-phases) (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH (lambda* (#:key inputs #:allow-other-keys) (let ((gcc (assoc-ref inputs "gcc"))) ;; Hide GCC's C++ headers so that they do not interfere with ;; the ones we are attempting to build. (setenv "CPLUS_INCLUDE_PATH" (string-join (delete (string-append gcc "/include/c++") (string-split (getenv "CPLUS_INCLUDE_PATH") #\:)) ":")) (format #true "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" (getenv "CPLUS_INCLUDE_PATH")))))))) (native-inputs (list clang-6 llvm-6 libcxxabi-6)))) ;; WARNING: This package is a dependency of mesa. (define-public libclc (package (name "libclc") (version (package-version llvm-18)) (source (llvm-monorepo version)) (build-system cmake-build-system) (arguments (list #:configure-flags #~(list (string-append "-DLLVM_CLANG=" (assoc-ref %build-inputs "clang") "/bin/clang") (string-append "-DLLVM_SPIRV=" (assoc-ref %build-inputs "spirv-llvm-translator") "/bin/llvm-spirv")) #:phases #~(modify-phases %standard-phases (add-after 'unpack 'enter-subdirectory (lambda _ (chdir "libclc"))) (add-after 'enter-subdirectory 'skip-clspv-tests (lambda _ (substitute* "CMakeLists.txt" (("ptx\\.\\*") "[ptx|clspv].*"))))))) (propagated-inputs (list spirv-llvm-translator spirv-tools)) (native-inputs (list clang-18 llvm-18 python)) (home-page "https://libclc.llvm.org") (synopsis "Libraries for the OpenCL programming language") (description "This package provides an implementation of the OpenCL library requirements according to version 1.1 of the OpenCL specification.") (properties `((release-monitoring-url . ,%llvm-release-monitoring-url))) ;; Apache license 2.0 with LLVM exception (license license:asl2.0))) (define-public python-llvmlite (package (name "python-llvmlite") (version "0.39.1") (source (origin (method url-fetch) (uri (pypi-uri "llvmlite" version)) (sha256 (base32 "0wnm0l0301sj8xp6skg3ci1gii56x5dk6l2x88f2c1g8h9ybsfml")))) (build-system python-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-before 'build 'set-compiler/linker-flags (lambda* (#:key inputs #:allow-other-keys) (let ((llvm (assoc-ref inputs "llvm"))) ;; Refer to ffi/Makefile.linux. (setenv "CPPFLAGS" "-fPIC") (setenv "LDFLAGS" (string-append "-Wl,-rpath=" llvm "/lib")))))))) (inputs (list (let* ((patches-commit "a4a19e8af2c5ef9b9901f20193e4be070726da97") (patch-uri (lambda (name) (string-append "https://raw.githubusercontent.com/numba/" "llvmlite/" patches-commit "/conda-recipes/" name))) (patch-origin (lambda (name hash) (origin (method url-fetch) (uri (patch-uri name)) (sha256 (base32 hash))))) (arch-independent-patches (list (patch-origin "partial-testing.patch" "0g3nkci87knvmn7piqhmh4bcc65ff8r921cvfcibyiv65klv3syg") (patch-origin "0001-Revert-Limit-size-of-non-GlobalValue-name.patch" "0n4k7za0smx6qwdipsh6x5lm7bfvzzb3p9r8q1zq1dqi4na21295")))) (package (inherit llvm-11) (source (origin (inherit (package-source llvm-11)) (patches (if (string=? "aarch64-linux" (%current-system)) `(,(patch-origin "intel-D47188-svml-VF_LLVM9.patch" "0gnnlfxr8p1a7ls93hzcpfqpa8r0icypfwj8l9cmkslq5sz8p64r") ,@arch-independent-patches ,@(origin-patches (package-source llvm-11))) `(,(patch-origin "intel-D47188-svml-VF.patch" "0gnnlfxr8p1a7ls93hzcpfqpa8r0icypfwj8l9cmkslq5sz8p64r") ,(patch-origin "expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch" "0jxhjkkwwi1cy898l2n57l73ckpw0v73lqnrifp7r1mwpsh624nv") ,@arch-independent-patches ,@(origin-patches (package-source llvm-11))))))))))) (home-page "https://llvmlite.pydata.org") (synopsis "Wrapper around basic LLVM functionality") (description "This package provides a Python binding to LLVM for use in Numba.") (license license:bsd-3))) (define-public (clang-python-bindings clang) "Return a package for the Python bindings of CLANG." (package (inherit clang) (name "python-clang") (build-system python-build-system) (outputs '("out")) (arguments (list #:phases #~(modify-phases %standard-phases (add-before 'build 'change-directory (lambda _ (chdir "bindings/python"))) (add-before 'build 'create-setup-py (lambda _ ;; Generate a basic "setup.py", enough so it can be ;; built and installed. (with-output-to-file "setup.py" (lambda () (format #true "from setuptools import setup setup(name=\"clang\", version=\"~a\", packages=[\"clang\"])\n" #$(package-version this-package)))))) (add-before 'build 'set-libclang-file-name (lambda* (#:key inputs #:allow-other-keys) ;; Record the absolute file name of libclang.so. (let ((libclang (search-input-file inputs "/lib/libclang.so"))) (substitute* "clang/cindex.py" (("libclang\\.so") libclang)))))))) (inputs (list clang)) (synopsis "Python bindings to libclang"))) (define-public python-clang-10 (clang-python-bindings clang-10)) (define-public python-clang-11 (clang-python-bindings clang-11)) (define-public python-clang-12 (clang-python-bindings clang-12)) (define-public python-clang-13 (clang-python-bindings clang-13)) (define-public emacs-clang-format (package (inherit clang) (name "emacs-clang-format") (build-system emacs-build-system) (inputs (list clang)) (propagated-inputs '()) (arguments `(#:phases (modify-phases %standard-phases (add-after 'unpack 'configure (lambda* (#:key inputs #:allow-other-keys) (let ((clang-format (search-input-file inputs "/bin/clang-format"))) (copy-file "tools/clang-format/clang-format.el" "clang-format.el") (emacs-substitute-variables "clang-format.el" ("clang-format-executable" clang-format)))))))) (synopsis "Format code using clang-format") (description "This package filters code through @code{clang-format} to fix its formatting. @code{clang-format} is a tool that formats C/C++/Obj-C code according to a set of style options, see @url{https://clang.llvm.org/docs/ClangFormatStyleOptions.html}."))) (define-public emacs-clang-rename (package (inherit clang) (name "emacs-clang-rename") (build-system emacs-build-system) (inputs (list clang)) (arguments `(#:phases (modify-phases %standard-phases (add-after 'unpack 'configure (lambda* (#:key inputs #:allow-other-keys) (let ((clang-rename (search-input-file inputs "/bin/clang-rename"))) (copy-file "tools/clang-rename/clang-rename.el" "clang-rename.el") (emacs-substitute-variables "clang-rename.el" ("clang-rename-binary" clang-rename)))))))) (synopsis "Rename every occurrence of a symbol using clang-rename") (description "This package renames every occurrence of a symbol at point using @code{clang-rename}."))) ;;; ;;; LLVM variants. ;;; (define-public llvm-for-mesa ;; Note: update the 'clang' input of mesa-opencl when bumping this. (let ((base-llvm llvm-15)) (package (inherit base-llvm) (name "llvm-for-mesa") (arguments (substitute-keyword-arguments (package-arguments base-llvm) ((#:modules modules '((guix build cmake-build-system) (guix build utils))) `((ice-9 regex) (srfi srfi-1) (srfi srfi-26) ,@modules)) ((#:configure-flags cf ''()) #~(cons* ;; AMDGPU is needed by the vulkan drivers. #$(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target) ";AMDGPU") #$@(if (%current-target-system) '("-DBUILD_SHARED_LIBS:BOOL=TRUE" "-DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE") '()) ;; Skipping tools and utils decreases the output by ~100 MiB. "-DLLVM_BUILD_TOOLS=NO" (remove (cut string-match #$(if (%current-target-system) "-DLLVM_(LINK_LLVM_DYLIB|TARGETS_TO_BUILD|INSTALL_UTILS).*" "-DLLVM_(TARGETS_TO_BUILD|INSTALL_UTILS).*") <>) #$cf))) ((#:phases phases '%standard-phases) #~(modify-phases #$phases #$@(if (%current-target-system) '() #~((add-after 'install 'delete-static-libraries ;; If these are just relocated then llvm-config ;; can't find them. (lambda* (#:key outputs #:allow-other-keys) (for-each delete-file (find-files (string-append (assoc-ref outputs "out") "/lib") "\\.a$")))))) ;; llvm-config is how mesa and others find the various ;; libraries and headers they use. (add-after 'install 'build-and-install-llvm-config (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (substitute* "tools/llvm-config/CMakeFiles/llvm-config.dir/link.txt" (((string-append (getcwd) "/build/lib")) (string-append out "/lib"))) (invoke "make" "llvm-config") (install-file "bin/llvm-config" (string-append out "/bin")))))))))))) (define make-ocaml-llvm ;; Make it a memoizing procedure so its callers below don't end up defining ;; two equal-but-not-eq "ocaml-llvm" packages for the default LLVM. (mlambdaq (llvm) (package (inherit llvm) (name "ocaml-llvm") (outputs '("out")) (arguments `(#:configure-flags (list (string-append "-DLLVM_OCAML_EXTERNAL_LLVM_LIBDIR=" (assoc-ref %build-inputs "llvm") "/lib") "-DBUILD_SHARED_LIBS=TRUE" "-DLLVM_OCAML_OUT_OF_TREE=TRUE" (string-append "-DLLVM_OCAML_INSTALL_PATH=" (assoc-ref %outputs "out") "/lib/ocaml/site-lib")) #:phases (modify-phases %standard-phases (replace 'build (lambda _ (invoke "make" "ocaml_all"))) (replace 'install (lambda _ (invoke "cmake" "-P" "bindings/ocaml/cmake_install.cmake")))))) (inputs (list llvm)) (native-inputs (list ocaml ocaml-findlib ocaml-ounit python)) (propagated-inputs (list ocaml-integers ocaml-ctypes)) (synopsis "OCaml bindings to LLVM") (description "This package contains the OCaml bindings distributed with LLVM.")))) (define-public ocaml-llvm (make-ocaml-llvm llvm)) (define-public ocaml-llvm-9 (make-ocaml-llvm llvm-9)) (define-public ocaml-llvm-10 (make-ocaml-llvm llvm-10)) (define-public ocaml-llvm-11 (make-ocaml-llvm llvm-11)) (define-public wllvm (package (name "wllvm") (version "1.3.1") (source (origin (method url-fetch) (uri (pypi-uri "wllvm" version)) (sha256 (base32 "0cf31hixzq5bzkxv91rvadlhrpxzy934134scv4frj85bxbpl19y")))) (build-system pyproject-build-system) (home-page "https://github.com/SRI-CSL/whole-program-llvm") (synopsis "Whole Program LLVM") (description "This package provides a toolkit for building whole-program LLVM bitcode files.") (license license:expat))) (define-public llvm-julia (package (inherit llvm-13) (arguments (substitute-keyword-arguments (package-arguments llvm-13) ((#:configure-flags flags ''()) #~(cons* "-DLLVM_BUILD_LLVM_DYLIB=ON" "-DLLVM_LINK_LLVM_DYLIB=ON" ;; "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=NVPTX" "-DLLVM_VERSION_SUFFIX:STRING=jl" ; Perhaps not needed. #$(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target)) (delete "-DBUILD_SHARED_LIBS:BOOL=TRUE" #$flags))) ((#:build-type _) "Release"))) (properties `((hidden? . #t) ,@(package-properties llvm-13))))) (define llvm-cling ;; To determine which version of LLVM a given release of Cling should use, ;; consult the ;; https://raw.githubusercontent.com/root-project/cling/master/LastKnownGoodLLVMSVNRevision.txt ;; file. (let ((base llvm-15)) ;for a DYLIB build (package/inherit base (name "llvm-cling") (version "13-20240318-01") (source (origin (inherit (package-source base)) (method git-fetch) (uri (git-reference (url "https://github.com/root-project/llvm-project") (commit (string-append "cling-llvm" version)))) (file-name (git-file-name "llvm-cling" version)) (sha256 (base32 "1zh6yp8px9hla7v9i67a6anbph140f8ixxbsz65aj7fizksjs1h3")) (patches (search-patches "clang-cling-13-libc-search-path.patch"))))))) (define clang-cling-runtime (let ((base clang-runtime-13)) (package/inherit base (name "clang-cling-runtime") (version (package-version llvm-cling)) (source (package-source llvm-cling)) (arguments (substitute-keyword-arguments (package-arguments base) ((#:phases phases '%standard-phases) #~(modify-phases #$phases (add-after 'unpack 'change-directory (lambda _ (chdir "compiler-rt"))) (add-after 'install 'delete-static-libraries ;; This reduces the size from 22 MiB to 4 MiB. (lambda _ (for-each delete-file (find-files #$output "\\.a$")))))))) (inputs (modify-inputs (package-inputs base) (replace "llvm" llvm-cling)))))) (define clang-cling (let ((base clang-13)) (package/inherit base (name "clang-cling") (version (package-version llvm-cling)) (source (package-source llvm-cling)) (arguments (substitute-keyword-arguments (package-arguments base) ((#:phases phases '%standard-phases) #~(modify-phases #$phases (add-after 'unpack 'change-directory (lambda _ (chdir "clang"))) (add-after 'install 'delete-static-libraries ;; This reduces the size by half, from 220 MiB to 112 MiB. (lambda _ (for-each delete-file (find-files #$output "\\.a$")))))))) (propagated-inputs (modify-inputs (package-propagated-inputs base) (replace "llvm" llvm-cling) (replace "clang-runtime" clang-cling-runtime)))))) (define-public cling (package (name "cling") (version "1.0") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/root-project/cling") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "17n66wf5yg1xjc94d6yb8g2gydjz0b8cj4a2pn6xrygdvhh09vv1")) ;; Patch submitted upstream here: ;; https://github.com/root-project/cling/pull/433. (patches (search-patches "cling-use-shared-library.patch")))) (build-system cmake-build-system) (arguments (list #:build-type "Release" ;keep the build as lean as possible #:tests? #f ;FIXME: 78 tests fail (out of ~200) #:test-target "check-cling" #:configure-flags #~(list (string-append "-DCLING_CXX_PATH=" (search-input-file %build-inputs "bin/g++")) ;; XXX: The AddLLVM.cmake module expects LLVM_EXTERNAL_LIT to ;; be a Python script, not a shell executable. (string-append "-DLLVM_EXTERNAL_LIT=" (search-input-file %build-inputs "bin/.lit-real"))) #:phases #~(modify-phases %standard-phases (add-after 'unpack 'set-version (lambda _ (make-file-writable "VERSION") (call-with-output-file "VERSION" (lambda (port) (format port "~a~%" #$version))))) (add-after 'unpack 'patch-paths (lambda* (#:key inputs #:allow-other-keys) (substitute* "lib/Interpreter/CIFactory.cpp" (("\\bsed\\b") (which "sed")) ;; This ensures that the default C++ library used by Cling is ;; that of the compiler that was used to build it, rather ;; than that of whatever g++ happens to be on PATH. (("ReadCompilerIncludePaths\\(CLING_CXX_RLTV") (format #f "ReadCompilerIncludePaths(~s" (search-input-file inputs "bin/g++"))) ;; Cling uses libclang's CompilerInvocation::GetResourcesPath ;; to resolve Clang's library prefix, but this fails on Guix ;; because it is relative to the output of cling rather than ;; clang (see: ;; https://github.com/root-project/cling/issues/434). Fully ;; shortcut the logic in this method to return the correct ;; static location. (("static std::string getResourceDir.*" all) (string-append all " return std::string(\"" #$(this-package-input "clang-cling") "/lib/clang/" #$(first (take (string-split (package-version clang-cling) #\-) 1)) ".0.0" ;e.g. 13.0.0 "\");"))) ;; Check for the 'lit' command for the tests, not 'lit.py' ;; (see: https://github.com/root-project/cling/issues/432). (substitute* "CMakeLists.txt" (("lit.py") "lit")))) (add-after 'unpack 'adjust-lit.cfg ;; See: https://github.com/root-project/cling/issues/435. (lambda _ (substitute* "test/lit.cfg" (("config.llvm_tools_dir \\+ '") "config.cling_obj_root + '/bin")))) (add-after 'install 'delete-static-libraries ;; This reduces the size from 17 MiB to 5.4 MiB. (lambda _ (for-each delete-file (find-files #$output "\\.a$"))))))) (native-inputs (list python python-lit)) (inputs (list clang-cling llvm-cling libxcrypt)) (home-page "https://root.cern/cling/") (synopsis "Interactive C++ interpreter") (description "Cling is an interactive C++17 standard compliant interpreter, built on top of LLVM and Clang. Cling can be used as a read-eval-print loop (REPL) to assist with rapid application development. Here's how to print @samp{\"Hello World!\"} using @command{cling}: @example cling '#include <stdio.h>' 'printf(\"Hello World!\\n\");' @end example") (license license:lgpl2.1+))) ;for the combined work