;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Cyril Roelandt ;;; Copyright © 2014 Kevin Lemonnier ;;; Copyright © 2015, 2017 Ludovic Courtès ;;; Copyright © 2015, 2016, 2017, 2018 Efraim Flashner ;;; Copyright © 2016 Nils Gillmann ;;; Copyright © 2017 Marius Bakke ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice ;;; ;;; 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 Lice
aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2015 Andy Wingo <wingo@igalia.com>
;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2024 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016 Theodoros Foradis <theodoros@foradis.org>
;;; Copyright © 2017 Jonathan Brielmaier <jonathan.brielmaier@web.de>
;;; Copyright © 2018, 2020–2022 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org>
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2020 Christopher Howard <christopher@librehacker.com>
;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
;;; Copyright © 2021 Martin Becze <mjbecze@riseup.net>
;;; Copyright © 2022 Jacob Hrbek <kreyren@rixotstudio.cz>
;;; Copyright © 2023 Sharlatan Hellseher <sharlatanus@gmail.com>
;;; Copyright © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
;;; Copyright © 2024 hapster <o.rojon@posteo.net>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages libusb)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix build-system ant)
  #:use-module (guix build-system cmake)
  #:use-module (guix build-system glib-or-gtk)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system go)
  #:use-module (guix build-system pyproject)
  #:use-module (guix build-system python)
  #:use-module (guix download)
  #:use-module (guix gexp)
  #:use-module (guix git-download)
  #:use-module (guix packages)
  #:use-module (guix utils)
  #:use-module (gnu packages)
  #:use-module (gnu packages autotools)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages gnupg)
  #:use-module (gnu packages gtk)
  #:use-module (gnu packages java)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages mp3)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages python)
  #:use-module (gnu packages python-build)
  #:use-module (gnu packages python-xyz)
  #:use-module (gnu packages readline)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages xiph))

(define-public libusb
  (package
    (name "libusb")
    (version "1.0.25")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "https://github.com/libusb/libusb/"
                          "releases/download/v" version
                          "/libusb-" version ".tar.bz2"))
      (sha256
       (base32 "0j88ym7afy4wj3x789zzxsr04asyjy0mw29gf31blzkrg8cyya4a"))))
    (build-system gnu-build-system)

    ;; XXX: Enabling udev is now recommended, but eudev indirectly depends on
    ;; libusb.
    (arguments `(#:configure-flags '("--disable-udev")))
    ;; (inputs `(("eudev" ,eudev)))

    (home-page "https://libusb.info")
    (synopsis "User-space USB library")
    (description
     "Libusb is a library that gives applications easy access to USB
devices on various operating systems.")
    (license license:lgpl2.1+)))

(define-public libusb-compat
  (package
    (name "libusb-compat")
    (version "0.1.8")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "mirror://sourceforge/libusb/"
                          "libusb-compat-" (version-major+minor version) "/"
                          "libusb-compat-" version "/"
                          "libusb-compat-" version ".tar.bz2"))
      (sha256
       (base32 "09q8w00djrkaxbiklcgjwya1w0n3aqavsz06fl0ixv1x9x47d339"))))
    (build-system gnu-build-system)
    (arguments
     (list #:configure-flags
           #~(list "--disable-static"
                   ;; Provide the absolute file name of libusb-1.0.so so
                   ;; dlopen works.
                   (string-append "LIBUSB_1_0_SONAME="
                                  #$(this-package-input "libusb")
                                  "/lib/libusb-1.0.so"))))
    (native-inputs (list autoconf automake libtool pkg-config))
    (inputs (list libusb))
    (home-page "https://libusb.info")
    (synopsis "Compatibility shim for libusb")
    (description
     "Libusb-compat provides a shim allowing applications based on older
version of libusb to run with newer libusb.")
    (license license:lgpl2.1+)))

