Merge branch 'staging' into core-updates
[jackhill/guix/guix.git] / gnu / packages / usb-modeswitch.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2019, 2020 Florian Pelz <pelzflorian@pelzflorian.de>
3 ;;;
4 ;;; This file is part of GNU Guix.
5 ;;;
6 ;;; GNU Guix is free software; you can redistribute it and/or modify it
7 ;;; under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation; either version 3 of the License, or (at
9 ;;; your option) any later version.
10 ;;;
11 ;;; GNU Guix is distributed in the hope that it will be useful, but
12 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;; GNU General Public License for more details.
15 ;;;
16 ;;; You should have received a copy of the GNU General Public License
17 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
18
19 (define-module (gnu packages usb-modeswitch)
20 #:use-module ((guix licenses) #:prefix license:)
21 #:use-module (guix packages)
22 #:use-module (guix download)
23 #:use-module (guix build-system gnu)
24 #:use-module (guix build-system trivial)
25 #:use-module (gnu packages)
26 #:use-module (gnu packages base)
27 #:use-module (gnu packages compression)
28 #:use-module (gnu packages embedded)
29 #:use-module (gnu packages libusb)
30 #:use-module (gnu packages pkg-config))
31
32 (define-public usb-modeswitch-data
33 (package
34 (name "usb-modeswitch-data")
35 (version "20191128")
36 (source (origin
37 (method url-fetch)
38 (uri (string-append
39 "https://www.draisberghof.de/usb_modeswitch/"
40 "usb-modeswitch-data-" version ".tar.bz2"))
41 (sha256
42 (base32
43 "1ygahl3r26r38ai8yyblq9nhf3v5i6n6r6672p5wf88wg5h9n0rz"))))
44 (build-system trivial-build-system)
45 (native-inputs `(("tar" ,tar)
46 ("bzip2" ,bzip2)))
47 (arguments
48 `(#:modules ((guix build utils))
49 #:builder
50 (begin
51 (use-modules (guix build utils))
52 (let* ((source (assoc-ref %build-inputs "source"))
53 (tar (assoc-ref %build-inputs "tar"))
54 (bzip2 (assoc-ref %build-inputs "bzip2"))
55 (files (string-append "usb-modeswitch-data-"
56 ,(package-version this-package)))
57 (share-dir (string-append %output "/share"))
58 (doc-dir (string-append share-dir "/doc/"))
59 (license-dir (string-append doc-dir
60 (strip-store-file-name %output)))
61 (udev-dir (string-append %output "/udev")))
62 (copy-file source "data.tar.bz2")
63 (invoke (string-append bzip2 "/bin/bzip2") "-d" "data.tar.bz2")
64 (invoke (string-append tar "/bin/tar") "xvf" "data.tar")
65 (copy-recursively (string-append files "/usb_modeswitch.d")
66 (string-append share-dir "/usb_modeswitch.d"))
67 (install-file (string-append files "/40-usb_modeswitch.rules")
68 udev-dir)
69 (install-file (string-append files "/COPYING") license-dir)))))
70 (home-page "https://www.draisberghof.de/usb_modeswitch/")
71 (synopsis "Data package for USB_ModeSwitch")
72 (description "This package contains data about devices and a UDEV rules
73 file for use with USB_ModeSwitch.")
74 (license license:gpl2+)))
75
76 (define-public usb-modeswitch
77 (package
78 (name "usb-modeswitch")
79 (version "2.6.0")
80 (source (origin
81 (method url-fetch)
82 (uri (string-append
83 "https://www.draisberghof.de/usb_modeswitch/"
84 "usb-modeswitch-" version ".tar.bz2"))
85 (sha256
86 (base32
87 "18wbbxc5cfsmikba0msdvd5qlaga27b32nhrzicyd9mdddp265f2"))))
88 (native-inputs `(("pkg-config" ,pkg-config)))
89 (inputs `(("libusb" ,libusb)
90 ("jimtcl" ,jimtcl)
91 ("usb-modeswitch-data" ,usb-modeswitch-data)))
92 (outputs '("out" "dispatcher"))
93 (build-system gnu-build-system)
94 (arguments
95 `(#:tests? #f ; does not support `make check`
96 #:make-flags (list "CC=gcc")
97 #:phases
98 (modify-phases %standard-phases
99 (delete 'configure) ; no configure script
100 (replace 'install
101 (lambda* (#:key source outputs inputs #:allow-other-keys)
102 (let* ((source (assoc-ref inputs "source"))
103 (jimtcl (assoc-ref inputs "jimtcl"))
104 (data (assoc-ref inputs "usb-modeswitch-data"))
105 (out (assoc-ref outputs "out"))
106 (bin (string-append out "/bin"))
107 (man1 (string-append out "/share/man/man1"))
108 (dispatcher-out (assoc-ref outputs "dispatcher"))
109 (udev (string-append dispatcher-out "/lib/udev"))
110 (etc (string-append dispatcher-out "/etc"))
111 (dispatcher-bin (string-append dispatcher-out "/bin"))
112 (dispatcher-man1 (string-append dispatcher-out
113 "/share/man/man1")))
114 (begin
115 ;; Users can install the default output and
116 ;; usb-modeswitch-data and then modeswitch their USB device
117 ;; by running e.g.:
118 ;;
119 ;; sudo usb_modeswitch -c \
120 ;; ~/.guix-profile/share/usb_modeswitch.d/12d1\:14fe \
121 ;; -v 0x12d1 -p 0x14fe
122 ;;
123 ;; But it is simpler to use the usb-modeswitch-service-type
124 ;; that installs a UDEV rules file which invokes a shell
125 ;; script in lib/udev (also called `usb_modeswitch' like the
126 ;; main binary) which, in turn, invokes the program
127 ;; `usb_modeswitch_dispatcher'. Normal users should not
128 ;; invoke this dispatcher directly, so it is a separate output.
129 (install-file "usb_modeswitch" bin)
130 (install-file "usb_modeswitch.conf" etc)
131 (install-file "usb_modeswitch.1" man1)
132 (install-file "usb_modeswitch_dispatcher.1" dispatcher-man1)
133
134 (substitute* "usb_modeswitch.sh"
135 (("PATH=") "PATH=$PATH:") ; we do not want hardcoded FHS path
136 (("init_path=") "init_path=/does/not/exist")) ; no /sbin/init
137 (rename-file "usb_modeswitch.sh" "usb_modeswitch")
138 (install-file "usb_modeswitch" udev)
139
140 (rename-file "usb_modeswitch_dispatcher.tcl" "usb_modeswitch_dispatcher")
141 (substitute* "usb_modeswitch_dispatcher"
142 (("/usr/bin/tclsh")
143 (string-append jimtcl "/bin/jimsh"))
144 (("/usr/sbin") bin)
145 (("/usr/share/usb_modeswitch")
146 (string-append data "/share/usb_modeswitch.d")))
147 (install-file "usb_modeswitch_dispatcher"
148 dispatcher-bin)
149 #t)))))))
150 (home-page "https://www.draisberghof.de/usb_modeswitch/")
151 (synopsis "Mode switching tool for controlling `multi-mode' USB devices")
152 (description "USB_ModeSwitch is a mode switching tool for controlling USB
153 devices with multiple @dfn{modes}. When plugged in for the first time many
154 USB devices (primarily high-speed WAN modems) act like a flash storage
155 containing installers for Windows drivers. USB_ModeSwitch replays the
156 sequence the Windows drivers would send to switch their mode from storage to
157 modem (or whatever the thing is supposed to do).")
158 (license (list license:gpl2+ ;"this program" according to home page
159 license:bsd-2)))) ;dispatcher.c