;; required by 0xffff, which compiles with libusb-compat, but executes only
;; with libusb-0.1
(define-public libusb-0.1
  (package (inherit libusb)
    (version "0.1.12")
    (source
     (origin
      (method url-fetch)
      (uri (string-append "mirror://sourceforge/libusb/libusb-0.1 (LEGACY)/"
                          version "/libusb-" version ".tar.gz"))
      (sha256
       (base32
        "0i4bacxkyr7xyqxbmb00ypkrv4swkgm0mghbzjsnw6blvvczgxip"))
      (patches (search-patches "libusb-0.1-disable-tests.patch"))))
    (arguments `(#:configure-flags (list "CFLAGS=-Wno-error")))))

(define-public libusb4java
  ;; There is no public release so we take the latest version from git.
  (let ((commit "0842e8104d8772da873314e233aa625f5651fd34")
        (revision "1"))
    (package
      (name "libusb4java")
      (version (git-version "1.3.1" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/usb4java/libusb4java")
                      (commit commit)))
                (file-name (git-file-name name version))
                (sha256
                 (base32
                  "16hz0h8fvrr764gwj90yny1kxpf0y7p2czr7pdrw3qby21fqkzrq"))))
      (build-system cmake-build-system)
      (arguments
       (list
        #:tests? #f                     ;there are no tests
        #:phases
        #~(modify-phases %standard-phases
            (add-before 'configure 'set-JAVA_HOME
              (lambda _
                (setenv "JAVA_HOME" #$(this-package-native-input "jdk")))))))
      (inputs
       (list libusb))
      (native-inputs
       `(("jdk" ,icedtea "jdk")))
      (home-page "https://github.com/usb4java/libusb4java/")
      (synopsis "JNI bindings to libusb")
      (description
       "This package provides Java JNI bindings to the libusb library for use
with usb4java.")
      (license license:expat))))

(define-public go-github-com-google-gousb
  (package
    ;; See <https://github.com/google/gousb/issues/124> for picking up the
    ;; correct version.
    (name "go-github-com-google-gousb")
    (version "1.1.3")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/google/gousb")
             (commit (string-append "v" version))))
       (sha256
        (base32 "1rl43y2nn1fysnlvkkcba2rb4d4pqbab8v4v9zw0xv9j4x2r5hv1"))
       (file-name (git-file-name name version))))
    (build-system go-build-system)
    (arguments
     (list
      #:import-path "github.com/google/gousb"))
    (native-inputs
     (list pkg-config))
    ;; It's for purpose to prevent failing of missing libusb when this package
    ;; is included as inputs to build others.
    (propagated-inputs
     (list libusb))
    (home-page "https://github.com/google/gousb")
    (synopsis "Low-level interface for accessing USB devices in Golang")
    (description
     "The gousb package is an attempt at wrapping the libusb library into a
Go-like binding.")
    (license license:asl2.0)))

(define-public java-usb4java
  (package
    (name "java-usb4java")
    (version "1.3.0")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                     (url "https://github.com/usb4java/usb4java")
                     (commit (string-append "usb4java-" version))))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0fwf8d2swgm8pmvssy53ixnc0pb5bfvc8iy42mf3dwgvr1zzvgmv"))))
    (build-system ant-build-system)
    (arguments
     (list
      #:jar-name "usb4java.jar"
      #:phases
      #~(modify-phases %standard-phases
          ;; Usually, native libusb4java libraries for all supported systems
          ;; would be included in the jar and extracted at runtime.  Since we
          ;; build everything from source we cannot just bundle pre-built
          ;; binaries for other systems.  Instead, we patch the loader to
          ;; directly return the appropriate library for this system.  The
          ;; downside is that the jar will only work on the same architecture
          ;; that it was built on.
          (add-after 'unpack 'copy-libusb4java
            (lambda* (#:key inputs #:allow-other-keys)
              (substitute* "src/main/java/org/usb4java/Loader.java"
                (("private static String extractLibrary" line)
                 (string-append
                  line "(final String a, final String b) {"
                  "return \""
                  (search-input-file inputs "/lib/libusb4java.so")
                  "\"; }\n"
                  "private static String _extractLibrary")))))
          (add-after 'unpack 'disable-broken-tests
            (lambda _
              (with-directory-excursion "src/test/java/org/usb4java"
                ;; These tests should only be run when USB devices are present.
                (substitute* '("LibUsbGlobalTest.java"
                               "TransferTest.java")
                  (("this.context = new Context\\(\\);")
                   "this.context = null;"))))))))
    (inputs
     (list libusb4java java-commons-lang3 java-junit java-hamcrest-core))
    (home-page "http://usb4java.org/")
    (synopsis "USB library for Java")
    (description
     "This package provides a USB library for Java based on libusb and
implementing @code{javax.usb} (JSR-80).")
    (license license:expat)))

(define-public python-libusb1
  (package
    (name "python-libusb1")
    (version "3.0.0")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "libusb1" version))
       (sha256
        (base32
         "0f45rjgkq4wgyav6dz57ggj34p2l00c9n3d4639ia3z4zvgak4jp"))))
    (build-system python-build-system)
    (arguments
     '(#:modules ((srfi srfi-1)
                  (guix build utils)
                  (guix build python-build-system))
       #:phases
       (modify-phases %standard-phases
         (add-before 'install-license-files 'remove-incorrect-license
           (lambda* (#:key out #:allow-other-keys)
             ;; Was relicensed to LGPL 2.1+, but old COPYING file still left
             ;; in source. Remove it so it does not get installed.
             (delete-file "COPYING")))
         (add-after 'unpack 'fix-libusb-reference
           (lambda* (#:key inputs #:allow-other-keys)
             (substitute* "usb1/_libusb1.py"
               (("libusb_path = ctypes\\.util\\.find_library\\(base_name\\)")
                (string-append
                 "libusb_path = \""
                 (find (negate symbolic-link?)
                       (find-files (assoc-ref inputs "libusb")
                                   "^libusb.*\\.so\\..*"))
                 "\""))))))))
    (propagated-inputs (list libusb))
    (home-page "https://github.com/vpelletier/python-libusb1")
    (synopsis "Pure-python wrapper for libusb-1.0")
    (description "Libusb is a library that gives applications easy access to
USB devices on various operating systems.  This package provides a Python
wrapper for accessing libusb-1.0.")
    (license license:lgpl2.1+)))

(define-public python-pyusb
  (package
    (name "python-pyusb")
    (version "1.2.1")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "pyusb" version))
       (sha256
        (base32
         "1fg7knfzybzija2b01pzrzhzsj989scl12sb2ra4f503l8279k54"))))
    (build-system python-build-system)
    (arguments
     (list #:modules '((srfi srfi-1)
                       (srfi srfi-26)
                       (guix build utils)
                       (guix build python-build-system))
           #:phases
           #~(modify-phases %standard-phases
               ;; Repurpose the candidates parameter to be the path to the
               ;; library, then on each backend we substitute the candidates
               ;; with the full path to the .so library or with None if not
               ;; supported.
               ;;
               ;; While most applications could use a single back-end this
               ;; library allows to manually select the back-end so it is
               ;; appropriate to provide as much back-ends as possible.
               (add-after 'unpack 'fix-libusb-reference
                 (lambda* (#:key inputs #:allow-other-keys)
                   (let ((libusb0 (find
                                    (negate symbolic-link?)
                                    (find-files (assoc-ref inputs "libusb-compat")
                                                "^libusb-.*\\.so\\..*")))
                         (libusb1 (find
                                    (negate symbolic-link?)
                                    (find-files (assoc-ref inputs "libusb")
                                                "^libusb-.*\\.so\\..*"))))
                     (substitute* "usb/libloader.py"
                       (("lib = locate_library\\(candidates, find_library\\)")
                        "lib = candidates"))
                     (substitute* "usb/backend/libusb0.py"
                       (("\\('usb-0\\.1', 'usb', 'libusb0'\\)")
                        (format #f "~s" libusb0)))
                     (substitute* "usb/backend/libusb1.py"
                       (("\\('usb-1\\.0', 'libusb-1\\.0', 'usb'\\)")
                        (format #f "~s" libusb1)))
                     ;; FIXME: OpenUSB is not packaged for GNU Guix.
                     (substitute* "usb/backend/openusb.py"