projects/guix·blob python-team · refs

5560 lines · 223.1 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2015-2025 Ricardo Wurmus <[email protected]>
3;;; Copyright © 2015 Federico Beffa <[email protected]>
4;;; Copyright © 2016, 2018, 2020-2026 Efraim Flashner <[email protected]>
5;;; Copyright © 2016 David Thompson <[email protected]>
6;;; Copyright © 2016-2019, 2021, 2023 Ludovic Courtès <[email protected]>
7;;; Copyright © 2016, 2017, 2018 Theodoros Foradis <[email protected]>
8;;; Copyright © 2016 John Darrington <[email protected]>
9;;; Copyright © 2017 Julien Lepiller <[email protected]>
10;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <[email protected]>
11;;; Copyright © 2018 Clément Lassieur <[email protected]>
12;;; Copyright © 2018, 2019 Jonathan Brielmaier <[email protected]>
13;;; Copyright © 2018, 2019, 2020 Arun Isaac <[email protected]>
14;;; Copyright © 2019 Tim Stahel <[email protected]>
15;;; Copyright © 2019 Jovany Leandro G.C <[email protected]>
16;;; Copyright © 2019 Steve Sprang <[email protected]>
17;;; Copyright © 2019 John Soo <[email protected]>
18;;; Copyright © 2020 Brice Waegeneire <[email protected]>
19;;; Copyright © 2020,2021,2024 Vincent Legoll <[email protected]>
20;;; Copyright © 2020, 2023 Marius Bakke <[email protected]>
21;;; Copyright © 2020, 2021, 2025 Ekaitz Zarraga <[email protected]>
22;;; Copyright © 2020 B. Wilson <[email protected]>
23;;; Copyright © 2020, 2021, 2022, 2023, 2024, 2025 Vinicius Monego <[email protected]>
24;;; Copyright © 2021, 2023 Morgan Smith <[email protected]>
25;;; Copyright © 2021 qblade <[email protected]>
26;;; Copyright © 2021 Gerd Heber <[email protected]>
27;;; Copyright © 2021, 2022, 2026 Guillaume Le Vaillant <[email protected]>
28;;; Copyright © 2021 Ivan Gankevich <[email protected]>
29;;; Copyright © 2021, 2022 Petr Hodina <[email protected]>
30;;; Copyright © 2021 Foo Chuan Wei <[email protected]>
31;;; Copyright © 2022, 2025 Evgeny Pisemsky <[email protected]>
32;;; Copyright © 2022 Olivier Dion <[email protected]>
33;;; Copyright © 2022 Peter Polidoro <[email protected]>
34;;; Copyright © 2022 Malte Frank Gerdes <[email protected]>
35;;; Copyright © 2022 Greg Hogan <[email protected]>
36;;; Copyright © 2022, 2024-2026 Artyom V. Poptsov <[email protected]>
37;;; Copyright © 2022, 2025 Maxim Cournoyer <[email protected]>
38;;; Copyright © 2022, 2023, 2025 Felix Gruber <[email protected]>
39;;; Copyright © 2023 Theofilos Pechlivanis <[email protected]>
40;;; Copyright © 2023 Sharlatan Hellseher <[email protected]>
41;;; Copyright © 2023 pinoaffe <[email protected]>
42;;; Copyright © 2024 Juliana Sims <[email protected]>
43;;; Copyright © 2024 Nguyễn Gia Phong <[email protected]>
44;;; Copyright © 2025 Frederick Muriuki Muriithi <[email protected]>
45;;; Copyright © 2025, 2026 nomike Postmann <[email protected]>
46;;; Copyright © 2025 Matthew Elwin <[email protected]>
47;;; Copyright © 2025 Janneke Nieuwenhuizen <[email protected]>
48;;; Copyright © 2025 Remco van 't Veer <[email protected]>
49;;; Copyright © 2025-2026 bdunahu <[email protected]>
50;;; Copyright © 2026 Cayetano Santos <[email protected]>
51;;; Copyright © 2026 Thomas Kramer <[email protected]>
52;;; Copyright © 2026 Daniel Khodabakhsh <[email protected]>
53;;; Copyright © 2026 Spencer King <[email protected]>
54;;; Copyright © 2026 Brent Wedderburn <[email protected]>
55;;; Copyright © 2026 Orahcio Felício de Sousa <[email protected]>
56;;;
57;;; This file is part of GNU Guix.
58;;;
59;;; GNU Guix is free software; you can redistribute it and/or modify it
60;;; under the terms of the GNU General Public License as published by
61;;; the Free Software Foundation; either version 3 of the License, or (at
62;;; your option) any later version.
63;;;
64;;; GNU Guix is distributed in the hope that it will be useful, but
65;;; WITHOUT ANY WARRANTY; without even the implied warranty of
66;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
67;;; GNU General Public License for more details.
68;;;
69;;; You should have received a copy of the GNU General Public License
70;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
71
72;;; Packages for computer-aided engineering workflows, including CAD/CAM,
73;;; physical modeling and simulation, field solvers, manufacturing, robotics,
74;;; surveying, and engineering computation tools.
75
76(define-module (gnu packages engineering)
77 #:use-module ((guix licenses) #:prefix license:)
78 #:use-module (guix build-system ant)
79 #:use-module (guix build-system cmake)
80 #:use-module (guix build-system copy)
81 #:use-module (guix build-system emacs)
82 #:use-module (guix build-system go)
83 #:use-module (guix build-system guile)
84 #:use-module (guix build-system gnu)
85 #:use-module (guix build-system meson)
86 #:use-module (guix build-system pyproject)
87 #:use-module (guix build-system qt)
88 #:use-module (guix deprecation)
89 #:use-module (guix download)
90 #:use-module (guix gexp)
91 #:use-module (guix git-download)
92 #:use-module (guix monads)
93 #:use-module (guix packages)
94 #:use-module (guix store)
95 #:use-module (guix svn-download)
96 #:use-module (guix utils)
97 #:use-module (gnu packages)
98 #:use-module (gnu packages aidc)
99 #:use-module (gnu packages algebra)
100 #:use-module (gnu packages autotools)
101 #:use-module (gnu packages backup)
102 #:use-module (gnu packages base)
103 #:use-module (gnu packages bash)
104 #:use-module (gnu packages bdw-gc)
105 #:use-module (gnu packages bison)
106 #:use-module (gnu packages boost)
107 #:use-module (gnu packages c)
108 #:use-module (gnu packages check)
109 #:use-module (gnu packages cmake)
110 #:use-module (gnu packages code)
111 #:use-module (gnu packages compression)
112 #:use-module (gnu packages cpp)
113 #:use-module (gnu packages crypto)
114 #:use-module (gnu packages curl)
115 #:use-module (gnu packages databases)
116 #:use-module (gnu packages dejagnu)
117 #:use-module (gnu packages digest)
118 #:use-module (gnu packages docbook)
119 #:use-module (gnu packages documentation)
120 #:use-module (gnu packages electronics)
121 #:use-module (gnu packages emacs-build)
122 #:use-module (gnu packages emacs-xyz)
123 #:use-module (gnu packages file)
124 #:use-module (gnu packages compiler-tools)
125 #:use-module (gnu packages fontutils)
126 #:use-module (gnu packages freedesktop)
127 #:use-module (gnu packages gawk)
128 #:use-module (gnu packages gcc)
129 #:use-module (gnu packages gd)
130 #:use-module (gnu packages geo)
131 #:use-module (gnu packages gettext)
132 #:use-module (gnu packages ghostscript)
133 #:use-module (gnu packages gl)
134 #:use-module (gnu packages glib)
135 #:use-module (gnu packages gnome)
136 #:use-module (gnu packages golang)
137 #:use-module (gnu packages golang-build)
138 #:use-module (gnu packages golang-check)
139 #:use-module (gnu packages golang-compression)
140 #:use-module (gnu packages golang-crypto)
141 #:use-module (gnu packages golang-maths)
142 #:use-module (gnu packages golang-vcs)
143 #:use-module (gnu packages golang-web)
144 #:use-module (gnu packages golang-xyz)
145 #:use-module (gnu packages graphics)
146 #:use-module (gnu packages graphviz)
147 #:use-module (gnu packages groff)
148 #:use-module (gnu packages gtk)
149 #:use-module (gnu packages guile)
150 #:use-module (gnu packages image)
151 #:use-module (gnu packages image-processing)
152 #:use-module (gnu packages imagemagick)
153 #:use-module (gnu packages javascript)
154 #:use-module (gnu packages jupyter)
155 #:use-module (gnu packages icu4c)
156 #:use-module (gnu packages kde-frameworks)
157 #:use-module (gnu packages libcanberra)
158 #:use-module (gnu packages libevent)
159 #:use-module (gnu packages libusb)
160 #:use-module (gnu packages linux) ;FIXME: for pcb
161 #:use-module (gnu packages lisp)
162 #:use-module (gnu packages m4)
163 #:use-module (gnu packages man)
164 #:use-module (gnu packages maths)
165 #:use-module (gnu packages multiprecision)
166 #:use-module (gnu packages mpi)
167 #:use-module (gnu packages ncurses)
168 #:use-module (gnu packages nettle)
169 #:use-module (gnu packages networking)
170 #:use-module (gnu packages node)
171 #:use-module (gnu packages oneapi)
172 #:use-module (gnu packages openkinect)
173 #:use-module (gnu packages parallel)
174 #:use-module (gnu packages pcre)
175 #:use-module (gnu packages pdf)
176 #:use-module (gnu packages perl)
177 #:use-module (gnu packages pkg-config)
178 #:use-module (gnu packages pretty-print)
179 #:use-module (gnu packages protobuf)
180 #:use-module (gnu packages pulseaudio)
181 #:use-module (gnu packages python)
182 #:use-module (gnu packages python-build)
183 #:use-module (gnu packages python-check)
184 #:use-module (gnu packages python-compression)
185 #:use-module (gnu packages python-crypto)
186 #:use-module (gnu packages python-graphics)
187 #:use-module (gnu packages python-science)
188 #:use-module (gnu packages python-web)
189 #:use-module (gnu packages python-xyz)
190 #:use-module (gnu packages qt)
191 #:use-module (gnu packages readline)
192 #:use-module (gnu packages ruby-xyz)
193 #:use-module (gnu packages rust-apps)
194 #:use-module (gnu packages sagemath)
195 #:use-module (gnu packages serialization)
196 #:use-module (gnu packages sqlite)
197 #:use-module (gnu packages stb)
198 #:use-module (gnu packages swig)
199 #:use-module (gnu packages tcl)
200 #:use-module (gnu packages tex)
201 #:use-module (gnu packages texinfo)
202 #:use-module (gnu packages text-editors)
203 #:use-module (gnu packages time)
204 #:use-module (gnu packages tls)
205 #:use-module (gnu packages toolkits)
206 #:use-module (gnu packages tree-sitter)
207 #:use-module (gnu packages version-control)
208 #:use-module (gnu packages web)
209 #:use-module (gnu packages webkit)
210 #:use-module (gnu packages wxwidgets)
211 #:use-module (gnu packages xdisorg)
212 #:use-module (gnu packages xiph)
213 #:use-module (gnu packages xml)
214 #:use-module (gnu packages xorg)
215 #:use-module ((srfi srfi-1) #:hide (zip)))
216
217(define-public cutecom
218 (package
219 (name "cutecom")
220 (version "0.60.0-RC1")
221 (source (origin
222 (method git-fetch)
223 (uri (git-reference
224 (url "https://gitlab.com/cutecom/cutecom")
225 (commit (string-append "v" version))))
226 (file-name (git-file-name name version))
227 (sha256
228 (base32
229 "1k67x4l27ac6sb944b42zscm0ffq2fxbghapspgj75g4dr8ip38a"))))
230 (build-system qt-build-system)
231 (arguments
232 (list
233 #:qtbase qtbase
234 #:tests? #f)) ;no tests
235 (inputs
236 (list qtbase qttools qtserialport qtwayland))
237 (home-page "https://gitlab.com/cutecom/cutecom")
238 (synopsis "Graphical serial terminal")
239 (description
240 "@code{cutecom} is a graphical serial terminal, like @code{minicom}. It is
241aimed mainly at hardware developers or other people who need a terminal to talk to
242their devices.")
243 (license license:gpl3+)))
244
245(define-public librecad
246 (package
247 (name "librecad")
248 (version "2.2.1.5")
249 (source (origin
250 (method git-fetch)
251 (uri (git-reference
252 (url "https://github.com/LibreCAD/LibreCAD")
253 (commit (string-append "v" version))))
254 (file-name (git-file-name name version))
255 (sha256
256 (base32
257 "1d2cpb7zi2hfk6bgfks9dgi4z1n5xz3jmg7lbs6mbr9aak0fcvx7"))))
258 (build-system qt-build-system)
259 (arguments
260 (list
261 #:modules '((guix build qt-build-system)
262 ((guix build gnu-build-system) #:prefix gnu:)
263 (guix build utils))
264 #:phases
265 #~(modify-phases %standard-phases
266 (replace 'configure
267 (lambda _
268 (system* "qmake" (string-append "BOOST_DIR="
269 #$(this-package-input "boost")))))
270 (replace 'build (assoc-ref gnu:%standard-phases 'build))
271 (replace 'check (assoc-ref gnu:%standard-phases 'check))
272 (replace 'install
273 (lambda _
274 (let* ((bin (string-append #$output "/bin"))
275 (share (string-append #$output "/share"))
276 (apps (string-append share "/applications"))
277 (icons (string-append share "/icons/hicolor/128x128/apps")))
278 (mkdir-p bin)
279 (install-file "unix/librecad" bin)
280 (mkdir-p share)
281 (copy-recursively "unix/resources"
282 (string-append share "/librecad"))
283 (mkdir-p apps)
284 (install-file "desktop/librecad.desktop" apps)
285 (mkdir-p icons)
286 (copy-file "librecad/res/main/librecad.png"
287 (string-append icons "/librecad.png"))))))))
288 (inputs
289 (list bash-minimal boost muparser freetype qtbase-5 qtsvg-5))
290 (native-inputs
291 (list pkg-config which))
292 (home-page "https://librecad.org/")
293 (synopsis "Computer-aided design (CAD) application")
294 (description
295 "LibreCAD is a 2D Computer-aided design (CAD) application for creating
296plans and designs.")
297 (license license:gpl2)))
298
299(define-public mbpoll
300 (package
301 (name "mbpoll")
302 (version "1.5.4")
303 (source
304 (origin
305 (method git-fetch)
306 (uri (git-reference
307 (url "https://github.com/epsilonrt/mbpoll")
308 (commit (string-append "v" version))))
309 (file-name (git-file-name name version))
310 (sha256
311 (base32 "11vwmm2l96v8598z0q50rgp5z57lkd09ff9l8knpr4ghkjpssf0g"))))
312 (build-system cmake-build-system)
313 (arguments
314 (list
315 #:tests? #f)) ;no tests
316 (native-inputs (list pkg-config))
317 (inputs (list libmodbus))
318 (home-page "https://github.com/epsilonrt/mbpoll")
319 (synopsis
320 "Command line utility to communicate with ModBus slave (RTU or TCP)")
321 (description
322 "@code{mbpoll} is a command line utility to communicate with
323@url{https://en.wikipedia.org/wiki/Modbus, ModBus} slave (RTU or TCP).")
324 (license license:gpl3)))
325
326(define-public geda-gaf
327 (package
328 (name "geda-gaf")
329 (version "1.10.2")
330 (source (origin
331 (method url-fetch)
332 (uri (string-append
333 "http://ftp.geda-project.org/geda-gaf/stable/v"
334 (version-major+minor version) "/"
335 version "/geda-gaf-" version ".tar.gz"))
336 (sha256
337 (base32
338 "19688b0671imy2i3jphcnq1120b8ymhr4wz2psiqylr82ljanqp8"))))
339 (build-system gnu-build-system)
340 (arguments
341 (list
342 #:phases
343 '(modify-phases %standard-phases
344 ;; tests require a writable HOME
345 (add-before 'check 'set-home
346 (lambda _
347 (setenv "HOME" (getenv "TMPDIR"))))
348 (add-after 'unpack 'disable-failing-tests
349 (lambda _
350 (substitute* "xorn/tests/Makefile.in"
351 (("-Werror") ""))
352 ;; This test returns its correct result in an unexpected order.
353 (substitute* "libgeda/scheme/unit-tests/t0402-config.scm"
354 (("\\(begin-config-test 'config-keys" m)
355 (string-append "#;" m))))))
356 #:configure-flags
357 #~(let ((pcb #$(this-package-input "pcb")))
358 (list (string-append "--with-pcb-datadir=" pcb "/share")
359 (string-append "--with-pcb-lib-path="
360 pcb "/share/pcb/pcblib-newlib:"
361 pcb "/share/pcb/newlib")))))
362 (inputs
363 (list gamin
364 gdk-pixbuf
365 glib
366 gtk+-2
367 guile-2.0
368 libxcrypt
369 shared-mime-info
370 m4
371 pcb
372 python-2)) ; for xorn
373 (native-inputs
374 (list groff pkg-config desktop-file-utils perl)) ; for tests
375 (home-page "http://geda-project.org/")
376 (synopsis "Schematic capture, netlister, symbols, symbol checker, and utils")
377 (description
378 "Gaf stands for “gschem and friends”. It is a subset of the entire tool
379suite grouped together under the gEDA name. gEDA/gaf is a collection of tools
380which currently includes: gschem, a schematic capture program; gnetlist, a
381netlist generation program; gsymcheck, a syntax checker for schematic symbols;
382gattrib, a spreadsheet programme that manipulates the properties of symbols of
383a schematic; libgeda, libraries for gschem gnetlist and gsymcheck; gsch2pcb, a
384tool to forward annotation from your schematic to layout using PCB; some minor
385utilities.")
386 (license license:gpl2+)))
387
388(define-public pcb
389 (package
390 (name "pcb")
391 (version "4.3.0")
392 (source (origin
393 (method url-fetch)
394 (uri (string-append "mirror://sourceforge/pcb/pcb/pcb-" version
395 "/pcb-" version ".tar.gz"))
396 (sha256
397 (base32
398 "0ppv8cblw0h70laly4zp8gmbxkbzzhbbjgw13pssgaw4mx32z1df"))))
399 (build-system gnu-build-system)
400 (arguments
401 (list
402 #:phases
403 #~(modify-phases %standard-phases
404 (add-after 'unpack 'convert-encoding
405 (lambda _
406 (for-each
407 (lambda (name)
408 (invoke "iconv" "-f" "LATIN1" "-t" "UTF-8" name "-o" name))
409 '("src/pcb-menu.res.in"
410 "src/pcb-menu.res.h"))))
411 (add-before 'check 'pre-check
412 (lambda _
413 (system "Xvfb :1 &")
414 (setenv "DISPLAY" ":1"))))))
415 (inputs
416 (list dbus
417 mesa
418 glu
419 gd
420 gtk+-2
421 gtkglext
422 shared-mime-info
423 tk))
424 (native-inputs
425 (list bison
426 desktop-file-utils
427 flex
428 intltool
429 pkg-config
430 ;; For tests
431 imagemagick
432 gerbv
433 ghostscript
434 xorg-server-for-tests))
435 (home-page "http://pcb.geda-project.org/")
436 (synopsis "Design printed circuit board layouts")
437 (description
438 "GNU PCB is an interactive tool for editing printed circuit board
439layouts. It features a rats-nest implementation, schematic/netlist import,
440and design rule checking. It also includes an autorouter and a trace
441optimizer; and it can produce photorealistic and design review images.")
442 (license license:gpl2+)))
443
444(define-public fastcap
445 (package
446 (name "fastcap")
447 (version "2.0-18Sep92")
448 (source (origin
449 (method url-fetch/tarbomb)
450 (uri (string-append "http://www.rle.mit.edu/cpg/codes/"
451 name "-" version ".tgz"))
452 (sha256
453 (base32
454 "0x37vfp6k0d2z3gnig0hbicvi0jp8v267xjnn3z8jdllpiaa6p3k"))
455 (snippet
456 ;; Remove a non-free file.
457 #~(begin
458 (delete-file "doc/psfig.sty")))
459 (patches (search-patches "fastcap-mulSetup.patch"
460 "fastcap-mulGlobal.patch"))))
461 (build-system gnu-build-system)
462 (native-inputs
463 ;; FIXME: with (texlive-local-tree) citation references are rendered as
464 ;; question marks. During the build warnings like these are printed:
465 ;; LaTeX Warning: Citation `nabors91' on page 2 undefined on input line
466 ;; 3.
467 `(("texlive" ,(texlive-local-tree))
468 ("ghostscript" ,ghostscript)
469 ("libfaketime" ,libfaketime)))
470 (arguments
471 (list
472 #:make-flags #~(list "CC=gcc" "RM=rm" "SHELL=sh"
473 (string-append
474 "CFLAGS="
475 "-Wno-error=implicit-int"
476 " -Wno-error=return-mismatch"
477 " -Wno-error=implicit-function-declaration")
478 "all")
479 #:parallel-build? #f
480 #:tests? #f ;; no tests-suite
481 #:modules `((srfi srfi-1)
482 ,@%default-gnu-modules)
483 #:phases
484 #~(modify-phases %standard-phases
485 (add-after 'build 'make-doc
486 (lambda _
487 (invoke "faketime"
488 "1970-01-01 00:00:00"
489 "make" "CC=gcc" "RM=rm" "SHELL=sh" "manual")))
490 (add-before 'make-doc 'fix-doc
491 (lambda _
492 (substitute* "doc/Makefile" (("/bin/rm") (which "rm")))
493 (substitute* (find-files "doc" "\\.tex")
494 (("\\\\special\\{psfile=([^,]*),.*scale=([#0-9.]*).*\\}"
495 all file scale)
496 (string-append "\\includegraphics[scale=" scale "]{"
497 file "}"))
498 (("\\\\psfig\\{figure=([^,]*),.*width=([#0-9.]*in).*\\}"
499 all file width)
500 (string-append "\\includegraphics[width=" width "]{"
501 file "}"))
502 (("\\\\psfig\\{figure=([^,]*),.*height=([#0-9.]*in).*\\}"
503 all file height)
504 (string-append "\\includegraphics[height=" height "]{"
505 file "}"))
506 (("\\\\psfig\\{figure=([^,]*)\\}" all file)
507 (string-append "\\includegraphics{" file "}")))
508 (substitute* '("doc/mtt.tex" "doc/tcad.tex" "doc/ug.tex")
509 (("^\\\\documentstyle\\[(.*)\\]\\{(.*)\\}"
510 all options class)
511 (string-append "\\documentclass[" options "]{"
512 class "}\n"
513 "\\usepackage{graphicx}\n"
514 "\\usepackage{robinspace}"))
515 (("\\\\setlength\\{\\\\footheight\\}\\{.*\\}" all)
516 (string-append "%" all))
517 (("\\\\setstretch\\{.*\\}" all)
518 (string-append "%" all)))))
519 (delete 'configure)
520 (add-before 'install 'clean-bin
521 (lambda _
522 (delete-file (string-append (getcwd) "/bin/README"))))
523 (add-before 'install 'make-pdf
524 (lambda _
525 (setenv "TEXMFVAR" "/tmp") ;For texlive font cache
526 (with-directory-excursion "doc"
527 (for-each (lambda (file)
528 (invoke "faketime"
529 "-f"
530 "1970-01-01 00:00:00"
531 "dvips" file "-o"))
532 (find-files "." "\\.dvi"))
533 (for-each (lambda (file)
534 (invoke "faketime"
535 "-f"
536 "1970-01-01 00:00:00"
537 "ps2pdf" file))
538 '("mtt.ps" "ug.ps" "tcad.ps"))
539 (invoke "make" "clean"))))
540 (replace 'install
541 (lambda _
542 (let* ((data (string-append #$output "/share"))
543 (bin (string-append #$output "/bin"))
544 (doc (string-append data "/doc/" #$name "-" #$version))
545 (examples (string-append doc "/examples")))
546 (with-directory-excursion "bin"
547 (for-each (lambda (f)
548 (install-file f bin))
549 (find-files "." ".*")))
550 (with-directory-excursion "doc"
551 (for-each (lambda (f)
552 (install-file f doc))
553 (find-files "." ".pdf")))
554 (copy-recursively "examples" examples)))))))
555 (home-page "https://www.rle.mit.edu/cpg/research_codes.htm")
556 (synopsis "Multipole-accelerated capacitance extraction program")
557 (description
558 "Fastcap is a capacitance extraction program based on a
559multipole-accelerated algorithm.")
560 (license (license:non-copyleft #f "See fastcap.c."))))
561
562(define-public fasthenry
563 (package
564 (name "fasthenry")
565 (version "3.0-12Nov96")
566 (source (origin
567 (method url-fetch)
568 (file-name (string-append name "-" version ".tar.gz"))
569 (uri (string-append
570 "http://www.rle.mit.edu/cpg/codes/" name
571 "-" version ".tar.z"))
572 (sha256
573 (base32 "1a06xyyd40zhknrkz17xppl2zd5ig4w9g1grc8qrs0zqqcl5hpzi"))
574 (patches (search-patches "fasthenry-spAllocate.patch"
575 "fasthenry-spBuild.patch"
576 "fasthenry-spUtils.patch"
577 "fasthenry-spSolve.patch"
578 "fasthenry-spFactor.patch"))))
579 (native-inputs (list gcc-7))
580 (build-system gnu-build-system)
581 (arguments
582 (list #:make-flags #~(list "CC=gcc" "RM=rm" "SHELL=sh" "all")
583 #:parallel-build? #f
584 #:tests? #f ;; no tests-suite
585 #:modules `((srfi srfi-1)
586 ,@%default-gnu-modules)
587 #:phases
588 #~(modify-phases %standard-phases
589 (delete 'configure)
590 (replace 'install
591 (lambda _
592 (let* ((data (string-append #$output "/share"))
593 (bin (string-append #$output "/bin"))
594 (doc (string-append data "/doc/"
595 #$name "-" #$version))
596 (examples (string-append doc "/examples")))
597 (with-directory-excursion "bin"
598 (for-each (lambda (f)
599 (install-file f bin))
600 (find-files "." ".*")))
601 (copy-recursively "doc" doc)
602 (copy-recursively "examples" examples)))))))
603 (home-page "https://www.rle.mit.edu/cpg/research_codes.htm")
604 (synopsis "Multipole-accelerated inductance analysis program")
605 (description
606 "Fasthenry is an inductance extraction program based on a
607multipole-accelerated algorithm.")
608 (license (license:non-copyleft #f "See induct.c."))))
609
610(define-public csxcad
611 (package
612 (name "csxcad")
613 (version "0.6.3")
614 (source
615 (origin
616 (method git-fetch)
617 (uri (git-reference
618 (url "https://github.com/thliebig/CSXCAD")
619 (commit (string-append "v" version))))
620 (file-name (git-file-name name version))
621 (sha256
622 (base32 "1c383zsv4fp40kmpawamfi9zg3b8x3d4m091ldwk15mii3467hp3"))))
623 (build-system cmake-build-system)
624 (arguments
625 (list
626 #:tests? #f ; No tests.
627 #:configure-flags
628 #~(list
629 (string-append "-DFPARSER_ROOT_DIR=" #$(this-package-input "fparser")))
630 #:phases
631 #~(modify-phases %standard-phases
632 (add-after 'unpack 'fix-cmake-and-sources
633 (lambda _
634 (substitute* "CMakeLists.txt"
635 ((" system\n")
636 "")
637 (("find_package\\(HDF5 1.8 COMPONENTS C HL REQUIRED\\)")
638 "find_package(HDF5 REQUIRED COMPONENTS C HL)"))
639 ;; Fix missing `std::`.
640 ;; This is fixed in upstream already but not tagged.
641 (substitute* "src/CSPropDiscMaterial.cpp"
642 (("\tcout ")
643 "\tstd::cout ")))))))
644 (inputs (list boost
645 cgal
646 eigen
647 fparser
648 hdf5
649 gmp
650 libjpeg-turbo
651 libpng
652 libtiff
653 lz4
654 mpfr
655 openmpi
656 tinyxml
657 vtk
658 zlib))
659 (home-page "https://github.com/thliebig/CSXCAD")
660 (synopsis "3D geometry library for C++")
661 (description
662 "@code{csxcad} is a C++ library to describe geometrical objects
663and their physical or non-physical properties for electromagnetics simulations.")
664 (license license:lgpl3+)))
665
666(define-public python-csxcad
667 (package
668 (inherit csxcad)
669 (name "python-csxcad")
670 (build-system pyproject-build-system)
671 (arguments
672 (list
673 ;; Tests are broken in v0.6.3.
674 ;; Check on update.
675 #:tests? #f
676 #:phases
677 #~(modify-phases %standard-phases
678 (add-before 'build 'prepare-build
679 (lambda _
680 (chdir "./python")
681 (setenv "CSXCAD_INSTALL_PATH"
682 #$(this-package-input "csxcad")))))))
683 (native-inputs (list python-minimal python-cython python-numpy
684 python-setuptools))
685 (inputs (list csxcad fparser hdf5 python-numpy tinyxml))
686 (synopsis "Python bindings for @code{csxcad}")
687 (description "Library for describing geometrical objects and their
688physical and non-physical properties.")
689 (license license:lgpl3+)))
690
691(define-public qcsxcad
692 (package
693 (name "qcsxcad")
694 (version "0.6.3")
695 (source
696 (origin
697 (method git-fetch)
698 (uri (git-reference
699 (url "https://github.com/thliebig/QCSXCAD")
700 (commit (string-append "v" version))))
701 (file-name (git-file-name name version))
702 (sha256
703 (base32 "0ag1shyhsmfsvqm35fi2kfnbcngmln8rjsv88f97gyx9wiqc808y"))))
704 (build-system qt-build-system)
705 (arguments
706 (list
707 #:tests? #f ;No tests.
708 #:qtbase qtbase ;For Qt 6
709 #:phases
710 #~(modify-phases %standard-phases
711 (add-after 'unpack 'fix-sources
712 ;; Fix missing `std::`-prefix and missing include.
713 ;; This is fixed in upstream but not tagged with a version.
714 (lambda _
715 (substitute* "vtkInteractorStyleRubberBand2DPlane.cpp"
716 (("#include \"vtkCamera.h\"")
717 "#include <iostream>\n#include \"vtkCamera.h\"")
718 (("\tcerr ")
719 "\tstd::cerr "))
720 (substitute* "VTKPrimitives.cpp"
721 (("#include \"VTKPrimitives.h\"")
722 "#include <iostream>\n#include \"VTKPrimitives.h\"")
723 (("\tcerr ")
724 "\tstd::cerr ")
725 (("\tcout ")
726 "\tstd::cout "))
727 (substitute* "QVTKStructure.cpp"
728 (("#include \"QVTKStructure.h\"")
729 "#include <iostream>\n#include \"QVTKStructure.h\"")
730 (("\tcerr ")
731 "\tstd::cerr ")
732 (("\tcout ")
733 "\tstd::cout ")))))))
734 (inputs (list boost
735 cgal
736 csxcad
737 eigen
738 freetype
739 gmp
740 libjpeg-turbo
741 libpng
742 libtiff
743 lz4
744 openmpi
745 qt5compat
746 tinyxml
747 vtk))
748 (home-page "https://github.com/thliebig/QCSXCAD")
749 (synopsis "GUI library for @code{csxcad}")
750 (description
751 "GUI library for @code{csxcad} --- a library for describing geometrical
752 objects and their properties. This library is used in @code{appcsxcad}
753 which provides a standalone graphical frontend to @{csxcad}.")
754 (license license:lgpl3+)))
755
756(define-public appcsxcad
757 (package
758 (name "appcsxcad")
759 (version "0.2.3")
760 (source
761 (origin
762 (method git-fetch)
763 (uri (git-reference
764 (url "https://github.com/thliebig/AppCSXCAD")
765 (commit (string-append "v" version))))
766 (file-name (git-file-name name version))
767 (sha256
768 (base32 "145awcsg4vl2xmrh5yf9fcasmghrai3x6ivgdxmrm1w3v9gyaccf"))))
769 (build-system qt-build-system)
770 (arguments
771 (list
772 #:qtbase qtbase ;for Qt 6
773 #:tests? #f)) ;No tests.
774 (inputs (list boost
775 cgal
776 csxcad
777 eigen
778 expat
779 freetype
780 gmp
781 hdf5
782 libjpeg-turbo
783 libpng
784 libtiff
785 lz4
786 openmpi
787 qcsxcad
788 tinyxml
789 vtk))
790 (home-page "https://github.com/thliebig/AppCSXCAD")
791 (synopsis "Minimal GUI application for the @code{qcsxcad} library")
792 (description
793 "A minimal application for the @code{qcsxcad} library which is used to
794 describe geometrical objects and their physical and non-physical properties.")
795 (license license:gpl3)))
796
797(define-public openems
798 (package
799 (name "openems")
800 (version "0.0.36")
801 (source
802 (origin
803 (method git-fetch)
804 (uri (git-reference
805 (url "https://github.com/thliebig/openEMS")
806 (commit (string-append "v" version))))
807 (file-name (git-file-name name version))
808 (sha256
809 (base32 "1vxlknnji7kha0kabpjqh48i4r0rqlla9gcxhn69d0gcw76albmw"))))
810 (build-system cmake-build-system)
811 (arguments
812 (list
813 #:configure-flags
814 #~(list (string-append "-DCSXCAD_ROOT_DIR="
815 #$(this-package-input "csxcad"))
816 (string-append "-DFPARSER_ROOT_DIR="
817 #$(this-package-input "fparser")))
818 #:phases
819 #~(modify-phases %standard-phases
820 (add-after 'unpack 'fix-cmake
821 (lambda _
822 (substitute* "CMakeLists.txt"
823 ((" system\n") "")
824 (("find_package\\(HDF5 1.8 COMPONENTS C HL REQUIRED\\)")
825 "find_package(HDF5 1.8 REQUIRED)"))))
826 (delete 'check)
827 (add-after 'install 'check
828 (lambda* (#:key tests? source inputs #:allow-other-keys)
829 (when tests?
830 (let* ((testsuite (string-append source "/TESTSUITE"))
831 (testsuite-tmp "/tmp/openEMS-TESTSUITE"))
832 ;; Testsuite directory needs to be writable.
833 (copy-recursively testsuite testsuite-tmp)
834 (invoke "octave" "--no-gui" "--eval"
835 (string-append
836 "addpath('" #$output "/share/openEMS/matlab');"
837 "addpath('"
838 (search-input-directory inputs "share/CSXCAD/matlab")
839 "');"
840 ;; Work around bug in test script.
841 "addpath('" testsuite-tmp "/helperscripts');"
842 "run('" testsuite-tmp "/run_testsuite.m');")))))))))
843 (native-inputs (list cmake-minimal octave pkg-config))
844 (inputs (list boost
845 csxcad
846 fparser
847 hdf5
848 openmpi
849 tinyxml
850 vtk))
851 (home-page "https://www.openems.de")
852 (synopsis "Electromagnetic field solver")
853 (description "@code{OpenEMS} is an electromagnetic field solver using
854the @acronym{FDTD, Finite-Difference Time-Domain} method.")
855 (license license:gpl3+)))
856
857(define-public python-openems
858 (package
859 (inherit openems)
860 (name "python-openems")
861 (build-system pyproject-build-system)
862 (arguments
863 (list
864 #:tests? #f ; No tests. Check again on package upgrade.
865 #:phases
866 #~(modify-phases %standard-phases
867 (add-after 'unpack 'fix-sources
868 ;; Check if this is still needed on upgrade.
869 (lambda _
870 (substitute* "python/openEMS/_nf2ff.pxd"
871 (("cimport cython.numeric")
872 "import cython
873from cython cimport numeric"))))
874 (add-before 'build 'prepare-build
875 (lambda* _
876 (chdir "./python")
877 (setenv "CSXCAD_INSTALL_PATH"
878 #$(this-package-input "csxcad"))
879 (setenv "OPENEMS_INSTALL_PATH"
880 #$(this-package-input "openems")))))))
881 (native-inputs (list python-cython python-setuptools))
882 (inputs (list csxcad
883 fparser
884 openems
885 python-csxcad
886 python-hdf5storage
887 python-numpy
888 tinyxml))
889 (home-page "https://www.openems.de")
890 (synopsis "Python API for the electromagnetic field solver @code{OpenEMS}")
891 (description "@code{OpenEMS} is an electromagnetic field solver using
892the @acronym{FDTD, Finite-Difference Time-Domain} method.")
893 (license license:gpl3+)))
894
895(define-public fritzing
896 (package
897 (name "fritzing")
898 (version "0.9.6")
899 (source
900 (origin
901 (method git-fetch)
902 (uri (git-reference
903 (url "https://github.com/fritzing/fritzing-app")
904 (commit version)))
905 (file-name (git-file-name name version))
906 (sha256
907 (base32 "083nz7vj7a334575smjry6257535h68gglh8a381xxa36dw96aqs"))
908 (patches (search-patches "fritzing-0.9.6-fix-types.patch"))))
909 (build-system gnu-build-system)
910 (arguments
911 (list
912 #:phases
913 #~(modify-phases %standard-phases
914 (add-after 'unpack 'patch-files
915 (lambda _
916 ;; Trick the internal mechanism to load the parts
917 (substitute* "src/version/partschecker.cpp"
918 ((".*git_libgit2_init.*")
919 "return \"083nz7vj7a334575smjry6257535h68gglh8a381xxa36dw96aqs\";"))
920 (substitute* "src/utils/textutils.cpp"
921 (("QUuid::createUuid\\(\\)") "QUuid()"))))
922 (replace 'configure
923 (lambda _
924 ;; Integrate parts library
925 (copy-recursively
926 (string-append #$(this-package-native-input "fritzing-parts")
927 "/share/library")
928 "parts")
929 ;; Use system libgit2 and boost.
930 (substitute* "phoenix.pro"
931 (("^LIBGIT_STATIC.*")
932 (string-append
933 "LIBGIT2INCLUDE=" #$(this-package-input "libgit2") "/include\n"
934 "LIBGIT2LIB=" #$(this-package-input "libgit2") "/lib\n"
935 "INCLUDEPATH += $$LIBGIT2INCLUDE\n"
936 "LIBS += -L$$LIBGIT2LIB -lgit2\n"))
937 (("^.*pri/libgit2detect.pri.") ""))
938 (invoke "qmake"
939 (string-append "QMAKE_LFLAGS_RPATH=-Wl,-rpath," #$output "/lib")
940 (string-append "PREFIX=" #$output)
941 "phoenix.pro")))
942 (add-after 'install 'generate-parts-db
943 (lambda* (#:key outputs #:allow-other-keys)
944 (let ((out (assoc-ref outputs "out"))
945 (env-qt-qpa-platform (getenv "QT_QPA_PLATFORM"))
946 (env-qt-hash-seed (getenv "QT_HASH_SEED")))
947 (setenv "QT_QPA_PLATFORM" "offscreen")
948 (setenv "QT_HASH_SEED" "0")
949 (invoke (string-append out "/bin/Fritzing")
950 "-db" (string-append out "/share/fritzing/parts/parts.db")
951 "-folder" (string-append out "/share/fritzing"))
952 (setenv "QT_QPA_PLATFORM" env-qt-qpa-platform)
953 (setenv "QT_HASH_SEED" env-qt-hash-seed)))))))
954 (native-inputs
955 (list fritzing-parts))
956 (inputs
957 (list boost
958 libgit2
959 qtbase-5
960 qtserialport-5
961 qtsvg-5
962 zlib))
963 (home-page "https://fritzing.org")
964 (synopsis "Electronic circuit design")
965 (description
966 "The Fritzing application is @dfn{Electronic Design Automation} (EDA)
967software with a low entry barrier, suited for the needs of makers and
968hobbyists. It offers a unique real-life \"breadboard\" view, and a parts
969library with many commonly used high-level components. Fritzing makes it very
970easy to communicate about circuits, as well as to turn them into PCB layouts
971ready for production.")
972 ;; Documentation and parts are released under CC-BY-SA 3.0; source code is
973 ;; released under GPLv3+.
974 (license (list license:gpl3+ license:cc-by-sa3.0))))
975
976(define-public fritzing-parts
977 ;; XXX: Release of the parts stopped in 2016 and it looks like develop
978 ;; branch has latest changes comparing to other branches.
979 (let ((commit "d61d63de9294343b1b6e86f149e78e4b1d3a0009")
980 (revision "0"))
981 (package
982 (name "fritzing-parts")
983 (version (git-version "0.9.6" revision commit))
984 (source
985 (origin
986 (method git-fetch)
987 (uri (git-reference
988 (url "https://github.com/fritzing/fritzing-parts")
989 (commit commit)))
990 (file-name (git-file-name "fritzing-parts" version))
991 (sha256
992 (base32 "0g39ja1aqw5qx8alf61m6zcy6y78j9ky556x6x1cnd6g7kkzd861"))))
993 (build-system copy-build-system)
994 (arguments
995 (list
996 #:install-plan
997 #~'(("." "share/library/"
998 #:exclude-regexp (".github.*"
999 ".gitignore"
1000 "CONTRIBUTING.md"
1001 "LICENSE.txt"
1002 "README.md")))
1003 #:modules '(((guix build gnu-build-system) #:prefix gnu:)
1004 (guix build copy-build-system)
1005 (guix build utils)
1006 (ice-9 match))))
1007 (home-page "https://fritzing.org")
1008 (synopsis "Electronic components (parts library) for use in the Fritzing app")
1009 (description "This package contains all part definitions that are
1010required for Fritzing app.")
1011 (license license:cc-by-sa3.0))))
1012
1013(define-public qelectrotech
1014 (package
1015 (name "qelectrotech")
1016 (version "0.9.0")
1017 (source
1018 (origin
1019 (method git-fetch)
1020 (uri (git-reference
1021 (url "https://github.com/qelectrotech/qelectrotech-source-mirror")
1022 (commit version)))
1023 (file-name (git-file-name name version))
1024 (sha256
1025 (base32 "17rrr9l11wc2ni3pxybq595dc4l1lklaba7rd562r8qc00f5r7zl"))))
1026 (build-system qt-build-system)
1027 (arguments
1028 ;; XXX: tests are built for the CMake build option but it seems to be
1029 ;; broken in 0.8.0.
1030 (list #:tests? #f
1031 #:modules '((guix build qt-build-system)
1032 ((guix build gnu-build-system) #:prefix gnu:)
1033 (guix build utils))
1034 #:phases
1035 #~(modify-phases %standard-phases
1036 (replace 'configure
1037 (lambda _
1038 ;; Patch hardcoded path before running qmake.
1039 (substitute* "qelectrotech.pro"
1040 (("\\/usr\\/local") #$output))
1041 (invoke "qmake")))
1042 (replace 'build (assoc-ref gnu:%standard-phases 'build))
1043 (replace 'install (assoc-ref gnu:%standard-phases 'install)))))
1044 (native-inputs
1045 (list pkg-config qttools-5))
1046 (inputs
1047 (list kcoreaddons-5 kwidgetsaddons-5 qtbase-5 qtsvg-5 qtwayland-5 sqlite))
1048 (home-page "https://qelectrotech.org/")
1049 (synopsis "CAD/CAE editor focusing on schematics drawing features")
1050 (description "QElectroTech, or QET in short, is a desktop application to
1051create diagrams and schematics. The software is primarily intended to create
1052electrical documentation but it can also be used to draw any kinds of diagrams,
1053such as those made in pneumatics, hydraulics, process industries, electronics,
1054and others.")
1055 (license license:gpl2+)))
1056
1057(define-public translate2geda
1058 ;; There has been no formal release yet.
1059 (let ((commit "2ec576e608a6f6eead5f6bc1952234d9874703c7")
1060 (revision "2"))
1061 (package
1062 (name "translate2geda")
1063 (version (git-version "0" revision commit))
1064 (source (origin
1065 (method git-fetch)
1066 (uri (git-reference
1067 (url "https://github.com/erichVK5/translate2geda")
1068 (commit commit)))
1069 (file-name (git-file-name name version))
1070 (sha256
1071 (base32
1072 "0pcwbnp25fjzznzw97d233awa4j0sdfi06wza45rsp8nx1ri7a7k"))))
1073 (build-system ant-build-system)
1074 (arguments
1075 (list #:tests? #f ; there are no tests
1076 #:jar-name "translate2geda.jar"
1077 #:source-dir "."
1078 #:main-class "translate2geda"
1079 #:phases
1080 #~(modify-phases %standard-phases
1081 (add-after 'install 'install-bin
1082 (lambda _
1083 (let* ((bin (string-append #$output "/bin"))
1084 (wrapper (string-append bin "/translate2geda"))
1085 (jar "/share/java/translate2geda.jar"))
1086 (mkdir-p bin)
1087 (with-output-to-file wrapper
1088 (lambda _
1089 (format #t
1090 "#!/bin/sh~%exec ~a -jar ~a~a~%"
1091 (which "java")
1092 #$output
1093 jar)))
1094 (chmod wrapper #o555)))))))
1095 (home-page "https://github.com/erichVK5/translate2geda")
1096 (synopsis "Utility for converting symbol and footprint formats to gEDA")
1097 (description
1098 "This package provides a utility for converting Kicad (@file{.mod},
1099@file{.lib}), Eagle (@file{.lbr}), gerber (@file{.gbr}, etc..),
1100BXL (@file{.bxl}), IBIS (@file{.ibs}), symdef, LT-Spice (@file{.asc}),
1101QUCS (@file{.sch}), and BSDL (@file{.bsd}) symbols and footprints and EggBot
1102fonts to gEDA.")
1103 (license license:gpl2+))))
1104
1105(define-public libfive
1106 (let ((commit "8d7e15dcb1aa77deaba771856a3dc10ec0ca46b1")
1107 (revision "6"))
1108 (package
1109 (name "libfive")
1110 (version (git-version "0" revision commit))
1111 (source (origin
1112 (method git-fetch)
1113 (uri (git-reference
1114 (url "https://github.com/libfive/libfive")
1115 (commit commit)))
1116 (sha256
1117 (base32
1118 "1zzq831gxhr6d79glvkhmcfxsq8liagg5hfix0yaqn1nfqdrqrdj"))
1119 (file-name (git-file-name name version))))
1120 (build-system cmake-build-system)
1121 (arguments
1122 (list
1123 #:tests? #f ; Several tests fail due to floating point error.
1124 #:imported-modules `((guix build guile-build-system)
1125 ,@%cmake-build-system-modules)
1126 #:modules '((guix build cmake-build-system)
1127 ((guix build guile-build-system) #:prefix guile:)
1128 (guix build utils))
1129 #:configure-flags #~(list
1130 (string-append
1131 "-DPYTHON_SITE_PACKAGES_DIR="
1132 #$output "/lib/python"
1133 #$(version-major+minor
1134 (package-version
1135 (this-package-input "python-wrapper")))
1136 "/site-packages"))
1137 #:phases
1138 #~(modify-phases %standard-phases
1139 (add-after 'unpack 'remove-native-compilation
1140 (lambda _
1141 (substitute* "CMakeLists.txt" (("-march=native") ""))))
1142 (add-after 'unpack 'remove-environment-variable-override
1143 (lambda _
1144 (substitute* "studio/src/guile/interpreter.cpp"
1145 (("qputenv\\(\"GUILE_LOAD_COMPILED_PATH\".*") ""))))
1146 (add-after 'unpack 'fix-library-location
1147 (lambda _
1148 (substitute* "libfive/bind/guile/libfive/lib.scm"
1149 (("\\(get-environment-variable \"LIBFIVE_FRAMEWORK_DIR\"\\)" m)
1150 (string-append m "\n\"" #$output "/lib/\""))
1151 (("\\(get-environment-variable \"LIBFIVE_STDLIB_DIR\"\\)" m)
1152 (string-append m "\n\"" #$output "/lib/\"")))
1153 (substitute* "libfive/bind/python/libfive/ffi.py"
1154 (("os.environ.get\\('LIBFIVE_FRAMEWORK_DIR'\\)" m)
1155 (string-append m " or \"" #$output "/lib/\"")))))
1156 (add-before 'build 'generate-bindings
1157 (lambda _
1158 ;; These files already exist but we regenerate them from source
1159 (with-directory-excursion "../source/libfive/stdlib"
1160 (substitute* '("gen_scm.py" "gen_c.py" "gen_py.py")
1161 (("datetime.now\\(\\)\\.strftime\\([^)]+)") "\"N/A\"")
1162 (("os\\.getlogin\\(\\)") "\"guix\""))
1163 (invoke "python" "gen_scm.py")
1164 (invoke "python" "gen_c.py")
1165 (invoke "python" "gen_py.py"))))
1166 (add-after 'unpack 'do-not-build-guile-bindings
1167 (lambda _
1168 (delete-file "libfive/bind/guile/CMakeLists.txt")
1169 (call-with-output-file
1170 "libfive/bind/guile/CMakeLists.txt"
1171 (lambda (port)
1172 (display "add_custom_target(libfive-guile)\n" port)))))
1173 (add-after 'build 'guile-build
1174 (lambda args
1175 (apply (assoc-ref guile:%standard-phases 'build)
1176 #:source-directory "../source/libfive/bind/guile"
1177 #:compile-flags '()
1178 #:parallel-build? #f
1179 #:scheme-file-regexp #$default-scheme-file-regexp
1180 #:not-compiled-file-regexp #f
1181 args)))
1182 (add-after 'install 'wrap-studio
1183 (lambda _
1184 (let* ((effective-version (guile:target-guile-effective-version))
1185 (scm (string-append #$output "/share/guile/site/"
1186 effective-version))
1187 (go (string-append #$output "/lib/guile/"
1188 effective-version "/site-ccache"))
1189 (py (string-append #$output "/lib/python"
1190 #$(version-major+minor
1191 (package-version
1192 (this-package-input "python-wrapper")))
1193 "/site-packages")))
1194 (wrap-program (string-append #$output "/bin/Studio")
1195 `("GUILE_LOAD_PATH" ":" prefix (,scm))
1196 `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,go))
1197 `("GUIX_PYTHONPATH" ":" prefix (,py)))))))))
1198 (native-inputs
1199 (list pkg-config))
1200 (inputs
1201 (list bash-minimal boost eigen guile-3.0 libpng python-wrapper qtbase))
1202 (home-page "https://libfive.com")
1203 (synopsis "Tool for programmatic computer-aided design")
1204 (description
1205 "Libfive is a tool for programmatic computer-aided design (CAD). In
1206libfive, solid models are defined as Scheme or Python scripts, and there are
1207no opaque function calls into the geometry kernel: everything is visible to
1208the user. Even fundamental, primitive shapes are represented as code in the
1209user-level language.")
1210 (license (list license:mpl2.0 ;library
1211 license:gpl2+)) ;Guile bindings and GUI
1212
1213 ;; Mark as tunable to take advantage of SIMD code in Eigen.
1214 (properties '((tunable? . #t))))))
1215
1216;; TODO: Keep in sync with radare2.
1217(define-public iaito
1218 (package
1219 (name "iaito")
1220 (version "6.2.2")
1221 (source (origin
1222 (method git-fetch)
1223 (uri (git-reference
1224 (url "https://github.com/radareorg/iaito")
1225 (commit version)))
1226 (sha256
1227 (base32
1228 "0p6k6hx16w2ygl9vxgzy57wflgqx2vjf5ab4scfv80avdqljif60"))
1229 (file-name (git-file-name name version))))
1230 (build-system gnu-build-system)
1231 (arguments
1232 (list
1233 #:tests? #f ;no tests
1234 #:modules '((guix build gnu-build-system) (guix build qt-utils)
1235 (guix build utils))
1236 #:imported-modules `((guix build qt-utils)
1237 ,@%default-gnu-imported-modules)
1238 #:phases
1239 #~(modify-phases %standard-phases
1240 ;; The build system assumes the sdb lib is installed alongside
1241 ;; radare2. We already patch the radare2 package to use a
1242 ;; system-installed sdb rather than install its own, so we must
1243 ;; propagate those changes here.
1244 (add-before 'configure 'add-sdb-libs
1245 (lambda _
1246 (substitute* '("./src/lib_radare2.pri")
1247 (("pkg-config --libs r_core" all)
1248 (string-append all " sdb")))))
1249 (add-after 'install 'wrap-qt
1250 (lambda* (#:key inputs outputs #:allow-other-keys)
1251 (wrap-all-qt-programs #:outputs outputs
1252 #:inputs inputs
1253 #:qtbase (assoc-ref inputs "qtbase")))))))
1254 (inputs
1255 (list qtbase
1256 qtsvg
1257 qtwayland
1258 radare2))
1259 (native-inputs
1260 (list pkg-config python-minimal-wrapper))
1261 (native-search-paths (list (search-path-specification
1262 (variable "R2_LIBR_PLUGINS")
1263 (files (list "lib/radare2"))
1264 (separator #f)))) ;single value
1265 (home-page "https://github.com/radareorg/iaito")
1266 (synopsis "Official radare2 GUI")
1267 (description "Iaito is the official graphical interface for radare2, a
1268libre reverse engineering framework. Iaito focuses on simplicity, parity with
1269commands, features, and keybindings.")
1270 (license license:gpl3+)))
1271
1272(define-public inspekt3d
1273 (let ((commit "703f52ccbfedad2bf5240bf8183d1b573c9d54ef")
1274 (revision "0"))
1275 (package
1276 (name "inspekt3d")
1277 (version (git-version "0" revision commit))
1278 (source (origin
1279 (method git-fetch)
1280 (uri (git-reference
1281 (url "https://gitlab.com/kavalogic-inc/inspekt3d.git")
1282 (commit commit)))
1283 (file-name (git-file-name name version))
1284 (sha256
1285 (base32
1286 "0lan6930g5a9z4ack9jj0zdd0mb2s6q2xzpiwcjdc3pvl9b1nbw4"))
1287 (modules '((guix build utils)))
1288 ;; Allow builds with Guile 3.0.
1289 (snippet
1290 '(substitute* "configure.ac"
1291 (("2\\.2") "3.0 2.2")))))
1292 (build-system gnu-build-system)
1293 (arguments
1294 (list
1295 #:phases
1296 #~(modify-phases %standard-phases
1297 (add-after 'unpack 'patch-libfive-guile-location
1298 (lambda _
1299 (substitute* "inspekt3d/library.scm"
1300 (("\\(load-extension \"libfive-guile\" \"scm_init_libfive_modules\"\\)") "#t")
1301 (("\"libfive-guile")
1302 (string-append "\""
1303 #$(this-package-input "libfive")
1304 "/lib/libfive-stdlib"))))))))
1305 (native-inputs
1306 (list autoconf automake pkg-config))
1307 (inputs
1308 (list mesa guile-3.0))
1309 (propagated-inputs
1310 `(("libfive" ,libfive)
1311 ("guile-opengl" ,guile3.0-opengl)))
1312 (home-page "https://gitlab.com/kavalogic-inc/inspekt3d/")
1313 (synopsis "Lightweight 3D viewer for Libfive written in Guile Scheme")
1314 (description
1315 "Inspekt3d is a lightweight 3D viewer for Libfive written in Guile Scheme.
1316The viewer can be used interactively with a REPL (for example Geiser in
1317Emacs).")
1318 (license license:gpl3+))))
1319
1320(define-public librseq
1321 ;; There's no release.
1322 (let ((commit "c3ed6b64bbe1944bd8de8b9fde14e7c290f02a90")
1323 (revision "2"))
1324 (package
1325 (name "librseq")
1326 (version (git-version "0.0.0" revision commit))
1327 (source (origin
1328 (method git-fetch)
1329 (uri (git-reference
1330 (url "https://github.com/compudj/librseq.git")
1331 (commit commit)))
1332 (file-name (git-file-name name version))
1333 (sha256
1334 (base32
1335 "046lrfw87gjbr4rvs054s6wk22c4xcmrcww04wkpnxmy5vp33mk3"))))
1336 (build-system gnu-build-system)
1337 (inputs
1338 (list numactl))
1339 (native-inputs
1340 (list autoconf
1341 automake
1342 libtool
1343 pkg-config))
1344 (home-page "https://github.com/compudj/librseq")
1345 (synopsis "Userspace library for restartable sequences")
1346 (description "A restartable sequence is a critical region delimited by a
1347program where if its execution is preempted or interrupted, the kernel will
1348divert the program control flow to a defined abort handler. They are a good
1349alternative to atomic operations for critical fast paths and are usually used
1350in the context of per-cpu data. The library offers ABI headers to interface
1351with the kernel and various utilities such as per-cpu counters.")
1352 (license (list license:lgpl2.1 license:expat)))))
1353
1354(define-public valeronoi
1355 (package
1356 (name "valeronoi")
1357 (version "0.3.1")
1358 (source
1359 (origin
1360 (method git-fetch)
1361 (uri (git-reference
1362 (url "https://github.com/ccoors/Valeronoi")
1363 (commit (string-append "v" version))))
1364 (file-name (git-file-name name version))
1365 (sha256
1366 (base32 "11avqrxrzbcrw1dz38hlifl5r7l4qfvlbyn4ln7b2jjmgwqcmh6y"))
1367 (snippet #~(begin
1368 (use-modules (guix build utils))
1369 (with-directory-excursion "3rdparty"
1370 (delete-file "catch.hpp")
1371 (delete-file "LICENSE_1_0.txt"))
1372 (with-directory-excursion "tests"
1373 (substitute* '("test_colormap.cpp"
1374 "test_main.cpp"
1375 "test_wifi_information.cpp"
1376 "test_robot_map.cpp"
1377 "test_measurements.cpp"
1378 "test_wifi_collection.cpp"
1379 "test_segment_generator.cpp")
1380 (("catch\\.hpp")
1381 "catch2/catch.hpp")))))))
1382 (build-system qt-build-system)
1383 (arguments
1384 (list #:qtbase qtbase
1385 #:phases
1386 #~(modify-phases %standard-phases
1387 (replace 'check
1388 (lambda* (#:key tests? #:allow-other-keys)
1389 (when tests?
1390 (invoke "./valeronoi-tests")))))))
1391 (inputs (list boost
1392 cgal
1393 gmp
1394 libxkbcommon
1395 mpfr
1396 openssl
1397 qtbase
1398 qtsvg
1399 qtwayland))
1400 (native-inputs (list catch2-2))
1401 (home-page "https://github.com/ccoors/Valeronoi")
1402 (synopsis "WiFi mapping companion application for Valetudo")
1403 (description
1404 "Valeronoi (Valetudo + Voronoi) is a companion for Valetudo for generating
1405WiFi signal strength maps. It visualizes them using a Voronoi diagram.")
1406 (license (list license:gpl3+
1407 ;; License for the included "3rdparty/mdns.h"
1408 license:public-domain))))
1409
1410(define-public volk
1411 (package
1412 (name "volk")
1413 (version "3.3.0")
1414 (source
1415 (origin
1416 (method git-fetch)
1417 (uri (git-reference
1418 (url "https://github.com/gnuradio/volk")
1419 (commit (string-append "v" version))
1420 (recursive? #t))) ; for cpu_features git submodule
1421 (file-name (git-file-name name version))
1422 (sha256
1423 (base32 "1b6q7z971myih3q88lv01iwmwsjln7wibav365j7phnclr9hg41i"))))
1424 (build-system cmake-build-system)
1425 (arguments
1426 (list
1427 #:phases
1428 #~(modify-phases %standard-phases
1429 (add-after 'unpack 'disable-check-lgpl-test
1430 ;; Disable the failing check-lgpl test that is supposed to be run
1431 ;; only by upstream developers to check the authors and licenses
1432 ;; of contributions in the git history.
1433 (lambda _
1434 (substitute* "scripts/licensing/count_contrib.sh"
1435 (("#!/bin/bash" all)
1436 (string-append all "\nexit 0")))))
1437 (add-after 'install 'remove-static-libraries
1438 ;; Remove libcpu_features.a (and any others that might appear).
1439 (lambda _
1440 (for-each delete-file
1441 (find-files (string-append #$output "/lib")
1442 "\\.a$"
1443 #:fail-on-error? #t))))
1444 (add-after 'install 'wrap-pythonpath
1445 (lambda* (#:key inputs outputs #:allow-other-keys)
1446 (let* ((python (assoc-ref inputs "python"))
1447 (file (string-append #$output "/bin/volk_modtool"))
1448 (path (string-append
1449 #$output
1450 "/lib/python"
1451 #$(version-major+minor (package-version python))
1452 "/site-packages:"
1453 (getenv "GUIX_PYTHONPATH"))))
1454 (wrap-program file
1455 `("GUIX_PYTHONPATH" ":" prefix (,path))
1456 `("PATH" ":" prefix
1457 (,(string-append python "/bin:"))))))))))
1458 (inputs
1459 (list bash-minimal ;for wrap-program
1460 boost
1461 fmt
1462 python-wrapper
1463 python-mako))
1464 (home-page "https://www.libvolk.org/")
1465 (synopsis "Vector-Optimized Library of Kernels")
1466 (description
1467 "@acronym{VOLK, Vector-Optimized Library of Kernels} contains procedures
1468with machine-specific optimizations for mathematical functions. It also
1469provides a machine-independent interface to select the best such procedures to
1470use on a given system.")
1471 (license (list license:asl2.0 ; cpu_features
1472 license:lgpl3+))))
1473
1474(define-public libredwg
1475 (package
1476 (name "libredwg")
1477 (version "0.14")
1478 (source
1479 (origin
1480 (method url-fetch)
1481 (uri (string-append "mirror://gnu/libredwg/libredwg-"
1482 version ".tar.xz"))
1483 (sha256
1484 (base32 "0x8jm16ki6151aj8y27xwgaqk1szx8cndlhfy9h5k1jgk0xvgsv2"))))
1485 (build-system gnu-build-system)
1486 (arguments
1487 (list
1488 #:configure-flags
1489 #~(list "--disable-bindings"
1490 "--disable-write" ;check fails, see README
1491 #$(string-append "CFLAGS="
1492 " -Wno-error=implicit-function-declaration"))))
1493 (native-inputs
1494 (list libxml2
1495 parallel
1496 perl
1497 pkg-config
1498 python-wrapper))
1499 (inputs
1500 (list pcre2))
1501 (home-page "https://www.gnu.org/software/libredwg/")
1502 (synopsis "C library to handle DWG (CAD-related) files")
1503 (description
1504 "GNU LibreDWG is a C library to handle DWG files. It aims to be a free
1505replacement for the OpenDWG libraries.")
1506 (license license:gpl3+)))
1507
1508(define-public microcom
1509 (package
1510 (name "microcom")
1511 (version "2025.11.0")
1512 (source
1513 (origin
1514 (method git-fetch)
1515 (uri (git-reference
1516 (url "https://git.pengutronix.de/git/tools/microcom.git")
1517 (commit (string-append "v" version))))
1518 (file-name (git-file-name name version))
1519 (sha256
1520 (base32 "082q2jynycdj8wrkpd8azdwdfh9vhj4mpzarg444mw5zx3x972fn"))))
1521 (build-system gnu-build-system)
1522 (inputs (list readline))
1523 (native-inputs (list automake autoconf))
1524 (home-page "https://git.pengutronix.de/cgit/tools/microcom")
1525 (synopsis "Minimalistic serial line terminal program")
1526 (description
1527 "Microcom is a minimalistic terminal program for accessing devices
1528via a serial connection. It features connection via RS232 serial interfaces
1529(including setting of transfer rates) as well as in @code{telnetmode} as
1530specified in rfc2217 and a (Linux specific) CAN mode.")
1531 (license license:gpl2+)))
1532
1533(define-public minicom
1534 (package
1535 (name "minicom")
1536 (version "2.11.1")
1537 (source
1538 (origin
1539 (method git-fetch)
1540 (uri (git-reference
1541 (url "https://salsa.debian.org/minicom-team/minicom.git")
1542 (commit version)))
1543 (sha256
1544 (base32 "15k20qbxrjdxadwzkp31hjy7apdasrsgs532kwmlkpzs92ff4ghs"))
1545 (file-name (git-file-name name version))))
1546 (build-system gnu-build-system)
1547 (arguments
1548 (list
1549 #:configure-flags
1550 #~(list "--enable-lock-dir=/var/lock")
1551 #:phases
1552 #~(modify-phases %standard-phases
1553 (add-after 'unpack 'make-git-checkout-writable
1554 (lambda _
1555 (for-each make-file-writable (find-files "."))))
1556 (replace 'bootstrap
1557 ;; autogen.sh needlessly hard-codes aclocal-1.14.
1558 (lambda _
1559 (invoke "autoreconf" "-vif")))
1560 (add-before 'configure 'patch-lock-check
1561 (lambda _
1562 (substitute* "configure"
1563 (("test -d [$]UUCPLOCK") "true")))))))
1564 (native-inputs
1565 (list autoconf-2.71 automake gettext-minimal pkg-config))
1566 (inputs
1567 (list ncurses/tinfo))
1568 (home-page "https://salsa.debian.org/minicom-team/minicom")
1569 (synopsis "Serial terminal emulator")
1570 (description "@code{minicom} is a serial terminal emulator.")
1571 (license license:gpl2+)))
1572
1573(define-public sterm
1574 (package
1575 (name "sterm")
1576 (version "20200306")
1577 (source (origin
1578 (method git-fetch)
1579 (uri (git-reference
1580 (url "https://github.com/wentasah/sterm")
1581 (commit version)))
1582 (file-name (git-file-name name version))
1583 (sha256
1584 (base32
1585 "031pd8yz2bfzqbari6za1c3xcqmw94ap4vbrjzb3v6izjcrca58c"))))
1586 (build-system gnu-build-system)
1587 (arguments
1588 `(#:tests? #f ; no tests
1589 #:make-flags
1590 (list (string-append "CC=" ,(cc-for-target))
1591 (string-append "PREFIX=" %output))
1592 #:phases
1593 (modify-phases %standard-phases (delete 'configure))))
1594 (synopsis "Simple serial terminal")
1595 (description "This is a minimalist terminal program like minicom or cu.
1596The only thing it does is creating a bidirectional connection between
1597stdin/stdout and a terminal device (e.g. serial line).
1598It can also set serial line baudrate, manipulate DTR/RTS modem lines,
1599send break and throttle transmission speed.")
1600 (home-page "https://github.com/wentasah/sterm")
1601 (license license:gpl3+)))
1602
1603(define-public libmodbus
1604 (package
1605 (name "libmodbus")
1606 (version "3.1.11")
1607 (source (origin
1608 (method git-fetch)
1609 (uri (git-reference
1610 (url "https://github.com/stephane/libmodbus")
1611 (commit (string-append "v" version))))
1612 (file-name (git-file-name name version))
1613 (sha256
1614 (base32
1615 "15rqrzamlp6cvixz6klnawlc9s3w34bapc1fs2c4amwyvi3n5xvp"))
1616 ;; The patch removes a test that requires networking.
1617 ;; See <https://github.com/stephane/libmodbus/issues/802>
1618 (patches
1619 (search-patches "libmodbus-disable-networking-test.patch"))))
1620 (build-system gnu-build-system)
1621 (native-inputs (list autoconf psmisc automake libtool))
1622 (synopsis "Library for the Modbus protocol")
1623 (description "@code{libmodbus} is a library to send/receive data with a
1624device which respects the Modbus protocol. This library can use a serial port
1625or an Ethernet connection.")
1626 (home-page "https://libmodbus.org/")
1627 (license license:lgpl2.1+)))
1628
1629(define-public harminv
1630 (package
1631 (name "harminv")
1632 (version "1.4.2")
1633 (source (origin
1634 (method url-fetch)
1635 (uri
1636 (string-append "https://github.com/stevengj/harminv/"
1637 "releases/download/v" version "/"
1638 name "-" version ".tar.gz"))
1639 (sha256
1640 (base32
1641 "18n71d3wj0jnldh72vb9lfj3vv64s1i2rmnhcpq4494p23vip6js"))))
1642 (build-system gnu-build-system)
1643 (arguments
1644 `(#:configure-flags '("--enable-shared")
1645 #:phases
1646 (modify-phases %standard-phases
1647 (add-before 'configure 'fix-tests
1648 (lambda _
1649 (substitute* "./sines-test.sh"
1650 ; change test frequency range - default fails
1651 (("0\\.15") "0.16"))
1652 #t)))))
1653 (native-inputs
1654 `(("fortran" ,gfortran)))
1655 (inputs
1656 (list openblas))
1657 (home-page "https://github.com/stevengj/harminv")
1658 (synopsis "Harmonic inversion solver")
1659 (description
1660 "Harminv is a free program (and accompanying library) to solve the problem of
1661harmonic inversion — given a discrete-time, finite-length signal that consists of a sum
1662of finitely-many sinusoids (possibly exponentially decaying) in a given bandwidth, it
1663determines the frequencies, decay constants, amplitudes, and phases of those sinusoids.")
1664 (license license:gpl2+)))
1665
1666(define-public guile-libctl
1667 (package
1668 (name "guile-libctl")
1669 (version "4.7.1")
1670 (source (origin
1671 (method git-fetch)
1672 (uri (git-reference
1673 (url "https://github.com/NanoComp/libctl")
1674 (commit (string-append "v" version))))
1675 (file-name (git-file-name name version))
1676 (sha256
1677 (base32
1678 "1h0kg8cx4x7gjzg0wzk5qd90f5mxwyihlh9q1j2mznj7b0ag77yr"))))
1679 (build-system gnu-build-system)
1680 (arguments
1681 (list #:configure-flags
1682 #~(list "--enable-shared")
1683 #:phases
1684 #~(modify-phases %standard-phases
1685 ;; Avoid bin/sh shebang in configure.
1686 (add-before 'bootstrap 'no-/bin/sh
1687 (lambda _ (delete-file "autogen.sh"))))))
1688 (native-inputs
1689 (list autoconf
1690 automake
1691 libtool
1692 gfortran))
1693 (inputs
1694 (list guile-3.0))
1695 (home-page "https://libctl.readthedocs.io/en/latest/")
1696 (synopsis "Flexible control files implementation for scientific simulations")
1697 (description
1698 "Libctl is a Guile-based library implementing flexible control files
1699for scientific simulations.")
1700 (license license:gpl2+)))
1701
1702(define-public mpb
1703 (package
1704 (name "mpb")
1705 (version "1.12.0")
1706 (source (origin
1707 (method url-fetch)
1708 (uri
1709 (string-append
1710 "https://github.com/NanoComp/mpb/releases/download/v"
1711 version "/mpb-" version ".tar.gz"))
1712 (sha256
1713 (base32
1714 "197dm8z5hfikivb73rhywyq976rn1k621bf1admgc5xjaii20awd"))))
1715 (build-system gnu-build-system)
1716 (arguments
1717 (list
1718 #:configure-flags
1719 #~(list
1720 (string-append "--with-libctl="
1721 #$(this-package-input "guile-libctl") "/share/libctl")
1722 "--enable-shared")))
1723 (native-inputs
1724 (list gfortran
1725 pkg-config
1726 swig-4.4))
1727 (inputs
1728 (list fftw
1729 gsl
1730 guile-3.0
1731 guile-libctl
1732 hdf5
1733 openblas
1734 readline
1735 zlib))
1736 (home-page "https://mpb.readthedocs.io/en/latest/")
1737 (synopsis "Computes band structures and electromagnetic modes of dielectric
1738structures")
1739 (description
1740 "MIT Photonic-Bands (MPB) computes definite-frequency eigenstates
1741(harmonic modes) of Maxwell's equations in periodic dielectric structures for
1742arbitrary wavevectors, using fully-vectorial and three-dimensional methods.")
1743 (license license:gpl2+)))
1744
1745(define-public meep
1746 (package
1747 (name "meep")
1748 (version "1.34.0")
1749 (source (origin
1750 (method url-fetch)
1751 (uri
1752 (string-append
1753 "https://github.com/NanoComp/meep/releases/download/v"
1754 version "/meep-" version ".tar.gz"))
1755 (sha256
1756 (base32
1757 "1ihblq35z28shbb3s7xzkxpaagn5bwjx3visyc7kpqmkcr3894iw"))))
1758 (build-system gnu-build-system)
1759 (arguments
1760 (list #:configure-flags
1761 #~(list (string-append "--with-libctl="
1762 #$(this-package-input "guile-libctl")
1763 "/share/libctl"))))
1764 (native-inputs
1765 (list gfortran
1766 pkg-config
1767 swig-4.4))
1768 (inputs
1769 (list fftw
1770 gsl
1771 guile-3.0
1772 guile-libctl
1773 harminv
1774 hdf5
1775 mpb
1776 openblas
1777 zlib))
1778 (home-page "https://meep.readthedocs.io/en/latest/")
1779 (synopsis "Finite-difference time-domain (FDTD) simulation software")
1780 (description
1781 "Meep is a finite-difference time-domain (FDTD) simulation software package
1782developed at MIT to model electromagnetic systems.")
1783 (license license:gpl2+)))
1784
1785;; XXX: Deprecated on <2026-08-10>.
1786(define-deprecated/public-alias adms
1787 (@ (gnu packages electronics) adms))
1788
1789(define-public arduino-cli
1790 (package
1791 (properties
1792 '((release-commit . "01f3d4f2ba7c2eaafb5dc710c8a1903af7762fea")
1793 (release-date . "2026-06-05T09:39:33Z")))
1794 (name "arduino-cli")
1795 (version "1.5.1")
1796 (source
1797 (origin
1798 (method git-fetch)
1799 (uri (git-reference
1800 (url "https://github.com/arduino/arduino-cli")
1801 (commit (string-append "v" version))))
1802 (file-name (git-file-name name version))
1803 (sha256
1804 (base32 "15iqly4clwxp8l3kd7gfnmszbyq1586rjymc6a4zi6bh2q8zm59i"))))
1805 (build-system go-build-system)
1806 (arguments
1807 (list
1808 #:go go-1.26
1809 #:install-source? #f
1810 #:modules
1811 '((guix build go-build-system)
1812 (guix build utils)
1813 (ice-9 match))
1814 #:import-path "github.com/arduino/arduino-cli"
1815 #:build-flags
1816 #~(let ((base "github.com/arduino/arduino-cli/internal/"))
1817 (list (format #f "-ldflags=-X ~s -X ~s -X ~s"
1818 (string-append base "version.versionString="
1819 "v" #$version)
1820 (string-append base "version.commit="
1821 (string-take
1822 #$(assoc-ref properties 'release-commit) 7))
1823 (string-append base "version.date="
1824 #$(assoc-ref properties 'release-date)))))
1825 ;; List tests which need no internet resource
1826 ;; Skiping
1827 ;; internal/arduino/monitor
1828 ;; internal/arduino/resources
1829 ;; internal/arduino/cores/packagemanager
1830 ;; internal/cli/arguments
1831 ;; internal/integrationtest
1832 #:test-subdirs
1833 #~(list "commands"
1834 "internal/go-configmap"
1835 "internal/i18n"
1836 "internal/buildcache"
1837 "internal/cli/feedback"
1838 "internal/cli/feedback/result"
1839 "internal/locales"
1840 "internal/locales/cmd/po"
1841 "internal/arduino/utils"
1842 "internal/arduino/security"
1843 "internal/arduino/builder"
1844 "internal/arduino/builder/cpp"
1845 "internal/arduino/builder/internal/compilation"
1846 "internal/arduino/builder/internal/detector"
1847 "internal/arduino/builder/internal/diagnostics"
1848 "internal/arduino/builder/internal/preprocessor"
1849 "internal/arduino/builder/internal/preprocessor/internal/ctags"
1850 "internal/arduino/builder/internal/progress"
1851 "internal/arduino/builder/internal/runner"
1852 "internal/arduino/builder/internal/utils"
1853 "internal/arduino/cores"
1854 "internal/arduino/cores/packageindex"
1855 "internal/arduino/libraries"
1856 "internal/arduino/libraries/librariesindex"
1857 "internal/arduino/libraries/librariesmanager"
1858 "internal/arduino/libraries/librariesresolver"
1859 "internal/arduino/sketch"
1860 "internal/cli/configuration"
1861 "internal/cli/lib"
1862 "internal/cli/monitor"
1863 "internal/orderedmap"
1864 "pkg/fqbn")
1865 #:phases
1866 #~(modify-phases %standard-phases
1867 ;; Disable network release check for 'arduino-cli version'
1868 ;; command, by removing the 'res'ponse variable and setting
1869 ;; 'latestVersion' to empty string to simulate a no check
1870 ;; behavior.
1871 (add-after 'unpack 'disable-new-release-check
1872 (lambda* (#:key import-path #:allow-other-keys)
1873 (substitute*
1874 (string-append
1875 "src/" import-path "/internal/cli/version/version.go")
1876 (("res, (err ):= .*$" all first)
1877 (string-append "var " first "error\n"))
1878 (("(latestVersion = )res\\.GetNewestVersion\\(\\)"
1879 all first)
1880 (string-append first "\"\"")))))
1881 (add-after 'install 'install-shell-completions
1882 (lambda* (#:key native-inputs #:allow-other-keys)
1883 (for-each
1884 (match-lambda
1885 ((shell . path)
1886 (mkdir-p (in-vicinity #$output (dirname path)))
1887 (let ((binary
1888 (if #$(%current-target-system)
1889 (search-input-file native-inputs "bin/arduino-cli")
1890 (in-vicinity #$output "bin/arduino-cli"))))
1891 (with-output-to-file (in-vicinity #$output path)
1892 (lambda _
1893 (setenv "HOME" (getcwd))
1894 (invoke binary "completion" shell))))))
1895 '(("bash" . "share/bash-completion/completions/arduino-cli")
1896 ("fish" . "share/fish/vendor_completions.d/arduino-cli.fish")
1897 ("zsh" . "share/zsh/site-functions/_arduino-cli"))))))))
1898 (native-inputs
1899 (append
1900 (if (%current-target-system)
1901 (list this-package)
1902 '())
1903 (list go-fortio-org-safecast
1904 go-github-com-arduino-go-paths-helper
1905 go-github-com-arduino-go-properties-orderedmap
1906 go-github-com-arduino-go-serial-utils
1907 go-github-com-arduino-go-timeutils
1908 go-github-com-arduino-go-win32-utils
1909 go-github-com-arduino-pluggable-discovery-protocol-handler
1910 go-github-com-arduino-pluggable-monitor-protocol-handler
1911 go-github-com-cmaglie-pb
1912 go-github-com-codeclysm-extract
1913 go-github-com-djherbis-buffer
1914 go-github-com-djherbis-nio-v3
1915 go-github-com-fatih-color
1916 go-github-com-go-git-go-git-v5
1917 go-github-com-gofrs-uuid-v5
1918 go-github-com-leonelquinteros-gotext
1919 go-github-com-marcinbor85-gohex
1920 go-github-com-mattn-go-colorable
1921 go-github-com-mattn-go-isatty
1922 go-github-com-protonmail-go-crypto
1923 go-github-com-rifflock-lfshook
1924 go-github-com-rogpeppe-go-internal
1925 go-github-com-schollz-closestmatch
1926 go-github-com-sirupsen-logrus
1927 go-github-com-spf13-cobra
1928 go-github-com-spf13-viper
1929 go-github-com-stretchr-testify
1930 go-github-com-xeipuuv-gojsonschema
1931 go-go-bug-st-cleanup
1932 go-go-bug-st-downloader
1933 go-go-bug-st-f
1934 go-go-bug-st-relaxed-semver
1935 go-go-bug-st-testifyjson
1936 go-golang-org-x-sys
1937 go-golang-org-x-term
1938 go-golang-org-x-text
1939 go-google-golang-org-genproto-googleapis-rpc
1940 go-google-golang-org-grpc
1941 go-google-golang-org-protobuf
1942 go-gopkg-in-yaml-v3
1943 go-github-com-mailru-easyjson)))
1944 (home-page "https://github.com/arduino/arduino-cli")
1945 (synopsis "Tools to manage Arduino compatible boards")
1946 (description
1947 "Arduino Command Line Interface is an all-in-one solution that provides
1948Boards/Library Managers, sketch builder, board detection, uploader, and many
1949other tools needed to use any Arduino compatible board and platform from
1950command line or machine interfaces.")
1951 (license license:gpl3)))
1952
1953(define-public audmes
1954 (package
1955 (name "audmes")
1956 (version "2025.04.05")
1957 (source
1958 (origin
1959 (method git-fetch)
1960 (uri (git-reference
1961 (url "https://git.code.sf.net/p/audmes/git")
1962 (commit version)))
1963 (file-name (git-file-name name version))
1964 (sha256
1965 (base32 "0jndc6bx94k229rc98jbqzgk42bxx0dxa7h80wxzbkrl507qnhc3"))))
1966 (build-system cmake-build-system)
1967 (arguments
1968 (list
1969 #:tests? #f)) ;there are none
1970 (inputs
1971 (list alsa-lib pulseaudio wxwidgets))
1972 (native-inputs
1973 (list unzip libfccp))
1974 (home-page "https://sourceforge.net/projects/audmes/")
1975 (synopsis "Oscilloscope and spectrum analyzer using sound card")
1976 (description
1977 "The audio measurement system is a system for audio measurement through
1978sound card. It contains: generator, oscilloscope, audio spectrum
1979analyzer (FFT) and frequency sweep plot.")
1980 (license license:gpl2+)))
1981
1982(define-public capstone
1983 (package
1984 (name "capstone")
1985 (version "5.0.3")
1986 (source (origin
1987 (method git-fetch)
1988 (uri (git-reference
1989 (url "https://github.com/capstone-engine/capstone")
1990 (commit version)))
1991 (file-name (git-file-name name version))
1992 (sha256
1993 (base32
1994 "0fv8j1nzzbc5x9pg90641gpmlmp9h85wcg3l6258drk761rp979d"))))
1995 (build-system gnu-build-system)
1996 (arguments
1997 `(#:tests? #f
1998 #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
1999 (string-append "CC=" ,(cc-for-target)))
2000 #:phases
2001 (modify-phases %standard-phases
2002 (delete 'configure) ; no configure script
2003 ;; cstool's Makefile ‘+=’s LDFLAGS, so we cannot pass it as a make flag.
2004 (add-before 'build 'fix-cstool-ldflags
2005 (lambda* (#:key outputs #:allow-other-keys)
2006 (setenv "LDFLAGS"
2007 (string-append "-Wl,-rpath="
2008 (assoc-ref outputs "out") "/lib")))))))
2009 (home-page "https://github.com/capstone-engine/capstone")
2010 (synopsis "Lightweight multi-platform, multi-architecture disassembly framework")
2011 (description
2012 "Capstone is a lightweight multi-platform, multi-architecture disassembly
2013framework. Capstone can disassemble machine code for many supported architectures
2014such as x86, x86_64, arm, arm64, mips, ppc, sparc, sysz and xcore. It provides
2015bindings for Python, Java, OCaml and more.")
2016 (license license:bsd-3)))
2017
2018;; FIXME: This package has a timestamp embedded in
2019;; lib/python3.5/site-packages/capstone/__pycache__/__iti__.cpython-35.pyc
2020(define-public python-capstone
2021 (package
2022 (inherit capstone)
2023 (name "python-capstone")
2024 (build-system pyproject-build-system)
2025 (arguments
2026 (list
2027 #:phases
2028 #~(modify-phases %standard-phases
2029 (add-after 'unpack 'chdir-and-fix-setup-py
2030 (lambda _
2031 (chdir "bindings/python")
2032 ;; Do not build the library again, because we already have it.
2033 (substitute* "setup.py" ((".* build_libraries.*") ""))
2034 ;; This substitution tells python-capstone where to find the
2035 ;; library.
2036 (substitute* "capstone/__init__.py"
2037 (("resources\\.files\\(__name__\\)")
2038 (string-append "PurePath(\"" #$(this-package-input "capstone") "\")")))
2039 ;; Fix the path to the tests scripts in the Makefile.
2040 (substitute* "Makefile"
2041 (("./\\$\\$t") "./tests/$$t"))))
2042 (replace 'check
2043 (lambda* (#:key tests? #:allow-other-keys)
2044 (when tests?
2045 (invoke "make" "check")))))))
2046 (native-inputs
2047 (list python-setuptools
2048 python-wheel))
2049 (propagated-inputs
2050 (list capstone))))
2051
2052(define-public python-platypush
2053 (package
2054 (name "python-platypush")
2055 (version "1.3.17")
2056 (source
2057 (origin
2058 (method git-fetch)
2059 (uri (git-reference
2060 (url "https://git.platypush.tech/platypush/platypush.git")
2061 (commit (string-append "v" version))))
2062 (file-name (git-file-name name version))
2063 (sha256
2064 (base32 "0b9374dcp6bqwq0mj273g0bjh5h9i8mzria3yby04d0i9zbf1wyl"))))
2065 (build-system pyproject-build-system)
2066 (arguments
2067 (list
2068 #:phases
2069 #~(modify-phases %standard-phases
2070 (add-before 'check 'pre-check
2071 (lambda _
2072 (setenv "HOME" "/tmp"))))))
2073 (native-inputs (list python-setuptools python-pytest redis))
2074 (propagated-inputs (list python-alembic
2075 python-croniter
2076 python-dateutil
2077 python-docutils
2078 python-flask
2079 python-magic
2080 ;; v4 is supported in upcomming release, see
2081 ;; <https://git.platypush.tech/platypush/platypush/issues/445>.
2082 python-marshmallow-3
2083 python-pillow
2084 python-psutil
2085 python-pygments
2086 python-pyotp
2087 python-pyyaml
2088 python-pyzbar
2089 python-qrcode
2090 python-redis
2091 python-requests
2092 python-rsa
2093 python-sqlalchemy-2
2094 python-tornado
2095 python-urllib3
2096 python-watchdog
2097 python-websocket-client
2098 python-websockets
2099 python-werkzeug
2100 python-zeroconf
2101 python-zipp))
2102 (home-page "https://platypush.tech/")
2103 (synopsis "General-purpose automation framework")
2104 (description
2105 "Platypush is a general-purpose and extensible platform for automation across
2106multiple services and devices with hundreds of supported integrations.")
2107 (license license:expat)))
2108
2109(define-public python-esptool
2110 (package
2111 (name "python-esptool")
2112 (version "5.3.0")
2113 (source
2114 (origin
2115 (method git-fetch)
2116 (uri (git-reference
2117 (url "https://github.com/espressif/esptool")
2118 (commit (string-append "v" version))))
2119 (file-name (git-file-name name version))
2120 (sha256
2121 (base32 "0lz8qbr8x46g33wpiagl9n3vg8nkjm5w8l1x8kyrzprfzwnxf5rm"))))
2122 (build-system pyproject-build-system)
2123 (arguments
2124 (list
2125 #:test-flags
2126 #~(list
2127 ;; XXX: Requires python2 package pkcs11.
2128 "--ignore=test/test_espsecure_hsm.py"
2129 ;; XXX: Requires python-requests, most likely to use network.
2130 "--ignore=test/test_uf2_ids.py"
2131 ;; XXX: Various errors (device access, server not started...)
2132 "--ignore=test/test_esptool.py"
2133 ;; XXX: "not supported by this version of OpenSSL"
2134 "-k" "not test_sign_v1_data and not test_sign_v1_data_pkcs8")))
2135 (propagated-inputs
2136 (list python-bitstring
2137 python-click
2138 python-cryptography
2139 python-intelhex
2140 python-pyserial
2141 python-pyyaml
2142 python-reedsolo
2143 python-rich-click))
2144 (native-inputs (list python-pyelftools
2145 python-pytest
2146 python-setuptools))
2147 (home-page "https://github.com/espressif/esptool")
2148 (synopsis "Bootloader utility for Espressif ESP8266 & ESP32 chips")
2149 (description
2150 "@code{esptool.py} is a Python-based utility to communicate with the ROM
2151bootloader in Espressif ESP8266 & ESP32 series chips.")
2152 (license license:gpl2+)))
2153
2154(define-public radare2
2155 (package
2156 (name "radare2")
2157 (version "6.2.2") ;keep in sync with iaito,r2ghidra
2158 (source (origin
2159 (method git-fetch)
2160 (uri (git-reference
2161 (url "https://github.com/radareorg/radare2")
2162 (commit version)))
2163 (sha256
2164 (base32
2165 "129fys295677w3nxwirc3qgqvm97y6bc94s1wv8yw1kpg4slk17x"))
2166 (file-name (git-file-name name version))
2167 (patches
2168 (search-patches "radare2-fix-meson-build-to-use-sys-sdb.patch"
2169 "radare2-fix-meson-build-to-use-sys-qjs.patch"))))
2170 (build-system meson-build-system)
2171 (arguments
2172 (list
2173 #:configure-flags
2174 #~(list "-Duse_libuv=true"
2175 "-Duse_ssl=true"
2176 "-Duse_sys_capstone=true"
2177 "-Duse_sys_lz4=true"
2178 "-Duse_sys_magic=true"
2179 "-Duse_sys_openssl=true"
2180 "-Duse_sys_xxhash=true"
2181 "-Duse_sys_zip=true"
2182 "-Duse_sys_zlib=true"
2183 "-Duse_sys_zydis=true")
2184 #:phases
2185 #~(modify-phases %standard-phases
2186 ;; CHECK LATER: See https://github.com/radareorg/radare2/pull/26838.
2187 (add-before 'build 'fix-relative-include
2188 (lambda _
2189 (substitute* "../source/libr/arch/p/java/plugin.c"
2190 (("include \".." all)
2191 (string-append all "/..")))))
2192 ;; These tests require sample binaries from an external repository.
2193 (add-before 'check 'skip-tests
2194 (lambda _
2195 (with-directory-excursion "../source/test/unit"
2196 (substitute* '("test_bin.c"
2197 "test_dwarf.c"
2198 "test_dwarf_info.c"
2199 "test_dwarf_integration.c"
2200 "test_pdb.c"
2201 "test_anal_function.c"
2202 ;; TODO: add r2pipe and enable this test.
2203 "test_r2pipe.c")
2204 (("(^| )main *\\(.*" all)
2205 (string-append all " exit (77);\n"))))))
2206 (add-after 'install 'fixup-pc-files
2207 (lambda _
2208 (with-directory-excursion (in-vicinity #$output "lib/pkgconfig")
2209 ;; Avoids many unnecessary propagated inputs.
2210 (substitute* (find-files "." ".*\\.pc")
2211 (("^Requires.private:.*") ""))
2212 ;; XXX: Nonexistent after unbundling sdb, but still propagate.
2213 (substitute* "r_util.pc"
2214 (("-I\\$\\{includedir\\}/libr/sdb") ""))))))))
2215 (inputs
2216 (list capstone
2217 gmp
2218 libuv
2219 libzip
2220 lz4
2221 quickjs-ng
2222 xxhash
2223 zlib
2224 zycore
2225 zydis))
2226 (native-inputs
2227 (list node
2228 perl
2229 pkg-config
2230 python-minimal-wrapper))
2231 (propagated-inputs
2232 (list openssl ;needed by r_util's public headers
2233 sdb)) ;r_regex.h, r_util.h, r_getopt.h...
2234 (native-search-paths (list (search-path-specification
2235 (variable "R2_LIBR_PLUGINS")
2236 (files (list "lib/radare2"))
2237 (separator #f)))) ;single value
2238 (home-page "https://radare.org/")
2239 (synopsis "Reverse engineering framework")
2240 (description
2241 "Radare2 is a complete framework for reverse-engineering, debugging, and
2242analyzing binaries. It is composed of a set of small utilities that can be
2243used together or independently from the command line.
2244
2245Radare2 is built around a scriptable disassembler and hexadecimal editor that
2246support a variety of executable formats for different processors and operating
2247systems, through multiple back ends for local and remote files and disk
2248images.
2249
2250It can also compare (@dfn{diff}) binaries with graphs and extract information
2251like relocation symbols. It is able to deal with malformed binaries, making
2252it suitable for security research and analysis.")
2253 (license license:lgpl3)))
2254
2255;; TODO: Keep in sync with radare2.
2256(define-public r2ghidra
2257 (package
2258 (name "r2ghidra")
2259 (version "6.2.2")
2260 (source
2261 (origin
2262 (method git-fetch)
2263 (uri (git-reference
2264 (url "https://github.com/radareorg/r2ghidra")
2265 (commit version)))
2266 (file-name (git-file-name name version))
2267 (sha256
2268 (base32 "1csb7zzh991pi29mh53k7dy17j0afx338vczh88r4bn4awbqv63b"))
2269 (modules '((guix build utils)))
2270 (snippet
2271 ;; Delete bundled libs and remove their references.
2272 #~(begin (delete-file-recursively "subprojects")
2273 (substitute* "ghidra/deps.mk"
2274 (("ZLIB_LDFLAGS=.*") "")
2275 (("ZLIB_CFLAGS=.*") ""))
2276 ;; Don't try to make the directory we snipped.
2277 (substitute* "src/Makefile"
2278 (("(all:) subprojects-zlib" _ f) f)
2279 (("\\| \\.\\./subprojects/zlib/libz\\.a") ""))))))
2280 (build-system gnu-build-system)
2281 (arguments
2282 (list
2283 #:make-flags
2284 #~(let* ((zlib #$(this-package-input "zlib")))
2285 (list (string-append "CC=" #$(cc-for-target))
2286 (format #f "ZLIB_LDFLAGS=-L~a/lib/ -lz" zlib)
2287 (format #f "ZLIB_CFLAGS=-I~a/include/" zlib)
2288 ;; Ensure this matches R2_LIBR_PLUGINS as exported
2289 ;; by radare2 & iaito.
2290 (format #f "PLUGDIR=~a/lib/radare2" #$output)
2291 "R2GHIDRA_USE_RXML=1")) ;use r2 xml parser instead of pugixml
2292 #:tests? #f ;no 'check' rule, test dir may require 3rd-party binaries
2293 #:phases
2294 #~(modify-phases %standard-phases
2295 (add-after 'unpack 'skip-git-and-copy-ghidra
2296 (lambda _
2297 ;; GIT is assumed to point to the git binary, but it is
2298 ;; only checked to be a file; this short-circuits the check.
2299 (setenv "GIT" "configure")
2300 (copy-recursively
2301 (search-input-directory %build-inputs "share/ghidra-native")
2302 "subprojects/ghidra-native")))
2303 (add-before 'build 'set-system-sleighhome
2304 ;; Helper files which try to install in radare2's path
2305 ;; in the store, irrespective of PLUGDIR. As long as
2306 ;; r2ghidra knows where to find them, we can place them
2307 ;; anywhere.
2308 (lambda _
2309 (let ((sleighhome
2310 (in-vicinity #$output "lib/radare2/sleighhome")))
2311 ;; Hardcoded path to check.
2312 (substitute* "src/SleighAsm.cpp"
2313 (("(path = strdup \\()[^\\)]*" _ f)
2314 (string-append f "\"" sleighhome "\"")))
2315 ;; Install location.
2316 (substitute* "ghidra/Makefile"
2317 (("(sleigh-install D=\")\\$\\(DD\\)" _ f)
2318 (string-append f sleighhome)))))))))
2319 (inputs (list radare2 zlib))
2320 (native-inputs
2321 (list ghidra-native
2322 pkg-config
2323 python-minimal))
2324 (home-page "https://www.radare.org/")
2325 (synopsis "Native Ghidra Decompiler for radare2")
2326 (description
2327 "r2ghidra is a radare2 plugin which integrates the
2328 @url{https://www.nsa.gov/ghidra,Ghidra} decompiler.")
2329 ;; Specified lgpl3 'only' in README.
2330 (license license:lgpl3)))
2331
2332(define-public ghidra-native
2333 ;; Latest commit; last release (8/2025) incompatible with current r2ghidra.
2334 (let ((commit "483ae94bcbc661a77667e52f1eff75928cb6aa2e")
2335 (revision "2"))
2336 (package
2337 (name "ghidra-native")
2338 (version (git-version "0.6.2" revision commit))
2339 (source
2340 (origin
2341 (method git-fetch)
2342 (uri (git-reference
2343 (url "https://github.com/radareorg/ghidra-native")
2344 (commit commit)))
2345 (file-name (git-file-name name version))
2346 (sha256
2347 (base32 "099k0drjrgyf72cgzn29gyvrgcc4zssjm20cpa1lia97dkcs1j6x"))))
2348 (build-system gnu-build-system)
2349 (arguments
2350 (list
2351 #:tests? #f ;no tests
2352 #:make-flags #~(list "patch")
2353 #:phases
2354 #~(modify-phases %standard-phases
2355 (delete 'configure)
2356 (replace 'install ;no install target
2357 (lambda _
2358 (let ((ghidra-native-patched
2359 (in-vicinity #$output "/share/ghidra-native/src")))
2360 (copy-recursively "src" ghidra-native-patched)))))))
2361 (home-page "https://www.radare.org/")
2362 (synopsis "Native parts of ghidra")
2363 (description
2364 "This package contains the native parts of ghidra, to be used from
2365r2ghidra.")
2366 (properties '((hidden? . #t))) ;only provides source files
2367 (license license:asl2.0))))
2368
2369(define-public rayforge
2370 (package
2371 (name "rayforge")
2372 (version "1.7.7") ;newer version requires python-raygeo (Rust)
2373 (source
2374 (origin
2375 (method git-fetch)
2376 (uri (git-reference
2377 (url "https://github.com/barebaric/rayforge")
2378 (commit version)))
2379 (file-name (git-file-name name version))
2380 (sha256
2381 (base32 "1w44qw51nynf1rk61y0d0wj6xl66ciswpcsp38dnwrpfwsqgafxw"))))
2382 (build-system pyproject-build-system)
2383 (arguments
2384 (list
2385 ;; tests: 1626 passed
2386 #:test-flags
2387 ;; XXX: Tests fail to pick exact version of cairo: E gi.RepositoryError:
2388 ;; Typelib file for namespace 'cairo', version '1.0' not found
2389 #~(list "--ignore=tests/core/geo/test_font_config.py"
2390 "--ignore=tests/core/geo/test_geo_text.py"
2391 "--ignore=tests/core/geo/test_geometry.py"
2392 "--ignore=tests/core/geo/test_text.py"
2393 "--ignore=tests/core/geo/test_transform.py"
2394 ;; XXX: Projects ships a huge test suite which the majority
2395 ;; fail, run bare minimal core tests.
2396 "tests/core")
2397 #:phases
2398 #~(modify-phases %standard-phases
2399 (add-after 'unpack 'relax-requirements
2400 (lambda _
2401 ;; All of the dependencies are pined to exact version.
2402 (substitute* "requirements.txt"
2403 (("[=~]=.*") "\n")
2404 ;; XXX: Guix's opencv package does not provide Python's
2405 ;; version metadata.
2406 (("opencv_python") ""))))
2407 (add-before 'sanity-check 'set-home
2408 (lambda _
2409 (setenv "HOME" "/tmp")))
2410 (add-before 'check 'remove-local-source
2411 (lambda _
2412 (delete-file-recursively "rayforge")))
2413 (add-after 'wrap 'wrap-rayforge
2414 (lambda _
2415 (wrap-program (string-append #$output "/bin/rayforge")
2416 `("GI_TYPELIB_PATH" ":" prefix
2417 (,(getenv "GI_TYPELIB_PATH")))))))))
2418 (native-inputs (list python-gitpython
2419 python-pytest
2420 python-pytest-asyncio
2421 python-pytest-mock
2422 python-setuptools))
2423 (inputs (list bash-minimal
2424 libadwaita
2425 opencv
2426 python-aiohttp
2427 python-asyncudp
2428 python-blinker
2429 python-ezdxf
2430 python-gitpython
2431 python-numpy
2432 python-platformdirs
2433 python-pluggy
2434 python-pycairo
2435 python-pyclipper
2436 python-pygobject
2437 python-pymupdf
2438 python-pyopengl
2439 python-pyopengl-accelerate
2440 python-pypdf
2441 python-pyserial
2442 python-pyvips
2443 python-pyyaml
2444 python-scipy
2445 python-semver
2446 python-svgelements
2447 python-trimesh
2448 python-websockets
2449 vtracer))
2450 (home-page "https://rayforge.org/")
2451 (synopsis "Desktop application for laser cutting and engraving")
2452 (description
2453 "Rayforge is a cross-platform 2D CAD and G-code control software designed
2454for GRBL-based laser cutters and engravers. It features an interface built
2455using GTK4 and Libadwaita, with support for SVG, DXF, PDF, and various image
2456formats.")
2457 (license license:expat)))
2458
2459(define-public zycore
2460 (package
2461 (name "zycore")
2462 (version "1.5.1")
2463 (source (origin
2464 (method git-fetch)
2465 (uri (git-reference
2466 (url "https://github.com/zyantific/zycore-c")
2467 (commit (string-append "v" version))))
2468 (file-name (git-file-name name version))
2469 (sha256
2470 (base32 "1szpwqqw12frdchmq2qkcqrmb88afq56fsn2nbd96vmsdzmnhwnq"))))
2471 (build-system cmake-build-system)
2472 (native-inputs (list googletest))
2473 (arguments (list #:configure-flags
2474 #~(list "-DZYCORE_BUILD_SHARED_LIB=ON"
2475 #$(if (%current-target-system)
2476 "-DZYCORE_BUILD_TESTS=OFF"
2477 "-DZYCORE_BUILD_TESTS=ON"))))
2478 (home-page "https://github.com/zyantific/zycore-c")
2479 (synopsis "Internal library for Zydis")
2480 (description
2481 "This package provides platfrom-independent types, macros
2482and a fallback for environments without libc for Zydis.")
2483 (license license:expat)))
2484
2485(define-public zydis
2486 (package
2487 (name "zydis")
2488 (version "4.1.1")
2489 (source (origin
2490 (method git-fetch)
2491 (uri (git-reference
2492 (url "https://github.com/zyantific/zydis")
2493 (commit (string-append "v" version))))
2494 (file-name (git-file-name name version))
2495 (sha256
2496 (base32 "1f6caps6i5hinx4j3fcsxyqmqr2mszc9ah83jpq0bidp956jk7p8"))))
2497 (build-system cmake-build-system)
2498 (arguments (list #:configure-flags
2499 #~(list "-DZYAN_SYSTEM_ZYCORE=ON"
2500 "-DZYDIS_BUILD_SHARED_LIB=ON"
2501 "-DZYDIS_BUILD_MAN=ON")))
2502 (native-inputs (list python-minimal ronn-ng))
2503 (inputs (list zycore))
2504 (home-page "https://zydis.re")
2505 (synopsis "Disassembler and code generation library for x86 and AMD64")
2506 (description
2507 "Zydis is a decoder and disassembler library with the following features:
2508@itemize
2509@item Support for all x86 and AMD64 instructions and extensions
2510@item Optimization for high performance
2511@item No dynamic memory allocation
2512@item Thread-safe by design
2513@item Smaller file-size overhead compared to other common disassembler libraries
2514@end itemize")
2515 (license license:expat)))
2516
2517(define-public asco
2518 (package
2519 (name "asco")
2520 (version "0.4.11")
2521 (source
2522 (origin
2523 (method url-fetch)
2524 (uri (string-append "mirror://sourceforge/asco/asco/" version "/ASCO-"
2525 version ".tar.gz"))
2526 (sha256
2527 (base32 "0ggxv0p1zmfbvd1k17p2j1cskbjsa83fansz8ihxn7ax9qdicljv"))))
2528 (build-system gnu-build-system)
2529 (arguments
2530 `(#:tests? #f ; no tests
2531 #:make-flags '("all" "asco-mpi")
2532 #:phases
2533 (modify-phases %standard-phases
2534 (delete 'configure)
2535 (add-before 'build 'relax-gcc-14-strictness
2536 (lambda _
2537 (substitute* (find-files "." "Makefile")
2538 (("CFLAGS = (.*)$" all options)
2539 (string-append "CFLAGS = "
2540 " -Wno-error=incompatible-pointer-types"
2541 " -Wno-error=implicit-function-declaration"
2542 " "
2543 options)))))
2544 (add-before 'build 'fix-paths
2545 (lambda* (#:key inputs #:allow-other-keys)
2546 (let ((coreutils (assoc-ref inputs "coreutils-minimal")))
2547 (substitute* '("errfunc.c" "asco.c")
2548 (("(cp|nice) " _ command)
2549 (string-append
2550 (search-input-file inputs (string-append "bin/" command))
2551 " ")))
2552 (substitute* "Makefile"
2553 (("<FULL_PATH_TO_MPICH>/bin/mpicc") (which "mpicc"))))))
2554 (replace 'install ; no install target
2555 (lambda* (#:key outputs #:allow-other-keys)
2556 (for-each (lambda (file)
2557 (install-file file (string-append
2558 (assoc-ref outputs "out")
2559 "/bin")))
2560 '("asco" "asco-mpi" "asco-test"
2561 "tools/alter/alter" "tools/log/log")))))))
2562 (native-inputs
2563 `(("mpi" ,openmpi)))
2564 (inputs
2565 (list coreutils-minimal))
2566 (home-page "https://asco.sourceforge.net/")
2567 (synopsis "SPICE circuit optimizer")
2568 (description
2569 "ASCO brings circuit optimization capabilities to existing SPICE simulators using a
2570high-performance parallel differential evolution (DE) optimization algorithm.")
2571 (license license:gpl2+)))
2572
2573(define-public gpx
2574 (package
2575 (name "gpx")
2576 (version "2.6.8")
2577 (source (origin
2578 (method git-fetch)
2579 (uri (git-reference
2580 (url "https://github.com/markwal/GPX")
2581 (commit version)))
2582 (file-name (git-file-name name version))
2583 (sha256
2584 (base32
2585 "1izs8s5npkbfrsyk17429hyl1vyrbj9dp6vmdlbb2vh6mfgl54h8"))))
2586 (build-system gnu-build-system)
2587 (home-page "https://github.com/markwal/GPX")
2588 (synopsis "Converting gcode to x3g files for 3D printing")
2589 (description
2590 "GPX is a post processing utility for converting gcode output from 3D
2591slicing software to x3g files for standalone 3D printing on common 3D
2592printers.")
2593 (license license:gpl2+)))
2594
2595(define-public cutter
2596 (package
2597 (name "cutter")
2598 (version "2.4.1") ;keep in sync with rizin
2599 (source
2600 (origin
2601 (method git-fetch)
2602 (uri (git-reference
2603 (url "https://github.com/rizinorg/cutter")
2604 (commit (string-append "v" version))
2605 ;; Needed for src/translations.
2606 (recursive? #t)))
2607 (modules '((guix build utils)))
2608 (snippet #~(delete-file-recursively "rizin"))
2609 (file-name (git-file-name name version))
2610 (sha256
2611 (base32 "090gfg90k0fn3jiyssdigjgb7xn473hxfm7gpl1rwn3kl6fv7lvw"))))
2612 (build-system qt-build-system)
2613 (arguments
2614 (list
2615 #:qtbase qtbase
2616 #:configure-flags
2617 #~(list "-DCUTTER_USE_BUNDLED_RIZIN=OFF"
2618 "-DCUTTER_ENABLE_PYTHON=ON"
2619 "-DCUTTER_ENABLE_PYTHON_BINDINGS=ON")
2620 #:tests? #f)) ;no tests
2621 (native-inputs
2622 (list pkgconf))
2623 (inputs
2624 (list graphviz
2625 ksyntaxhighlighting
2626 libzip
2627 openssl
2628 python
2629 python-pyside-6
2630 python-shiboken-6
2631 qt5compat
2632 qtsvg
2633 qttools
2634 qtwayland
2635 rizin
2636 zlib))
2637 (home-page "https://cutter.re")
2638 (synopsis "Software reverse engineering platform")
2639 (description
2640 "Cutter is a reverse engineering platform powered by @code{rizin}. It
2641aims to be an advanced and customizable reverse engineering platform while
2642keeping the user experience in mind. Cutter is created by reverse engineers
2643for reverse engineers.")
2644 (license (list license:cc-by-sa3.0 ;the "Iconic" icon set
2645 license:gpl3+)))) ;everything else
2646
2647(define-public lib3mf
2648 (package
2649 (name "lib3mf")
2650 (version "2.2.0")
2651 (source
2652 (origin
2653 (method git-fetch)
2654 (uri (git-reference (url "https://github.com/3MFConsortium/lib3mf")
2655 (commit (string-append "v" version))))
2656 (file-name (git-file-name name version))
2657 (sha256
2658 (base32
2659 "05zqvnzmi7j8rhp2mrskvxf1bxl7kb4c72dfx4y86219i1hx7i2q"))
2660 (modules '((guix build utils)))
2661 (snippet
2662 '(begin
2663 ;; Delete pre-compiled ACT.
2664 (delete-file-recursively "AutomaticComponentToolkit/bin")
2665
2666 ;; Remove bundled software. Preserve cpp-base64 as it has been
2667 ;; modified and cannot easily be unbundled.
2668 (for-each delete-file-recursively
2669 '("Include/Libraries/libzip"
2670 "Include/Libraries/zlib"
2671 "Source/Libraries/libzip"
2672 "Source/Libraries/zlib"))
2673
2674 ;; Adjust header includes such that system headers are found.
2675 (substitute* '("Include/Common/OPC/NMR_OpcPackageReader.h"
2676 "Include/Common/Platform/NMR_ImportStream_ZIP.h"
2677 "Include/Common/Platform/NMR_ExportStream_ZIP.h"
2678 "Include/Common/Platform/NMR_ImportStream_Compressed.h"
2679 "Include/Common/Platform/NMR_ExportStream_Compressed.h"
2680 "Source/Common/Platform/NMR_PortableZIPWriterEntry.cpp")
2681 (("Libraries/libzip/") "")
2682 (("Libraries/zlib/") ""))))))
2683 (build-system cmake-build-system)
2684 (arguments
2685 `(#:configure-flags (list "-DUSE_INCLUDED_ZLIB=0"
2686 "-DUSE_INCLUDED_LIBZIP=0"
2687 "-DUSE_INCLUDED_GTEST=0"
2688 "-DUSE_INCLUDED_SSL=0")
2689 #:phases (modify-phases %standard-phases
2690 (add-after 'unpack 'provide-act
2691 (lambda* (#:key native-inputs inputs #:allow-other-keys)
2692 (let ((act (search-input-file (or native-inputs inputs)
2693 "bin/act"))
2694 (dir "AutomaticComponentToolkit/bin"))
2695 (mkdir-p dir)
2696 (symlink act (string-append dir "/act.linux"))))))))
2697 (native-inputs
2698 (list automatic-component-toolkit googletest-1.12 pkg-config))
2699 (inputs
2700 (list `(,util-linux "lib") libzip libressl zlib))
2701 (synopsis "Implementation of the 3D Manufacturing Format (3MF) file standard")
2702 (description
2703 "Lib3MF is a C++ implementation of the 3D Manufacturing Format (3MF) file
2704standard. It offers a way to integrate 3MF reading and writing capabilities, as
2705well as conversion and validation tools for input and output data. The
2706specification can be downloaded at @url{http://3mf.io/specification/}.")
2707 (home-page "https://3mf.io/")
2708 (license license:bsd-2)))
2709
2710(define-public manifold
2711 (package
2712 (name "manifold")
2713 (version "3.4.1")
2714 (source
2715 (origin
2716 (method git-fetch)
2717 (uri (git-reference
2718 (url "https://github.com/elalish/manifold")
2719 (commit (string-append "v" version))))
2720 (file-name (git-file-name name version))
2721 (sha256
2722 (base32 "0x65708r6xln8sd53abbn1qnhz3wxnicn2837ida73ihargk5js1"))))
2723 (build-system cmake-build-system)
2724 (inputs (list onetbb clipper2 assimp python-nanobind googletest))
2725 (arguments
2726 (list #:tests? #f
2727 ;; can be removed once emscripten is packaged
2728 #:configure-flags #~(list "-DMANIFOLD_JSBIND=OFF")))
2729 (synopsis "Geometry library for topological robustness")
2730 (description
2731 "Manifold is a geometry library dedicated to creating and operating on
2732manifold triangle meshes. A manifold mesh is a mesh that represents a solid
2733object, and so is very important in manufacturing, CAD, structural analysis,
2734etc.. Manifold also supports arbitrary vertex properties and enables mapping
2735of materials for rendering use-cases.")
2736 (home-page "https://github.com/elalish/manifold")
2737 (license license:asl2.0)))
2738
2739(define-public python-keithley2600
2740 (package
2741 (name "python-keithley2600")
2742 (version "2.1.0")
2743 (source
2744 (origin
2745 (method git-fetch)
2746 (uri (git-reference
2747 (url "https://github.com/OE-FET/keithley2600")
2748 (commit (string-append "v" version))))
2749 (file-name (git-file-name name version))
2750 (sha256
2751 (base32 "19bs7lswb04a5xr4zdsknynmpllpj18nb19jcbjnzf1fs1dqg0hw"))))
2752 (build-system pyproject-build-system)
2753 (arguments
2754 (list #:tests? #f)) ; no tests provided
2755 (native-inputs
2756 (list python-setuptools
2757 python-wheel))
2758 (propagated-inputs
2759 (list python-numpy
2760 python-pyvisa
2761 python-pyvisa-py))
2762 (home-page "https://keithley2600.readthedocs.io/en/stable/")
2763 (synopsis "Full Python driver for Keithley 2600 series of SMU")
2764 (description
2765 "This package provides a full Python driver for the Keithley 2600B series
2766of source measurement units. This driver provides access to base commands and
2767higher level functions such as IV measurements, transfer and output curves,
2768etc. Base commands replicate the functionality and syntax from the Keithley's
2769internal TSP Lua functions.")
2770 (license license:expat)))
2771
2772(define-public python-pyvisa
2773 (package
2774 (name "python-pyvisa")
2775 (version "1.16.2")
2776 (source (origin
2777 (method git-fetch)
2778 (uri (git-reference
2779 (url "https://github.com/pyvisa/pyvisa")
2780 (commit version)))
2781 (file-name (git-file-name name version))
2782 (sha256
2783 (base32 "1yg3g358y725fahqh18yf46dydam5d9cv9dnis2lnam79mmsy5f3"))
2784 (modules '((guix build utils)))
2785 ;; Delete bundled python-prettytable.
2786 (snippet '(delete-file-recursively "pyvisa/thirdparty"))))
2787 (build-system pyproject-build-system)
2788 (arguments
2789 (list
2790 #:test-flags
2791 #~(list "--pyargs" "pyvisa")
2792 #:phases
2793 #~(modify-phases %standard-phases
2794 (add-after 'unpack 'use-system-prettytable
2795 (lambda _
2796 (substitute* "pyvisa/shell.py"
2797 (("from .thirdparty import prettytable")
2798 "import prettytable")))))))
2799 (native-inputs
2800 (list python-pytest
2801 python-setuptools
2802 python-setuptools-scm))
2803 (propagated-inputs
2804 (list python-prettytable
2805 python-typing-extensions))
2806 (home-page "https://pyvisa.readthedocs.io/en/latest/")
2807 (synopsis "Python binding for the VISA library")
2808 (description "PyVISA is a Python package for support of the
2809@acronym{VISA, Virtual Instrument Software Architecture}, in order to control
2810measurement devices and test equipment via GPIB, RS232, Ethernet or USB.")
2811 (license license:expat)))
2812
2813(define-public python-pyvisa-py
2814 (package
2815 (name "python-pyvisa-py")
2816 (version "0.8.1")
2817 (source
2818 (origin
2819 (method git-fetch)
2820 (uri (git-reference
2821 (url "https://github.com/pyvisa/pyvisa-py")
2822 (commit version)))
2823 (file-name (git-file-name name version))
2824 (sha256
2825 (base32 "1673azf2y72rza8k1i109x8ad8p0ziz6cc5rw3w0w79wdvfx6wkx"))))
2826 (build-system pyproject-build-system)
2827 (native-inputs
2828 (list python-pytest
2829 python-setuptools))
2830 (propagated-inputs
2831 (list python-pyvisa
2832 python-typing-extensions))
2833 (home-page "https://pyvisa-py.readthedocs.io/")
2834 (synopsis "Backend for PyVISA")
2835 (description
2836 "PyVISA-py is a backend for PyVISA that implements most of the methods
2837for Message Based communication (Serial/USB/GPIB/Ethernet) using Python and
2838some well developed, easy to deploy and cross platform libraries.")
2839 (license license:expat)))
2840
2841(define-public python-pandapower
2842 (package
2843 (name "python-pandapower")
2844 (version "3.3.3")
2845 (source
2846 (origin
2847 (method git-fetch)
2848 (uri (git-reference
2849 (url "https://github.com/e2nIEE/pandapower")
2850 (commit (string-append "v" version))))
2851 (file-name (git-file-name name version))
2852 (sha256
2853 (base32 "1rryjz5qf33vsa0dvpvpbvc65kv5kj9qwzrs4ql7gz6mamwpkj5k"))))
2854 (build-system pyproject-build-system)
2855 (arguments
2856 (list
2857 ;; tests: 1161 passed, 140 skipped, 23 xfailed, 11 xpassed, 4529 warnings
2858 #:test-flags
2859 #~(list "--numprocesses" (number->string (min 8 (parallel-job-count))))
2860 #:phases
2861 #~(modify-phases %standard-phases
2862 (add-after 'unpack 'relax-requirements
2863 (lambda _
2864 (substitute* "pyproject.toml"
2865 (("pandera~=0.26.1") "pandera~=0.27.1")))))))
2866 (native-inputs
2867 (list python-nbmake
2868 python-pytest
2869 python-pytest-xdist
2870 python-setuptools))
2871 (propagated-inputs
2872 (list python-deepdiff
2873 python-geojson
2874 python-networkx
2875 python-numpy
2876 python-packaging
2877 python-pandas
2878 python-pandera
2879 python-scipy
2880 python-tqdm
2881 python-typing-extensions
2882 ;; [optional]
2883 python-geopandas
2884 python-lxml
2885 python-matplotlib
2886 python-openpyxl
2887 python-pyproj
2888 python-shapely))
2889 (home-page "https://www.pandapower.org/")
2890 (synopsis "Power system modelling and analysis")
2891 (description "@code{pandapower} is an easy to use network calculation
2892program aimed to automate the analysis and optimization of power systems.
2893It uses the data analysis library @code{pandas} and is compatible with the
2894commonly used @code{MATPOWER} / @code{PYPOWER} case format. @code{pandapower}
2895allows using different solvers including an improved Newton-Raphson power flow
2896implementation, all @code{PYPOWER} solvers, the C++ library solvers for fast
2897steady-state distribution power system analysis of @code{PowerGridModel}, the
2898Newton-Raphson power flow solvers in the C++ library lightsim2grid, and the
2899@code{PowerModels.jl} library.")
2900 (license license:bsd-3)))
2901
2902(define-public python-pandapipes
2903 (package
2904 (name "python-pandapipes")
2905 (version "0.14.0")
2906 (source
2907 (origin
2908 (method git-fetch)
2909 (uri (git-reference
2910 (url "https://github.com/e2nIEE/pandapipes")
2911 (commit (string-append "v" version))))
2912 (file-name (git-file-name name version))
2913 (sha256
2914 (base32 "09cq1dsixsjlc4fkp1b1bsa1ibc20sz350cx4bsq8nkjc02pr05b"))))
2915 (build-system pyproject-build-system)
2916 (native-inputs (list python-nbmake
2917 python-pytest
2918 python-setuptools))
2919 (propagated-inputs (list python-matplotlib
2920 python-pandapower
2921 python-shapely))
2922 (home-page "http://www.pandapipes.org")
2923 (synopsis "Simulation of multi energy grids")
2924 (description
2925 "This package provides a pipeflow calculation tool that complements
2926@code{pandapower} in the simulation of multi energy grids.")
2927 (license license:bsd-3)))
2928
2929(define-public python-scikit-rf
2930 (package
2931 (name "python-scikit-rf")
2932 (version "1.11.0")
2933 (source (origin
2934 (method git-fetch) ;PyPI misses some files required for tests
2935 (uri (git-reference
2936 (url "https://github.com/scikit-rf/scikit-rf")
2937 (commit (string-append "v" version))))
2938 (sha256
2939 (base32
2940 "1zcrm41jinirc54s3g9h8d7lxxcmz536662ips12rmn0qgyxh6bp"))
2941 (file-name (git-file-name name version))))
2942 (build-system pyproject-build-system)
2943 (propagated-inputs (list python-numpy
2944 python-pandas
2945 python-scipy
2946 python-typing-extensions))
2947 (native-inputs (list python-matplotlib
2948 python-networkx
2949 python-openpyxl
2950 python-pytest
2951 python-pytest-mock
2952 python-pyvisa
2953 python-setuptools
2954 python-wheel))
2955 (home-page "https://scikit-rf.org/")
2956 (synopsis "Radio frequency and Microwave Engineering Scikit")
2957 (description "Scikit-rf, or @code{skrf}, is a Python package for RF and
2958Microwave engineering.")
2959 (license license:bsd-3)))
2960
2961(define-public python-lcapy
2962 (package
2963 (name "python-lcapy")
2964 (version "1.26")
2965 (source
2966 (origin
2967 (method git-fetch)
2968 (uri (git-reference
2969 (url "https://github.com/mph-/lcapy")
2970 (commit (string-append "V" version))))
2971 (file-name (git-file-name name version))
2972 (sha256
2973 (base32 "1lv67sb0qfadj9ppdi7vvgngi19nq0ywyrlpind5s9ncjzpikhlf"))))
2974 (build-system pyproject-build-system)
2975 (arguments
2976 (list
2977 ;; This test fails by FileNotFoundError (a schematic file), possibly
2978 ;; because it's not included in PyPI.
2979 #:test-flags #~(list "-k" "not test_circuitgraph")
2980 #:phases #~(modify-phases %standard-phases
2981 (add-after 'unpack 'remove-importlib
2982 (lambda _
2983 (substitute* "setup.py"
2984 ;; Archived project that exists to maintain Python2
2985 ;; compatibility.
2986 (("'importlib',") "")))))))
2987 (propagated-inputs (list python-ipython
2988 python-matplotlib
2989 python-networkx
2990 python-numpy
2991 python-property-cached
2992 python-scipy
2993 python-sympy))
2994 (native-inputs (list python-pytest
2995 python-setuptools))
2996 (home-page "https://github.com/mph-/lcapy")
2997 (synopsis "Symbolic linear circuit analysis")
2998 (description "Lcapy is a Python package for linear circuit analysis. It
2999uses SymPy for symbolic mathematics.
3000
3001Lcapy can symbolically analyse circuits described with netlists or by
3002series/parallel combinations of components. It can also manipulate
3003ontinuous-time and discret-time expressions.")
3004 (license license:lgpl2.1+)))
3005
3006(define-public openscad
3007 (let ((commit "04834adb1ba3c9a6e4160747c91cbadbce9c37b3")
3008 (version "2026.07.26")
3009 (revision "0"))
3010 (package
3011 (name "openscad")
3012 (version (git-version version revision commit))
3013 (source
3014 (origin
3015 (method git-fetch)
3016 (uri (git-reference
3017 (url "https://github.com/openscad/openscad")
3018 (commit commit)
3019 ;; Needed for libraries/MCAD, a library specific to OpenSCAD
3020 ;; which is included as a submodule. All other libraries are
3021 ;; deleted in the patch-source build phase.
3022 (recursive? #t)))
3023 (sha256
3024 (base32 "05dym56zd2r5wrwq58lblhwa3b0xzh443pgsyambpjf9p534zi1k"))
3025 (file-name (git-file-name name version))))
3026 (build-system qt-build-system)
3027 (arguments
3028 (list
3029 #:qtbase qtbase ;for qt-6
3030 ;; OpenSCAD doesn't cope well with out-of-source builds.
3031 #:out-of-source? #f
3032 #:build-type "Release"
3033 #:configure-flags
3034 #~(list "-DUSE_BUILTIN_CLIPPER2=OFF"
3035 "-DUSE_BUILTIN_MANIFOLD=OFF"
3036 "-DUSE_BUILTIN_OPENCSG=OFF"
3037 "-DMANIFOLD_PYBIND=OFF"
3038 "-DMANIFOLD_TEST=OFF"
3039 "-DEXPERIMENTAL=ON"
3040 "-DENABLE_PYTHON=ON"
3041 (string-append "-DOPENSCAD_VERSION="
3042 #$version)
3043 (string-append "-DOPENSCAD_COMMIT="
3044 #$commit)
3045 "-DENABLE_EGL=ON"
3046 "-DENABLE_GLX=ON"
3047 "-B./build")
3048 #:phases
3049 #~(modify-phases %standard-phases
3050 (add-after 'unpack 'patch-source
3051 (lambda* (#:key inputs #:allow-other-keys)
3052 ;; Delete all unbundled libraries to replace them with guix
3053 ;; packages.
3054 (delete-file-recursively "submodules")
3055 ;; Fix: Dependency lib3mf is not found due to using a wrong
3056 ;; variable name in the CMake config (see
3057 ;; https://github.com/openscad/openscad/issues/5877).
3058 (substitute* "cmake/Modules/FindLib3MF.cmake"
3059 (("PC_LIB3MF_INCLUDE_DIRS")
3060 "PC_LIB3MF_INCLUDEDIR"))
3061 (substitute* "CMakeLists.txt"
3062 ;; Remove bundled libraries from cmake.
3063 (("add_subdirectory\\(submodules\\)")
3064 "")
3065 ;; Fix detection of EGL (see
3066 ;; https://github.com/openscad/openscad/issues/5880).
3067 (("target_link_libraries\\(OpenSCADLibInternal PUBLIC OpenGL::EGL\\)")
3068 "find_package(ECM REQUIRED NO_MODULE)
3069 list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
3070 find_package(EGL REQUIRED)
3071 target_link_libraries(OpenSCADLibInternal PRIVATE EGL::EGL)")
3072 ;; Use the system sanitizers-cmake module.
3073 (("\\$\\{CMAKE_SOURCE_DIR\\}/submodules/sanitizers-cmake/cmake")
3074 (string-append (assoc-ref inputs "sanitizers-cmake")
3075 "/share/sanitizers-cmake/cmake")))))
3076 ;; Tests will fail if the build doesn't happen in a
3077 ;; subdirectory of the source directory.
3078 (add-before 'build 'create-build-dir
3079 (lambda _
3080 (mkdir-p "./build")
3081 (chdir "./build")))
3082 (add-before 'check 'patch-tests
3083 (lambda _
3084 ;; Required for fontconfig
3085 (setenv "HOME" "/tmp"))))))
3086 (inputs (list boost
3087 cairomm
3088 cgal
3089 clipper2
3090 double-conversion
3091 eigen
3092 egl-wayland
3093 fontconfig
3094 freetype
3095 glew
3096 glib
3097 gmp
3098 harfbuzz
3099 hidapi
3100 lib3mf
3101 libcanberra
3102 libspnav
3103 libxml2
3104 libzip
3105 manifold
3106 mesa
3107 mimalloc
3108 mpfr
3109 nettle
3110 opencsg
3111 openssl
3112 python
3113 python-numpy
3114 python-pillow
3115 qscintilla-qt6
3116 qt5compat
3117 qtmultimedia
3118 qtsvg
3119 qtwayland
3120 sanitizers-cmake
3121 onetbb))
3122 (native-inputs (list bison
3123 extra-cmake-modules
3124 flex
3125 gettext-minimal
3126 pkg-config
3127 xvfb-run
3128 ;; the following are only needed for tests
3129 imagemagick
3130 ghostscript
3131 procps
3132 xorg-server-for-tests))
3133 (synopsis "Script-based 3D modeling application")
3134 (description
3135 "OpenSCAD is a software for creating solid 3D CAD objects. It is free
3136software and available for Linux/UNIX, MS Windows and macOS.
3137Unlike most free software for creating 3D models (such as the famous
3138application Blender), OpenSCAD focuses on the CAD aspects rather than the
3139artistic aspects of 3D modeling. Thus this might be the application you are
3140looking for when you are planning to create 3D models of machine parts but
3141probably not the tool for creating computer-animated movies.
3142OpenSCAD is not an interactive modeler. Instead it is more like a 3D-compiler
3143that reads a script file that describes the object and renders the 3D model
3144from this script file. This gives you, the designer, complete control over the
3145modeling process and enables you to easily change any step in the modeling
3146process or make designs that are defined by configurable parameters.
3147OpenSCAD provides two main modeling techniques: First there is constructive
3148solid geometry (aka CSG) and second there is extrusion of 2D outlines. As the
3149data exchange format for these 2D outlines Autocad DXF files are used. In
3150addition to 2D paths for extrusion it is also possible to read design
3151parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D
3152models in the STL and OFF file formats.")
3153 (home-page "https://openscad.org/")
3154 (license license:gpl2+))))
3155
3156(define-public pythonscad
3157 (package
3158 (inherit openscad)
3159 (name "pythonscad")
3160 (version "0.8.4")
3161 (source
3162 (origin
3163 (method git-fetch)
3164 (uri (git-reference
3165 (url "https://github.com/pythonscad/pythonscad")
3166 (commit (string-append "v" version))
3167 ;; Needed for libraries/MCAD, a library specific to OpenSCAD
3168 ;; which is included as a submodule. All other libraries are
3169 ;; deleted in the patch-source build phase.
3170 (recursive? #t)))
3171 (sha256
3172 (base32 "0gnifi8is0dl00vir5nd1k76kkcavb62v115g34198lzqnwiy0fc"))
3173 (modules '((guix build utils)))
3174 (snippet #~(begin
3175 ;; Delete all unbundled libraries to replace them with
3176 ;; guix packages.
3177 (delete-file-recursively "submodules")
3178 (substitute* "CMakeLists.txt"
3179 ;; Remove bundled libraries from cmake.
3180 (("add_subdirectory\\(submodules\\)")
3181 ""))))
3182 (file-name (git-file-name name version))))
3183 (arguments
3184 (substitute-keyword-arguments arguments
3185 ((#:configure-flags flags)
3186 #~(begin
3187 (use-modules (srfi srfi-1))
3188 (append (remove (lambda (flag)
3189 (or (string-prefix? "-DOPENSCAD_VERSION=" flag)
3190 (string-prefix? "-DOPENSCAD_COMMIT=" flag)))
3191 #$flags)
3192 (list "-DENABLE_LIBFIVE=ON" "-DUSE_BUILTIN_LIBFIVE=OFF"
3193 "-DUSE_QT6=ON"
3194 (string-append "-DOPENSCAD_VERSION="
3195 #$version)
3196 (string-append "-DPYTHON_VERSION="
3197 #$(version-major+minor (package-version
3198 python)))))))
3199 ((#:phases phases)
3200 #~(modify-phases #$phases
3201 (replace 'patch-source
3202 (lambda* (#:key inputs #:allow-other-keys)
3203 (substitute* "CMakeLists.txt"
3204 ;; Fix detection of EGL (see
3205 ;; https://github.com/openscad/openscad/issues/5880).
3206 (("target_link_libraries\\(OpenSCADLibInternal PUBLIC OpenGL::EGL\\)")
3207 "find_package(ECM REQUIRED NO_MODULE)
3208 list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
3209 find_package(EGL REQUIRED)
3210 target_link_libraries(OpenSCADLibInternal PUBLIC EGL::EGL)")
3211 ;; Use the system sanitizers-cmake module.
3212 (("\\$\\{CMAKE_SOURCE_DIR\\}/submodules/sanitizers-cmake/cmake")
3213 (string-append (assoc-ref inputs "sanitizers-cmake")
3214 "/share/sanitizers-cmake/cmake")))))))))
3215 (inputs (modify-inputs inputs
3216 (append curl libfive)))
3217 (synopsis "Script-based 3D modeling app with Python support")
3218 (description
3219 "PythonSCAD is a programmatic 3D modeling application. It allows you
3220to turn simple code into 3D models suitable for 3D printing. It is a fork of
3221OpenSCAD which not only adds support for using Python as a native language,
3222but also adds new features and improves existing ones.")
3223 (home-page "https://pythonscad.org/")
3224 (license license:gpl2+)))
3225
3226(define-public emacs-scad-mode
3227 (package
3228 (name "emacs-scad-mode")
3229 (version "99.0")
3230 (source
3231 (origin
3232 (method git-fetch)
3233 (uri (git-reference
3234 (url "https://github.com/openscad/emacs-scad-mode")
3235 (commit version)))
3236 (sha256
3237 (base32 "0mqfvff8f7lqjviwz30j7vkb098xd0k8bdzznb77aw4q7gdsf8nm"))
3238 (file-name (git-file-name name version))))
3239 (build-system emacs-build-system)
3240 (arguments (list #:tests? #f)) ; no tests
3241 (propagated-inputs (list emacs-compat))
3242 (synopsis "Emacs mode to edit OpenSCAD files")
3243 (description
3244 "@code{scad-mode} provides an Emacs major mode for editing
3245OpenSCAD code. Features:
3246@itemize
3247@item Syntax highlighting
3248@item
3249Basic completion function (press @kbd{M-TAB})
3250@item
3251Preview rendered model in separate window (press @kbd{C-c C-c})
3252@item
3253Open buffer in OpenSCAD (press @kbd{C-c C-o})
3254@item
3255Export buffer with OpenSCAD (press @kbd{C-c C-e})
3256@item
3257Flymake support (enable flymake-mode in scad-mode buffers)
3258@item
3259Org Babel support (@code{scad} source blocks)
3260@end itemize")
3261 (home-page "https://openscad.org/")
3262 (license license:gpl3+)))
3263
3264(define-public emacs-scad-dbus
3265 (package
3266 (name "emacs-scad-dbus")
3267 (version "0.1")
3268 (properties '((release-tag-prefix . "^v")
3269 (release-tag-version-delimiter . ".")))
3270 (source
3271 (origin
3272 (method git-fetch)
3273 (uri (git-reference
3274 (url "https://github.com/lenbok/scad-dbus")
3275 (commit (string-append "v" version))))
3276 (file-name (git-file-name name version))
3277 (sha256
3278 (base32 "09p1icdiwq6r5clnqljg058vn84acyf33jwqpfjkkm0l5pbvcgn0"))))
3279 (build-system emacs-build-system)
3280 (propagated-inputs (list emacs-scad-mode emacs-hydra emacs-compat))
3281 (synopsis "Control OpenSCAD from Emacs using D-Bus")
3282 (description
3283 "scad-dbus allows controlling @code{OpenSCAD} from within @code{Emacs} via
3284D-Bus without having to switch programs or reach for the mouse.")
3285 (home-page "https://github.com/lenbok/scad-dbus")
3286 (license license:gpl3+)))
3287
3288(define-public ondsel-solver
3289 (let ((commit "2e3659c4bce3e6885269e0cb3d640261b2a91108")
3290 (revision "1"))
3291 (package
3292 (name "ondsel-solver")
3293 ;; There's no tagged release
3294 (version (git-version "0.0.0" revision commit))
3295 (source
3296 (origin
3297 (method git-fetch)
3298 (uri (git-reference
3299 (url "https://github.com/Ondsel-Development/OndselSolver")
3300 (commit commit)))
3301 (file-name (git-file-name name version))
3302 (sha256
3303 (base32 "1bgk3asyz47r1kvdgcz8q7sh1g29przdsx9ib1jqqbc0nv8ww68v"))))
3304 (build-system cmake-build-system)
3305 (arguments
3306 `(#:tests? #f)) ;; Tests require Google's gtest and gmock
3307 ;; The company is shutting down, so https://ondsel.com may not exist for long
3308 (home-page "https://github.com/Ondsel-Development/OndselSolver")
3309 (synopsis "Assembly Constraints and Multibody Dynamics code")
3310 (description
3311 "The OndselSolver library for assembly constraints and multibody
3312dynamics is used by FreeCAD 1.0.0 for its new Assembly workbench.")
3313 (license license:lgpl2.1+))))
3314
3315(define-public freecad
3316 (package
3317 (name "freecad")
3318 (version "1.1.3")
3319 (source
3320 (origin
3321 (method git-fetch)
3322 (uri (git-reference
3323 (url "https://github.com/FreeCAD/FreeCAD")
3324 (commit version)
3325 (recursive? #t))) ;needed for the AddonManager
3326 (file-name (git-file-name name version))
3327 (sha256
3328 (base32 "1lhi9haf3gf0x8h927krd917v1i76labjkry1hh7xhbxvnnvrzj4"))
3329 (snippet
3330 #~(begin
3331 (use-modules (guix build utils))
3332 ;; not required, because 3D mouse support is OFF
3333 (delete-file-recursively "src/3rdParty/3Dconnexion")
3334 (delete-file-recursively "src/3rdParty/GSL") ;; c++-gsl
3335 (delete-file-recursively "src/3rdParty/OndselSolver") ;; ondsel-solver
3336 (delete-file-recursively "src/3rdParty/OpenGL") ;; glext.h from mesa
3337 (delete-file-recursively "src/3rdParty/json"))))) ;; nlohmann-json
3338 (build-system qt-build-system)
3339 (arguments
3340 (list
3341 #:qtbase qtbase ;for Qt 6
3342 #:tests? #f ;; Project has tests, but they are a pain to build
3343 #:configure-flags
3344 #~(list
3345 "-DBUILD_DRAWING:BOOL=ON"
3346 "-DBUILD_FLAT_MESH:BOOL=ON"
3347 "-DENABLE_DEVELOPER_TESTS=OFF" ;; see the above: #:tests? comment
3348 "-DFREECAD_USE_EXTERNAL_ONDSELSOLVER=ON" ;; unbundle ondsel-solver
3349 ;; Do not try to install modules into system python
3350 "-DINSTALL_TO_SITEPACKAGES=OFF"
3351 (string-append "-DCMAKE_INSTALL_LIBDIR=" #$output "/lib"))
3352 #:phases
3353 #~(modify-phases %standard-phases
3354 (add-after 'unpack 'fix-json-include
3355 (lambda _
3356 (substitute* "src/Mod/PartDesign/App/FeatureHole.h"
3357 (("\"json_fwd\\.hpp\"")
3358 "<nlohmann/json_fwd.hpp>"))
3359 (substitute* "src/Mod/PartDesign/App/FeatureHole.cpp"
3360 (("\"json\\.hpp\"")
3361 "<nlohmann/json.hpp>"))))
3362 (add-before 'configure 'restore-pythonpath
3363 (lambda _
3364 (substitute* "src/Main/MainGui.cpp"
3365 (("_?putenv\\(\"PYTHONPATH=\"\\);") ""))))
3366 (add-after 'install 'wrap-pythonpath
3367 (lambda _
3368 (wrap-program (string-append #$output "/bin/FreeCAD")
3369 (list "GUIX_PYTHONPATH"
3370 'prefix (list (getenv "GUIX_PYTHONPATH")))))))))
3371 (native-inputs
3372 (list c++-gsl
3373 doxygen
3374 graphviz
3375 pybind11
3376 qttools
3377 pkg-config
3378 swig-4.4))
3379 (inputs
3380 (list bash-minimal
3381 boost
3382 coin3d
3383 double-conversion
3384 eigen
3385 fmt
3386 fontconfig
3387 freetype
3388 gl2ps
3389 glew
3390 hdf5-1.10
3391 icu4c
3392 jsoncpp
3393 libarea
3394 libjpeg-turbo
3395 libmedfile
3396 libspnav
3397 libtheora
3398 libtiff
3399 libxi
3400 libxml++
3401 libxmu
3402 lz4
3403 netcdf
3404 nlohmann-json
3405 ondsel-solver
3406 opencascade-occt
3407 openmpi
3408 proj
3409 python-gitpython
3410 python-matplotlib
3411 python-networkx ; For the SheetMetal Addon
3412 python-pivy
3413 python-ply
3414 python-pyside-6
3415 python-pyyaml
3416 python-wrapper
3417 qtsvg
3418 qtwebchannel
3419 qtwebengine
3420 qtwayland
3421 sqlite
3422 onetbb ;same version as opencascade-occt
3423 vtk
3424 xerces-c
3425 yaml-cpp
3426 zlib))
3427 (home-page "https://www.freecad.org/")
3428 (synopsis "Your Own 3D Parametric Modeler")
3429 (description
3430 "FreeCAD is a general-purpose, feature-based, parametric 3D modeler for
3431CAD, MCAD, CAx, CAE, and PLM. It is aimed directly at mechanical engineering
3432and product design but also fits a wider range of uses in engineering, such as
3433architecture or other engineering specialties. It is modular, allowing for
3434extension and customization.")
3435 (license
3436 (list
3437 license:lgpl2.1+
3438 license:lgpl2.0+
3439 license:gpl3+
3440 license:bsd-3))))
3441
3442(define-public libmedfile
3443 (package
3444 (name "libmedfile")
3445 (version "6.0.1")
3446 (outputs '("out" "doc"))
3447 (source
3448 (origin
3449 (method url-fetch)
3450 (uri (string-append
3451 "https://files.salome-platform.org/Salome/medfile/med-"
3452 version ".tar.gz"))
3453 (sha256
3454 (base32
3455 "1a0zbdaj3s459s0cdayq4s3k3vbrfg7y32sf7s7qvi2bhz3fvwgq"))))
3456 (build-system cmake-build-system)
3457 (arguments
3458 (list
3459 #:parallel-tests? #f
3460 #:configure-flags
3461 #~(list "-DMEDFILE_BUILD_DOC=ON")
3462 #:phases
3463 #~(modify-phases %standard-phases
3464 (add-after 'install 'remove-test-output
3465 (lambda _
3466 (delete-file-recursively
3467 (string-append #$output "/bin/testc"))))
3468 (add-after 'install 'move-html-documentation
3469 (lambda _
3470 (mkdir-p (string-append #$output:doc "/share"))
3471 (rename-file (string-append #$output "/share/doc")
3472 (string-append #$output:doc "/share/doc")))))))
3473 (inputs (list hdf5 zlib))
3474 (native-inputs (list doxygen graphviz-minimal))
3475 (home-page "https://www.salome-platform.org")
3476 (synopsis "Library to read and write MED files")
3477 (description
3478 "The purpose of the MED module is to provide a standard for storing and
3479recovering computer data associated to numerical meshes and fields, and to
3480facilitate the exchange between codes and solvers.
3481
3482The persistent data storage is based upon HDF format (like CGNS, a standard
3483developed by Boeing and NASA in the area of Computational Fluid Dynamic).
3484
3485MED also provides structures to hold data on meshes and fields. These
3486structures are exchanged between solvers, hide the communication level (CORBA
3487or MPI), and offer persistence (read/write in .med files).
3488
3489The main benefit of a common exchange format is reduced complexity of code
3490coupling. It also allows sharing such high level functionalities as
3491computation of nodal connectivity of sub-elements (faces and edges),
3492arithmetic operations on fields, entity location functionalities, and
3493interpolation toolkit.")
3494 (license license:gpl3+)))
3495
3496(define-public python-motulator
3497 (package
3498 (name "python-motulator")
3499 (version "0.7.5")
3500 (source
3501 (origin
3502 (method git-fetch)
3503 (uri (git-reference
3504 (url "https://github.com/Aalto-Electric-Drives/motulator/")
3505 (commit (string-append "v" version))))
3506 (file-name (git-file-name name version))
3507 (sha256
3508 (base32 "1zwhypvnhy3jhkiflsd51yq9vfkyrqn66a3xkrkir21xfk0igpr7"))))
3509 (build-system pyproject-build-system)
3510 (arguments
3511 (list #:tests? #f)) ; there are no tests
3512 (propagated-inputs
3513 (list python-numpy python-matplotlib python-scipy python-tqdm))
3514 (native-inputs (list python-hatchling))
3515 (home-page "https://aalto-electric-drives.github.io/motulator/")
3516 (synopsis "Motor Drive Simulator in Python")
3517 (description "This package includes simulation models for an induction
3518motor, a synchronous reluctance motor, and a permanent-magnet synchronous
3519motor. The motor models are simulated in the continuous-time domain while the
3520control algorithms run in discrete time. The default solver is the explicit
3521Runge-Kutta method of order 5(4) from @code{scipy.integrate.solve_ivp.}")
3522 (license license:expat)))
3523
3524(define-public cgns
3525 (package
3526 (name "cgns")
3527 (version "4.5.2")
3528 (source
3529 (origin
3530 (method git-fetch)
3531 (uri (git-reference
3532 (url "https://github.com/CGNS/CGNS")
3533 (commit (string-append "v" version))))
3534 (file-name (git-file-name name version))
3535 (sha256
3536 (base32 "0r8y6lddp7q9nb6804c6bbr4y0pv7ssdzi9m5ddx50ksvfv382fw"))))
3537 (build-system cmake-build-system)
3538 (arguments
3539 (list #:configure-flags
3540 '(list "-DCGNS_ENABLE_TESTS=ON"
3541 "-DCGNS_ENABLE_FORTRAN=ON")))
3542 (inputs (list hdf5 gfortran))
3543 (home-page "https://cgns.org/")
3544 (synopsis "Read and write computational fluid dynamics analysis data")
3545 (description "This package provides software that reads, writes, and
3546modifies data in the @dfn{CFD General Notation System} (CGNS) format. The
3547format is meant for recording and recovering computer data associated with the
3548numerical solution of fluid dynamics equations. The format is a conceptual
3549entity established by the documentation; the software is a physical product
3550supplied to enable developers to access and produce data recorded in that
3551format.")
3552 (license license:zlib)))
3553
3554(define-public libarea
3555 (let ((revision "1")
3556 (commit "8f8bac811c10f1f01fda0d742a18591f61dd76ee"))
3557 (package
3558 (name "libarea")
3559 (version (git-version "0" revision commit))
3560 (source
3561 (origin
3562 (method git-fetch)
3563 (uri (git-reference (url "https://github.com/Heeks/libarea")
3564 (commit commit)))
3565 (file-name (git-file-name name version))
3566 (sha256
3567 (base32 "0pvqz6cabxqdz5y26wnj6alkn8v5d7gkx0d3h8xmg4lvy9r3kh3g"))))
3568 (build-system gnu-build-system)
3569 (inputs (list boost python-wrapper))
3570 (native-inputs
3571 `(("cmake" ,cmake-minimal)))
3572 (arguments
3573 `(#:tests? #f
3574 #:phases
3575 (modify-phases %standard-phases
3576 (add-after 'configure 'cmake-configure
3577 (lambda* (#:key inputs outputs #:allow-other-keys)
3578 (let ((out (assoc-ref outputs "out"))
3579 (cmake (assoc-ref inputs "cmake")))
3580 (mkdir-p "build")
3581 (invoke "cmake"
3582 "-DCMAKE_CXX_FLAGS=-DBOOST_TIMER_ENABLE_DEPRECATED"
3583 (string-append "-DCMAKE_INSTALL_PREFIX=" out)))))
3584 (delete 'configure))))
3585 (home-page "https://github.com/Heeks/libarea")
3586 (synopsis
3587 "Library and python module for pocketing and profiling operations")
3588 (description
3589 "Area is a CAM-related software for pocketing operation.
3590
3591This project provides library and associated python-module to compute pocket
3592operations.")
3593 (license (list
3594 license:bsd-3
3595 license:gpl3+)))))
3596
3597(define-public libspnav
3598 (package
3599 (name "libspnav")
3600 (version "1.2")
3601 (source (origin
3602 (method git-fetch)
3603 (uri (git-reference
3604 (url "https://github.com/FreeSpacenav/libspnav")
3605 (commit (string-append "v" version))))
3606 (sha256
3607 (base32
3608 "12z548jsyxcgyhh9gazw032n3igw6g15y07h4c1nlk2cd8gv6i70"))
3609 (file-name (git-file-name name version))))
3610 (build-system gnu-build-system)
3611 (inputs
3612 (list libx11))
3613 (arguments
3614 (list
3615 #:tests? #f ; there are no tests
3616 #:make-flags #~(list (string-append "CC=" #$(cc-for-target)))))
3617 (home-page "https://spacenav.sourceforge.net/")
3618 (synopsis
3619 "Library for communicating with spacenavd or 3dxsrv")
3620 (description
3621 "The libspnav library is provided as a replacement of the magellan
3622library. It provides a cleaner, and more orthogonal interface. libspnav
3623supports both the original X11 protocol for communicating with the driver, and
3624the new alternative non-X protocol. Programs that choose to use the X11
3625protocol, are automatically compatible with either the free spacenavd driver
3626or the official 3dxserv, as if they were using the magellan SDK.
3627
3628Also, libspnav provides a magellan API wrapper on top of the new API. So, any
3629applications that were using the magellan library, can switch to libspnav
3630without any changes. And programmers that are familiar with the magellan API
3631can continue using it with a free library without the restrictions of the
3632official SDK.")
3633 (license license:bsd-3)))
3634
3635(define-public openctm
3636 (let ((revision 603))
3637 ;; Previous versions don't compile, they need to link libGL and libGLU.
3638 ;; Fixed in this revision.
3639 (package
3640 (name "openctm")
3641 (version (string-append "1.0.3." (number->string revision)))
3642 (source
3643 (origin
3644 (method svn-fetch)
3645 (uri (svn-reference
3646 (url "https://svn.code.sf.net/p/openctm/code/trunk")
3647 (revision revision)))
3648 (file-name (string-append name "-" version "-checkout"))
3649 (sha256
3650 (base32 "01wb70m48xh5gwhv60a5brv4sxl0i0rh038w32cgnlxn5x86s9f1"))))
3651 (build-system gnu-build-system)
3652 (native-inputs
3653 (list pkg-config))
3654 (inputs
3655 `(("mesa" ,mesa)
3656 ("glu" ,glu)
3657 ("glut" ,freeglut)
3658 ("gtk" ,gtk+-2)))
3659 (arguments
3660 `(#:tests? #f ;no tests
3661 #:phases
3662 (modify-phases %standard-phases
3663 (replace 'configure
3664 (lambda* (#:key outputs #:allow-other-keys)
3665 (rename-file "Makefile.linux" "Makefile")
3666 (let ((out (assoc-ref outputs "out")))
3667 ;; Create output directories.
3668 (mkdir-p (string-append out "/lib"))
3669 (mkdir-p (string-append out "/include"))
3670 (mkdir-p (string-append out "/bin"))
3671 ;; Fix rpath.
3672 (substitute* "tools/Makefile.linux"
3673 (("-rpath,\\.")
3674 (string-append "-rpath," out "/lib/"))
3675 (("/usr/local")
3676 out))
3677 ;; Set right output.
3678 (substitute* "Makefile"
3679 (("/usr/lib")
3680 (string-append out "/lib"))
3681 (("\\/usr\\/local")
3682 out))
3683 #t))))))
3684 (synopsis "3D triangle mesh format and related tools and libraries")
3685 (description "OpenCTM is a file format, a software library and a tool set
3686for compression of 3D triangle meshes. The geometry is compressed to a
3687fraction of comparable file formats (3DS, STL, COLLADA...), and the format is
3688accessible through a simple API")
3689 (license license:zlib)
3690 (home-page "https://openctm.sourceforge.net/"))))
3691
3692(define-public lib3ds
3693 (package
3694 (name "lib3ds")
3695 (version "1.3.0")
3696 (source
3697 (origin
3698 (method url-fetch)
3699 (uri (string-append
3700 "https://storage.googleapis.com/google-code-archive-downloads"
3701 "/v2/code.google.com/lib3ds/lib3ds-" version ".zip"))
3702 (sha256
3703 (base32 "1qr9arfdkjf7q11xhvxwzmhxqz3nhcjkyb8zzfjpz9jm54q0rc7m"))))
3704 (build-system gnu-build-system)
3705 (native-inputs
3706 (list unzip))
3707 (home-page "https://code.google.com/archive/p/lib3ds")
3708 (synopsis "3DS format file toolkit")
3709 (description "Lib3ds is a toolkit for handling the 3DS format for 3D
3710model files. Its main goal is to simplify the creation of 3DS import and
3711export filters.")
3712 (license license:lgpl2.1+)))
3713
3714(define-public meshlab
3715 (package
3716 (name "meshlab")
3717 (version "2025.07")
3718 (source (origin
3719 (method git-fetch)
3720 (uri (git-reference
3721 (url "https://github.com/cnr-isti-vclab/meshlab")
3722 (commit (string-append "MeshLab-" version))
3723 (recursive? #t))) ;for vcglib
3724 (file-name (git-file-name name version))
3725 (sha256
3726 (base32 "2n1l1rd2qbdsy9vw4pdlz19hsg7x8zkd6vfvdqh54gzhkn4f2k08"))))
3727 (build-system qt-build-system)
3728 (inputs
3729 (list boost
3730 cgal
3731 embree
3732 glew
3733 lib3ds
3734 lib3mf
3735 libe57format
3736 libigl
3737 mpfr
3738 muparser
3739 onetbb
3740 openctm
3741 qhull
3742 tinygltf
3743 xerces-c))
3744 (arguments
3745 (list #:tests? #f ; Has no tests
3746 #:configure-flags
3747 #~(list
3748 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_BOOST=OFF"
3749 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_CGAL=OFF"
3750 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_EMBREE=OFF"
3751 "-DMESHLAB_ALLOW_BUNDLED_SOURCE_GLEW=OFF"
3752 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_LEVMAR=OFF"
3753 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_LIB3DS=OFF"
3754 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_LIB3MF=OFF"
3755 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_LIBE57=OFF"
3756 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_LIBIGL=OFF"
3757 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_MUPARSER=OFF"
3758 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_NEXUS=OFF"
3759 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_OPENCTM=OFF"
3760 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_QHULL=OFF"
3761 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_STRUCTURE_SYNTH=OFF"
3762 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_TINYGLTF=OFF"
3763 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_U3D=OFF"
3764 "-DMESHLAB_ALLOW_DOWNLOAD_SOURCE_XERCES=OFF"
3765 (string-append "-DCMAKE_MODULE_LINKER_FLAGS=-Wl,-rpath="
3766 #$output "/lib/meshlab")
3767 (string-append "-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-rpath="
3768 #$output "/lib/meshlab")
3769 (string-append "-DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath="
3770 #$output "/lib/meshlab"))))
3771 (synopsis "3D triangular mesh processing and editing software")
3772 (home-page "https://www.meshlab.net/")
3773 (description "MeshLab is a system for the processing and editing of large,
3774unstructured, 3D triangular meshes. It is aimed to help the processing of the
3775typical, not-so-small unstructured models arising in 3D scanning, providing a
3776set of tools for editing, cleaning, healing, inspecting, rendering and
3777converting this kind of meshes. These tools include MeshLab proper, a
3778versatile program with a graphical user interface, and @samp{meshlabserver}, a
3779program that can perform mesh processing tasks in batch mode, without a GUI.")
3780 (license license:gpl3+)))
3781
3782(define-public poke
3783 (package
3784 (name "poke")
3785 (version "5.0")
3786 (source (origin
3787 (method url-fetch)
3788 (uri (string-append "mirror://gnu/poke/poke-" version
3789 ".tar.gz"))
3790 (sha256
3791 (base32 "13sv5x73g26x0qk5cxawm4pqk470v5xfl8w6p08q2742psddawv8"))
3792 (modules '((guix build utils)))
3793 (snippet
3794 '(begin
3795 ;; Delete files generated by Bison.
3796 (delete-file "gl/parse-datetime.c")
3797 (delete-file "jitter/example-vms/structured/structured-parser.c")
3798 (delete-file "jitter/example-vms/structured/structured-parser.h")
3799 (delete-file "jitter/jitterc/jitterc-parser.c")
3800 (delete-file "jitter/jitterc/jitterc-parser.h")
3801 (delete-file "jitter/jitter/jitter-routine-parser.c")
3802 (delete-file "jitter/jitter/jitter-routine-parser.h")
3803 (delete-file "libpoke/pkl-tab.c")
3804 (delete-file "libpoke/pkl-tab.h")
3805 ;; Delete files generated by flex.
3806 (delete-file "jitter/example-vms/structured/structured-scanner.c")
3807 (delete-file "jitter/example-vms/structured/structured-scanner.h")
3808 (delete-file "jitter/jitterc/jitterc-scanner.c")
3809 (delete-file "jitter/jitterc/jitterc-scanner.h")
3810 (delete-file "jitter/jitter/jitter-routine-scanner.c")
3811 (delete-file "jitter/jitter/jitter-routine-scanner.h")
3812 (delete-file "libpoke/pkl-lex.c")
3813 (delete-file "libpoke/pkl-lex.h")
3814 (delete-file "pokefmt/pokefmt.c")
3815 (delete-file "pokefmt/pokefmt.h")
3816 ;; Other generated files:
3817 (delete-file "jitter/example-vms/jitterlisp/jitterlispvm-vm1.c")
3818 (delete-file "jitter/example-vms/jitterlisp/jitterlispvm-vm2.c")
3819 (delete-file "jitter/example-vms/jitterlisp/jitterlispvm-vm.h")
3820 (delete-file "jitter/example-vms/structured/structuredvm-vm1.c")
3821 (delete-file "jitter/example-vms/structured/structuredvm-vm2.c")
3822 (delete-file "jitter/example-vms/structured/structuredvm-vm.h")
3823 (delete-file "jitter/example-vms/structured/structuredvm-vm-main.c")
3824 (delete-file "jitter/example-vms/uninspired/uninspired-vm1.c")
3825 (delete-file "jitter/example-vms/uninspired/uninspired-vm2.c")
3826 (delete-file "jitter/example-vms/uninspired/uninspired-vm.h")
3827 (delete-file "jitter/example-vms/uninspired/uninspired-vm-main.c")
3828 (delete-file "libpoke/pvm-vm.h")
3829 (delete-file "libpoke/pvm-vm1.c")
3830 (delete-file "libpoke/pvm-vm2.c")))))
3831 (build-system gnu-build-system)
3832 (native-inputs (list bison dejagnu flex libtool pkg-config))
3833 ;; FIXME: Enable NBD support by adding `libnbd' (currently unpackaged).
3834 (inputs (list libgc readline libtextstyle))
3835 (arguments
3836 (list
3837 #:imported-modules `((guix build emacs-build-system)
3838 (guix build emacs-utils)
3839 ,@%default-gnu-imported-modules)
3840 #:modules '((guix build gnu-build-system)
3841 ((guix build emacs-build-system) #:prefix emacs:)
3842 (guix build utils))
3843 #:configure-flags
3844 #~(list "--disable-static"
3845 (string-append "--with-vimdir=" #$output
3846 "/share/vim/vimfiles/pack/guix/start/poke")
3847 (string-append "--with-lispdir="
3848 (emacs:elpa-directory #$output)))))
3849 (native-search-paths
3850 (list (search-path-specification
3851 (variable "POKE_LOAD_PATH")
3852 (files '("share/poke/pickles")))))
3853 (home-page "https://www.gnu.org/software/poke/#documentation")
3854 (synopsis "Editing of arbitrary binary data")
3855 (description "GNU poke is an interactive, extensible editor for binary data.
3856Not limited to editing basic entities such as bits and bytes, it provides a
3857full-fledged procedural, interactive programming language designed to describe
3858data structures and to operate on them.")
3859 (license license:gpl3+)))
3860
3861(define-public poke-elf
3862 (package
3863 (name "poke-elf")
3864 (version "1.0")
3865 (source (origin
3866 (method url-fetch)
3867 (uri (string-append "mirror://gnu/poke/poke-elf-" version
3868 ".tar.gz"))
3869 (sha256
3870 (base32
3871 "0x3shih7sjj34f5305kvbp4cfy11m92zwidjk3658m23zkd6gdqa"))))
3872 (build-system gnu-build-system)
3873 (native-inputs (list poke)) ;for the test suite
3874 (home-page "https://jemarch.net/poke-elf")
3875 (synopsis "GNU poke pickle for ELF object files")
3876 (description "@code{poke-elf} is a GNU poke pickle for editing ELF object files,
3877executables, shared libraries and core dumps. It supports many architectures
3878and extensions.")
3879 (license license:gpl3+)))
3880
3881(define-public pcb2gcode
3882 ;; XXX: The latest release was on <2022-09-12>, but master branch contains a
3883 ;; lot of changes and fixes from that time, use the latest commit
3884 ;; instead. Revert to version tag when it's available.
3885 (let ((commit "8c084afd00c6653dfa9cbf24a1dbeeb24f592aa9")
3886 (revision "0"))
3887 (package
3888 (name "pcb2gcode")
3889 (version (git-version "2.5.0" revision commit))
3890 (source
3891 (origin
3892 (method git-fetch)
3893 (uri (git-reference
3894 (url "https://github.com/pcb2gcode/pcb2gcode")
3895 (commit commit)))
3896 (file-name (git-file-name name version))
3897 (sha256
3898 (base32 "19hyzd1601l51bwlv43j8l602nfacbjwqf54m5xsmj50718bcks2"))))
3899 (build-system gnu-build-system)
3900 (native-inputs
3901 (list autoconf
3902 automake
3903 libtool
3904 pkg-config))
3905 (inputs
3906 (list boost
3907 geos
3908 gerbv
3909 glibmm
3910 gtkmm-2
3911 (librsvg-for-system)))
3912 (home-page "https://github.com/pcb2gcode/pcb2gcode")
3913 (synopsis "Generate G-code for milling PCBs")
3914 (description
3915 "pcb2gcode is a command-line program for isolation routing and drilling
3916of PCBs. It takes Gerber files as input and outputs G-code files for the
3917milling of PCBs. It also includes an autoleveller for the automatic dynamic
3918calibration of the milling depth.")
3919 (license license:gpl3+))))
3920
3921;; libdxfrw has no readme, no version release, no tags. Initial commit says
3922;; "libdxfrw-0.6.3 import", but it shares no git history with "upstream"
3923;; https://github.com/codelibs/libdxfrw. Both are difficult to package
3924;; separately as they don't install properly. Copying in-tree instead of
3925;; #:recursive #t to avoid downloading the other bigger dependencies which
3926;; aren't needed.
3927(define libdxfrw-sources
3928 (origin
3929 (method git-fetch)
3930 (uri (git-reference (url
3931 "https://github.com/solvespace/libdxfrw")
3932 (commit
3933 "0b7b7b709d9299565db603f878214656ef5e9ddf")))
3934 (sha256 (base32
3935 "0d2wjq81466m3hb5cffiy99vhx0irwwy47yfxp318k2q4cvd5z2a"))))
3936
3937(define-public solvespace
3938 (let ((commit "70bde63cb32a7f049fa56cbdf924e2695fcb2916")
3939 (version "3.1"))
3940 (package
3941 (name "solvespace")
3942 (version version)
3943 (source (origin
3944 (method git-fetch)
3945 (uri (git-reference
3946 (url "https://github.com/solvespace/solvespace")
3947 (commit commit)))
3948 (file-name (git-file-name name version))
3949 (sha256
3950 (base32
3951 "1hbdln44k00a6vlklv2mq2c9zda3i9d5x0f7ks85w4v6zskhqnra"))))
3952 (build-system cmake-build-system)
3953 (native-inputs (list pkg-config gettext-minimal))
3954 (arguments
3955 (list
3956 #:build-type "Release"
3957 #:tests? #f
3958 #:phases #~(modify-phases %standard-phases
3959 (add-after 'unpack 'unpack-libdxfrw
3960 (lambda _
3961 (copy-recursively #$libdxfrw-sources
3962 "extlib/libdxfrw")))
3963 (add-before 'configure 'embed-git-commit-hash
3964 (lambda _
3965 ;; `git describe` doesn't work here, so embed
3966 ;; the commit hash directly in CMakeLists.txt as
3967 ;; described instead.
3968 (substitute* "CMakeLists.txt"
3969 (("include\\(GetGitCommitHash\\)")
3970 (string-append "set(GIT_COMMIT_HASH "
3971 #$commit ")")))))
3972 (add-before 'configure 'use-packaged-mimalloc
3973 (lambda _
3974 (substitute* "CMakeLists.txt"
3975 (("message\\(STATUS \"Using in-tree mimalloc\"\\)")
3976 "message(STATUS \"Using guix packaged mimalloc\")")
3977 (("add_subdirectory\\(extlib/mimalloc EXCLUDE_FROM_ALL\\)")
3978 "find_package(mimalloc REQUIRED)"))))
3979 (add-after 'install 'wrap-program
3980 (lambda* (#:key inputs outputs #:allow-other-keys)
3981 (wrap-program (string-append (assoc-ref outputs "out")
3982 "/bin/solvespace")
3983 ;; For GtkFileChooserDialog.
3984 `("GSETTINGS_SCHEMA_DIR" =
3985 (,(string-append (assoc-ref inputs "gtk+")
3986 "/share/glib-2.0/schemas")))))))))
3987 (inputs
3988 (list bash-minimal
3989 cairo
3990 eigen
3991 freetype
3992 gtkmm-3
3993 json-c
3994 libpng
3995 libspnav ;spaceware
3996 mimalloc
3997 mesa
3998 zlib))
3999 (synopsis
4000 "Parametric 2D/3D @acronym{CAD, computer-aided design} software")
4001 (description
4002 "SOLVESPACE is a parametric 3D @acronym{CAD,
4003computer-aided design} tool. Applications include:
4004
4005@itemize
4006@item modeling 3D parts — draw with extrudes, revolves, helixes and
4007 Boolean (union / difference / intersection) operations
4008@item modeling 2D parts — draw the part as a single section,
4009 and export DXF, PDF, SVG; use 3D assembly to verify fit
4010@item 3D-printed parts — export the STL or other triangle mesh
4011 expected by most 3D printers
4012@item preparing CAM data — export 2D vector art for a waterjet
4013 machine or laser cutter; or generate STEP or STL, for import into
4014 third-party CAM software for machining
4015@item mechanism design — use the constraint solver to simulate planar
4016 or spatial linkages, with pin, ball, or slide joints
4017@item plane and solid geometry — replace hand-solved trigonometry and spreadsheets
4018 with a live dimensioned drawing
4019@end itemize")
4020 (home-page "https://solvespace.com/")
4021 (license license:gpl3+))))
4022
4023(define-public syscall-intercept
4024 ;; Upstream provides no tag. Also, last version update is 4 years old.
4025 (let ((commit "304404581c57d43478438d175099d20260bae74e")
4026 (revision "0"))
4027 (package
4028 (name "syscall-intercept")
4029 (version (git-version "0.1.0" revision commit))
4030 (source
4031 (origin
4032 (method git-fetch)
4033 (uri
4034 (git-reference
4035 (url "https://github.com/pmem/syscall_intercept/")
4036 (commit commit)))
4037 (file-name (git-file-name name version))
4038 (sha256
4039 (base32 "17sw78xp5wjzv25adpbq3khl8fi0avj7bgpi57q3jnvl3c68xy5z"))))
4040 (native-inputs
4041 (list perl pkg-config))
4042 (inputs
4043 (list capstone))
4044 (build-system cmake-build-system)
4045 (arguments
4046 `(#:build-type "Release"
4047 ;; FIXME: "syscall_format_logging" test fails.
4048 #:tests? #f))
4049 (home-page "https://github.com/pmem/syscall_intercept")
4050 (synopsis "System call intercepting library")
4051 (description
4052 "The system call intercepting library provides a low-level interface
4053for hooking Linux system calls in user space. This is achieved by
4054hot-patching the machine code of the standard C library in the memory of
4055a process.")
4056 (license license:bsd-2))))
4057
4058(define-public xfoil
4059 (package
4060 (name "xfoil")
4061 (version "6.99")
4062 (source
4063 (origin
4064 (method url-fetch)
4065 (uri (string-append "https://web.mit.edu/drela/Public/web/xfoil/xfoil"
4066 version ".tgz"))
4067 (sha256
4068 (base32
4069 "0h5y5v0qlyvi4qc943x394npz4779i8f52iksxshxkjj7xj500jw"))))
4070 (build-system gnu-build-system)
4071 (arguments
4072 `(#:phases
4073 (modify-phases %standard-phases
4074 (delete 'configure)
4075 (add-after 'unpack 'edit-files
4076 (lambda* (#:key outputs #:allow-other-keys)
4077 ;; The instructions in orrs/README say that orrs/bin/osmap.f
4078 ;; should be edited, but that file is never used by XFOIL.
4079 ;; Instead, it is osrc/osmap.f that is used.
4080 (substitute* "osrc/osmap.f"
4081 (("^[ ]{6}DATA OSFILE / '/var/local/codes/orrs/osmap.dat' /")
4082 (let ((replacement (string-append (make-string 6 #\space)
4083 "DATA OSFILE / '"
4084 (assoc-ref outputs "out")
4085 "/share/xfoil/osmap.dat' /")))
4086 ;; In fixed form Fortran, lines cannot exceed 72 columns.
4087 ;; The Guix store path exceeds this limit.
4088 (string-append
4089 (substring replacement 0 72) "\n"
4090 (make-string 5 #\space) "&" (substring replacement 72)))))
4091 (substitute* "orrs/bin/Makefile_DP"
4092 (("^FC = ifort")
4093 "FC = gfortran")
4094 (("^FLG = -O -r8")
4095 "FLG = -O2 -fdefault-real-8"))
4096 (substitute* "plotlib/Makefile"
4097 (("^include ./config.make")
4098 "include ./config.make.gfortranDP"))
4099 (substitute* "bin/Makefile_gfortran"
4100 (("^BINDIR = /home/codes/bin/")
4101 (string-append "BINDIR = " (assoc-ref outputs "out") "/bin"))
4102 (("^CC = cc")
4103 "CC = gcc")
4104 (("^CFLAGS = -O -DUNDERSCORE")
4105 "CFLAGS = -O2 -DUNDERSCORE")
4106 (("^FFLAGS = -O \\$\\(CHK\\) \\$\\(DBL\\)")
4107 "FFLAGS = -O2 $(CHK) $(DBL)")
4108 (("^FFLOPT = -O \\$\\(CHK\\) \\$\\(DBL\\)")
4109 "FFLOPT = -O2 $(CHK) $(DBL)")
4110 ;; Separate the build stage from the install stage.
4111 (("\\$\\(INSTALLCMD\\) xfoil \\$\\(BINDIR\\)") "")
4112 (("\\$\\(INSTALLCMD\\) pxplot \\$\\(BINDIR\\)") "")
4113 (("\\$\\(INSTALLCMD\\) pplot \\$\\(BINDIR\\)") ""))))
4114 (replace 'build
4115 (lambda _
4116 (invoke "make" "-C" "orrs/bin" "-f" "Makefile_DP" "osgen")
4117 (with-directory-excursion "orrs"
4118 (invoke "bin/osgen" "osmaps_ns.lst"))
4119 (invoke "make" "-C" "plotlib")
4120 (substitute* "bin/Makefile_gfortran"
4121 (("^FFLAGS =(.*)$" _ suffix)
4122 (string-append "FFLAGS = -fallow-argument-mismatch "
4123 suffix "\n")))
4124 (invoke "make" "-C" "bin" "-f" "Makefile_gfortran")))
4125 (replace 'install
4126 (lambda* (#:key outputs #:allow-other-keys)
4127 (let* ((out (assoc-ref outputs "out"))
4128 (bin-dir (string-append out "/bin"))
4129 (data-dir (string-append out "/share/xfoil"))
4130 (doc-dir (string-append out "/share/doc/xfoil")))
4131 (mkdir-p bin-dir)
4132 (invoke "make" "-C" "bin" "-f" "Makefile_gfortran" "install")
4133 (mkdir-p data-dir)
4134 (install-file "orrs/osmap.dat" data-dir)
4135 (mkdir-p doc-dir)
4136 (install-file "xfoil_doc.txt" doc-dir)))))
4137 #:tests? #f))
4138 (inputs
4139 (list libx11))
4140 (native-inputs
4141 (list gfortran))
4142 (home-page "https://web.mit.edu/drela/Public/web/xfoil/")
4143 (synopsis "Program for the design and analysis of subsonic airfoils")
4144 (description
4145 "XFOIL is an interactive program for the design and analysis of subsonic
4146isolated airfoils. It consists of a collection of menu-driven routines which
4147perform various useful functions such as:
4148@itemize
4149@item Viscous (or inviscid) analysis of an existing airfoil
4150@item Airfoil design and redesign by interactive modification of surface speed
4151 distributions
4152@item Airfoil redesign by interactive modification of geometric parameters
4153@item Blending of airfoils
4154@item Writing and reading of airfoil coordinates and polar save files
4155@item Plotting of geometry, pressure distributions, and multiple polars
4156@end itemize")
4157 (license license:gpl2+)))
4158
4159(define-public libigl
4160 (package
4161 (name "libigl")
4162 (version "2.4.0")
4163 (source
4164 (origin
4165 (method git-fetch)
4166 (uri (git-reference
4167 (url "https://github.com/libigl/libigl")
4168 (commit (string-append "v" version))))
4169 (file-name (git-file-name name version))
4170 (sha256
4171 (base32
4172 "0qlnpp8nxbahcky4d67dzn0ynbv3v037nbx1akq6h5rzhvkzq40x"))))
4173 (build-system cmake-build-system)
4174 (arguments
4175 (list #:configure-flags
4176 #~(list "-DLIBIGL_USE_STATIC_LIBRARY=OFF"
4177 "-DLIBIGL_BUILD_TESTS=ON"
4178 "-DLIBIGL_BUILD_TUTORIALS=OFF"
4179 "-DLIBIGL_INSTALL=ON"
4180 "-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
4181 (format #f "-DCatch2_DIR=~a/lib/cmake/catch2/"
4182 #$(this-package-input "catch2"))
4183 (format #f "-DSpectra_DIR=~a/share/pectra/cmake/"
4184 #$(this-package-input "spectra"))
4185 ;; The following options disable tests for the corresponding
4186 ;; libraries. The options do not affect whether the libraries are
4187 ;; linked to libigl or not, they are used for tests.
4188 "-DLIBIGL_WITH_COMISO=OFF"
4189 "-DLIBIGL_WITH_CORK=OFF"
4190 "-DLIBIGL_MATLAB=OFF"
4191 "-DLIBIGL_MOSEK=OFF"
4192 ;; XXX: GLFW tests are failing with SEGFAULT. See
4193 ;; <https://github.com/libigl/libigl/issues/2313>
4194 "-DLIBIGL_GLFW_TESTS=OFF")
4195 #:build-type "Release"
4196 #:phases
4197 #~(modify-phases %standard-phases
4198 (add-after 'unpack 'unpack-external
4199 (lambda _
4200 (setenv "HOME" (getcwd)) ;; cmake needs this to export modules
4201 (mkdir "external")
4202 (copy-recursively (assoc-ref %build-inputs "libigl-glad")
4203 "external/glad")
4204 (copy-recursively (assoc-ref %build-inputs "libigl-test-data")
4205 "external/test-data")
4206 (copy-recursively (assoc-ref %build-inputs "libigl-comiso")
4207 "external/comiso")
4208 (copy-recursively (assoc-ref %build-inputs "libigl-tetgen")
4209 "external/tetgen")
4210 (copy-recursively (assoc-ref %build-inputs "libigl-predicates")
4211 "external/predicates")
4212 (copy-recursively (assoc-ref %build-inputs "imguizmo")
4213 "external/imguizmo")
4214 (copy-recursively (assoc-ref %build-inputs "eigen")
4215 "external/eigen")))
4216 (add-after 'unpack-external 'patch-cmake
4217 (lambda* (#:key inputs #:allow-other-keys)
4218 (define (source-dir library-name)
4219 (format #f "SOURCE_DIR \"~a\""
4220 (assoc-ref %build-inputs library-name)))
4221 (define (fix-external-library cmake source)
4222 (substitute* (format #f "cmake/recipes/external/~a.cmake"
4223 cmake)
4224 (("GIT_REPOSITORY.*") (source-dir source))
4225 (("GIT_TAG.*") "")))
4226 ;; Fix references to external libraries
4227 (fix-external-library "comiso" "libigl-comiso")
4228 (fix-external-library "tetgen" "libigl-tetgen")
4229 (fix-external-library "triangle" "libigl-triangle")
4230 (fix-external-library "predicates" "libigl-predicates")
4231 (fix-external-library "glad" "libigl-glad")
4232 (fix-external-library "libigl_tests_data" "libigl-test-data")
4233 (fix-external-library "stb" "libigl-stb")
4234 (substitute* "cmake/recipes/external/imguizmo.cmake"
4235 (("if\\(TARGET imguizmo::imguizmo\\)")
4236 "if(true)")
4237 (("target_link_libraries.*")
4238 (format #f "include_directories(~a/include/imgui/)"
4239 (assoc-ref inputs "imgui"))))
4240
4241 (substitute* "cmake/igl/igl_add_test.cmake"
4242 (("include\\(\".*/contrib/Catch.cmake\"\\)")
4243 (format #f
4244 "include(\"~a/lib/cmake/Catch2/Catch.cmake\")"
4245 (assoc-ref inputs "catch2"))))
4246 (substitute* "cmake/recipes/external/cgal.cmake"
4247 (("FetchContent_Populate\\(cgal\\)")
4248 "find_package(CGAL CONFIG COMPONENTS Core)\nreturn()"))
4249 (substitute* "cmake/recipes/external/eigen.cmake"
4250 (("FetchContent_Populate\\(eigen\\)")
4251 "find_package(Eigen3 CONFIG REQUIRED)\nreturn()"))
4252 (substitute* "cmake/recipes/external/catch2.cmake"
4253 (("message.*")
4254 "find_package(Catch2 CONFIG)\nreturn()"))
4255 (substitute* "cmake/recipes/external/libigl_imgui_fonts.cmake"
4256 (("if\\(TARGET igl::imgui_fonts\\)")
4257 "if(true)"))
4258 (substitute* "cmake/recipes/external/tinyxml2.cmake"
4259 (("FetchContent_Populate\\(tinyxml2\\)")
4260 "find_package(tinyxml2 CONFIG REQUIRED)\nreturn()"))
4261 (substitute* "cmake/recipes/external/embree.cmake"
4262 (("FetchContent_MakeAvailable\\(embree\\)")
4263 (string-join (list "find_package(Embree 3 CONFIG)"
4264 "add_library(embree::embree ALIAS embree)"
4265 "return()")
4266 "\n")))
4267 (substitute* "cmake/recipes/external/glfw.cmake"
4268 (("FetchContent_MakeAvailable\\(glfw\\)")
4269 (string-join
4270 (list "find_package(glfw3 CONFIG REQUIRED)"
4271 "add_library(glfw::glfw ALIAS glfw)"
4272 "return()")
4273 "\n")))
4274 (substitute* "cmake/recipes/external/imgui.cmake"
4275 (("FetchContent_MakeAvailable\\(imgui\\)")
4276 "return()"))))
4277
4278 (add-after 'unpack-external 'fix-assertions
4279 (lambda _
4280 ;; Current Tetgen version has a bug.
4281 (substitute* "include/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp"
4282 (("assert\\(out.numberofpoints == out.numberofpointmarkers\\);")
4283 ";"))
4284 ;; CGAL has a bug in assertion as well.
4285 (substitute* "include/igl/copyleft/cgal/trim_with_solid.cpp"
4286 (("assert\\(I.size\\(\\) == Vr.rows\\(\\)\\);")
4287 ";"))))
4288
4289 ;; XXX: Install modules as CMake fails to install them.
4290 (add-after 'install 'install-includes
4291 (lambda* (#:key inputs outputs #:allow-other-keys)
4292 (let* ((out (assoc-ref outputs "out"))
4293 (include-dir (string-append out "/include/igl/")))
4294 (for-each (lambda (module)
4295 (copy-recursively (format #f
4296 "../source/include/igl/~a"
4297 module)
4298 (format #f
4299 "~a/~a"
4300 include-dir
4301 module)))
4302 (list "copyleft/cgal"
4303 "copyleft/opengl2"
4304 "copyleft/tetgen"
4305 "embree"
4306 "opengl"
4307 "predicates"
4308 "xml"))))))))
4309
4310 (native-inputs (list catch2-2))
4311 ;; XXX: Inputs are currently only used to build tests.
4312 ;; We would need to patch the CMake recipe to build a shared library
4313 ;; with all of these.
4314 (inputs
4315 `(("boost" ,boost-1.83)
4316 ("cgal" ,cgal)
4317 ("eigen" ,eigen)
4318 ("embree" ,embree-3)
4319 ("glfw" ,glfw-3.4)
4320 ("gmp" ,gmp)
4321 ("mesa" ,mesa)
4322 ("mpfr" ,mpfr)
4323 ("onetbb" ,onetbb)
4324 ("tinyxml2" ,tinyxml2)
4325 ("openblas" ,openblas)
4326 ("imgui" ,imgui)
4327 ("spectra" ,spectra)
4328 ;; When updating this package, update commit fields below according to
4329 ;; the hashes listed in "cmake/LibiglDownloadExternal.cmake".
4330 ("libigl-test-data"
4331 ,(origin
4332 (method git-fetch)
4333 (uri (git-reference
4334 (url "https://github.com/libigl/libigl-tests-data")
4335 (commit "19cedf96d70702d8b3a83eb27934780c542356fe")))
4336 (file-name (git-file-name "libigl-test-data" version))
4337 (sha256
4338 (base32 "1wxglrxw74xw4a4jmmjpm8719f3mnlbxbwygjb4ddfixxxyya4i2"))))
4339 ("libigl-glad"
4340 ,(let* ((commit "ead2d21fd1d9f566d8f9a9ce99ddf85829258c7a")
4341 (revision "0")
4342 (version (git-version "0.0.0" revision commit)))
4343 (origin
4344 (method git-fetch)
4345 (uri (git-reference
4346 (url "https://github.com/libigl/libigl-glad")
4347 (commit commit)))
4348 (file-name (git-file-name "libigl-glad" version))
4349 (sha256
4350 (base32 "079fd5yrbd713nq7slhhgq79wns85pc564ydlkjl9gf43d3220ay")))))
4351 ("libigl-stb"
4352 ,(origin
4353 (method git-fetch)
4354 (uri (git-reference
4355 (url "https://github.com/libigl/libigl-stb.git")
4356 (commit "cd0fa3fcd90325c83be4d697b00214e029f94ca3")))
4357 (file-name (git-file-name "libigl-stb" version))
4358 (sha256
4359 (base32 "0wwlb370z40y63ic3ny6q7lxibhixg2k1pjdkl4ymzv79zld28kj"))))
4360 ("libigl-predicates"
4361 ,(let* ((commit "50c2149e7a520d13cd10e9aeff698bd68edd5a4f")
4362 (revision "0")
4363 (version (git-version "0.0.0" revision commit)))
4364 (origin
4365 (method git-fetch)
4366 (uri (git-reference
4367 (url "https://github.com/libigl/libigl-predicates.git")
4368 (commit commit)))
4369 (file-name (git-file-name "libigl-predicates" version))
4370 (sha256
4371 (base32 "0yiqhzry2qhb1p0v9sldlnpqsn4y8cln8r6y08lafkc9kc4qy8jz")))))
4372 ;; TODO: Package tetgen separately from <http://www.tetgen.org>
4373 ("libigl-tetgen"
4374 ,(let* ((commit "4f3bfba3997f20aa1f96cfaff604313a8c2c85b6")
4375 (revision "0")
4376 (version (git-version "0.0.0" revision commit)))
4377 (origin
4378 (method git-fetch)
4379 (uri (git-reference
4380 (url "https://github.com/libigl/tetgen.git")
4381 (commit commit)))
4382 (file-name (git-file-name "libigl-tetgen" version))
4383 (sha256
4384 (base32 "1k724syssw37py7kwmibk3sfwkkgyjyy7qkijnhn6rjm91g8qxsg")))))
4385 ("libigl-comiso"
4386 ,(let* ((commit "562efe333edc8e649dc101469614f43378b1eb55")
4387 (revision "0")
4388 (version (git-version "0.0.0" revision commit)))
4389 (origin
4390 (method git-fetch)
4391 (uri (git-reference
4392 (url "https://github.com/libigl/comiso.git")
4393 (commit commit)))
4394 (file-name (git-file-name "libigl-comiso" version))
4395 (sha256
4396 (base32 "048zryh9ydd1dqwzs14vj7r3fd6yyq6n4zl6d1b0yb1iwrqfy6ba")))))
4397 ("libigl-triangle"
4398 ,(origin
4399 (method git-fetch)
4400 (uri (git-reference
4401 (url "https://github.com/libigl/triangle.git")
4402 (commit "6bbd92c7ddd6c803c403e005e1132eadb38fbe68")))
4403 (file-name (git-file-name "libigl-triangle" version))
4404 (sha256
4405 (base32 "0d35mfqwdk99xn1lpjzz9w5axq016r6xy5vr00lb4mvb05limxl3"))))
4406
4407 ;; XXX: This is a source-only library which is currently required only
4408 ;; for libigl.
4409
4410 ("imguizmo"
4411 ,(origin
4412 (method git-fetch)
4413 (uri (git-reference
4414 (url "https://github.com/CedricGuillemet/ImGuizmo")
4415 (commit "1.83")))
4416 (file-name (git-file-name "imguizmo" version))
4417 (sha256
4418 (base32 "14ywf96nvxf5c081pwypyzjwx9vyq78glbzinc81558v1sxiy2v0"))))))
4419 (home-page "https://libigl.github.io/")
4420 (synopsis "Simple C++ geometry processing library")
4421 (description "This library provides functionality for shape modelling,
4422visualization, matrix manipulation.")
4423 (license (list license:gpl3 license:mpl2.0))))
4424
4425(define-public prusa-libbgcode
4426 ;; Use the same commit as in the PrusaSlicer repository.
4427 ;; <https://github.com/prusa3d/libbgcode/issues/31>.
4428 (let ((commit "5041c093b33e2748e76d6b326f2251310823f3df")
4429 (revision "1"))
4430 (package
4431 (name "prusa-libbgcode")
4432 (version (git-version "0.0.0" revision commit))
4433 (source
4434 (origin
4435 (method git-fetch)
4436 (uri (git-reference
4437 (url "https://github.com/prusa3d/libbgcode")
4438 (commit commit)))
4439 (file-name (git-file-name name version))
4440 (sha256
4441 (base32 "0ivc0zhpf0gz55jfj0gbkff6yw5gpwazk94asldzznn7x9jmbb0i"))))
4442 (native-inputs (list catch2))
4443 (propagated-inputs (list zlib boost heatshrink))
4444 (build-system cmake-build-system)
4445 (home-page "https://github.com/prusa3d/libbgcode")
4446 (synopsis "Prusa Block and Binary G-code reader/writer/converter")
4447 (description
4448 "Binary G-code is a new standard for encoding and compressing ASCII G-code
4449files. G-code files are easy to read and interpret, but their downside is that the
4450data is not saved efficiently, and the file size is often very large. Compression of
4451the file is problematic because the printers usually run on limited hardware and they
4452may not have enough memory and/or CPU power to decompress it.
4453
4454Block and Binary G-Code is a new G-code file format featuring the following
4455improvements over the legacy G-code:
4456@itemize
4457@item Block structure with distinct blocks for metadata vs. G-code.
4458@item Faster navigation.
4459@item Coding and compression for smaller file size.
4460@item Checksum for data validity.
4461@item Extensibility through new (custom) blocks. For example, a file signature block
4462may be welcome by corporate customers.
4463@end itemize
4464
4465The binary G-code format is flexible and the encoding and compression of individual
4466blocks is variable. @code{libbgcode} library contains the routines to convert ASCII
4467G-codes to binary and vice versa.")
4468 ;; See
4469 ;; <https://github.com/prusa3d/libbgcode/blob/main/pyproject.toml>
4470 (license license:agpl3+))))
4471
4472(define-public prusa-slicer
4473 (package
4474 (name "prusa-slicer")
4475 (version "2.9.6")
4476 (source
4477 (origin
4478 (method git-fetch)
4479 (uri
4480 (git-reference
4481 (url "https://github.com/prusa3d/PrusaSlicer")
4482 (commit (string-append "version_" version))))
4483 (file-name (git-file-name name version))
4484 (sha256 (base32 "1gi0pqdk9xrjaig3ylpx1030ysyz9jczwg57clxgb76w1744hws9"))
4485 (patches (search-patches "prusa-slicer-add-cmake-module.patch"
4486 "prusa-slicer-boost-1.87.patch"
4487 "prusa-slicer-boost-1.88.patch"
4488 "prusa-slicer-boost-1.89.patch"
4489 "prusa-slicer-cgal-6.patch"
4490 "prusa-slicer-opencascade-7.8.patch"))
4491 (modules '((guix build utils)))
4492 (snippet
4493 `(begin
4494 ;; Prusa slicer bundles a lot of dependencies in src/ directory.
4495 ;; Most of them contain prusa-specific modifications (e.g. avrdude),
4496 ;; but others do not. Here we replace the latter with Guix packages.
4497 ;; Remove bundled libraries that were not modified by Prusa Slicer developers.
4498 (delete-file-recursively "bundled_deps/hidapi")
4499 (delete-file-recursively "bundled_deps/libigl/igl")
4500 (substitute* "CMakeLists.txt"
4501 (("target_link_libraries\\(libexpat INTERFACE EXPAT::EXPAT\\)")
4502 "")
4503 (("add_library\\(libexpat INTERFACE\\)")
4504 ""))
4505 (substitute* "bundled_deps/CMakeLists.txt"
4506 (("add_subdirectory\\(hidapi\\)")
4507 ""))
4508 (substitute* "bundled_deps/libigl/CMakeLists.txt"
4509 (("target_link_libraries\\(libigl INTERFACE igl::core\\)") ""))
4510 (substitute* "src/CMakeLists.txt"
4511 (("add_subdirectory\\(hidapi\\)")
4512 "pkg_check_modules(HIDAPI REQUIRED hidapi-hidraw)")
4513 (("include_directories\\(hidapi/include\\)")
4514 "include_directories()")
4515 (("add_library\\(libexpat INTERFACE\\)")
4516 "")
4517 (("target_link_libraries\\(libexpat INTERFACE EXPAT::EXPAT\\)")
4518 "")
4519 (("list\\(APPEND wxWidgets_LIBRARIES libexpat\\)")
4520 "list(APPEND wxWidgets_LIBRARIES expat)"))
4521 (substitute* "src/libslic3r/CMakeLists.txt"
4522 (("libexpat")
4523 "expat"))
4524 (substitute* "src/slic3r/CMakeLists.txt"
4525 (("add_library\\(libslic3r_gui.*" all)
4526 (string-append
4527 "find_package(HidAPI REQUIRED)\n"
4528 all
4529 "\ntarget_include_directories(libslic3r_gui PUBLIC ${HIDAPI_INCLUDE_DIR})\n"))
4530 ((" hidapi")
4531 " ${HIDAPI_LIBRARY}"))))))
4532 (build-system cmake-build-system)
4533 (arguments
4534 (list #:configure-flags
4535 #~(list "-DSLIC3R_FHS=1" ;; Use The Filesystem Hierarchy Standard.
4536 "-DSLIC3R_GTK=3" ;; Use GTK+
4537 ;; Use wxWidgets 3.0.x.x to prevent GUI crashes when adding support enforcers.
4538 "-DSLIC3R_WX_STABLE=1"
4539 ;; FIXME: tests fail to build with cgal-6.
4540 ;; prusa-slicer-cgal-6.patch needs updating.
4541 "-DSLIC3R_BUILD_TESTS=0"
4542 (format #f "-Dlibigl_DIR=~a"
4543 (search-input-directory %build-inputs
4544 "lib/cmake/igl/"))
4545 (format #f "-DCatch2_DIR=~a"
4546 (search-input-directory %build-inputs
4547 "lib/cmake/Catch2/")))
4548 #:tests? #f
4549 #:phases
4550 #~(modify-phases %standard-phases
4551 (add-after 'unpack 'fix-include-paths
4552 (lambda _
4553 (substitute* "tests/libslic3r/test_quadric_edge_collapse.cpp"
4554 (("#include <libigl/igl/qslim.h>")
4555 "#include <igl/qslim.h>"))))
4556 (add-after 'unpack 'fix-for-glew-on-wayland
4557 (lambda _
4558 ;; GLEW's glewInit() function attempts to use GLX,
4559 ;; which fails on Wayland.
4560 ;; Ignoring the error code GLEW_ERROR_NO_GLX_DISPLAY
4561 ;; solves the issue.
4562 (substitute* "src/slic3r/GUI/OpenGLManager.cpp"
4563 (("err != GLEW_OK")
4564 "err != GLEW_OK && err != GLEW_ERROR_NO_GLX_DISPLAY"))))
4565 (add-after 'install 'wrap-program
4566 (lambda _
4567 (wrap-program (string-append #$output "/bin/prusa-slicer")
4568 ;; For GtkFileChooserDialog.
4569 `("GSETTINGS_SCHEMA_DIR" =
4570 (,(string-append #$(this-package-input "gtk+")
4571 "/share/glib-2.0/schemas")))))))))
4572 (native-inputs
4573 (list pkg-config catch2))
4574 (inputs
4575 (list bash-minimal
4576 boost
4577 cereal
4578 cgal
4579 curl
4580 dbus
4581 eigen
4582 eudev
4583 expat
4584 glew
4585 glib
4586 gmp
4587 gtk+
4588 heatshrink
4589 hidapi
4590 ilmbase
4591 libigl
4592 libjpeg-turbo
4593 libpng
4594 mesa
4595 mpfr
4596 nanosvg
4597 nlohmann-json
4598 nlopt
4599 opencascade-occt
4600 openssl
4601 openvdb
4602 pango
4603 prusa-libbgcode
4604 wxwidgets
4605 qhull
4606 onetbb
4607 webkitgtk-for-gtk3
4608 z3
4609 zlib))
4610 (home-page "https://www.prusa3d.com/prusaslicer/")
4611 (synopsis "G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)")
4612 (description "PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts
4613them into G-code instructions for FFF printers or PNG layers for mSLA 3D
4614printers. It is compatible with any modern printer based on the RepRap
4615toolchain, including all those based on the Marlin, Prusa, Sprinter and
4616Repetier firmware. It also works with Mach3, LinuxCNC and Machinekit
4617controllers.")
4618 (license license:agpl3)
4619
4620 ;; Mark as tunable to take advantage of SIMD code in Eigen and in libigl.
4621 (properties '((tunable? . #t)))))
4622
4623(define-public wireviz
4624 (package
4625 (name "wireviz")
4626 (version "0.4.1")
4627 (source
4628 (origin
4629 (method git-fetch)
4630 (uri (git-reference
4631 (url "https://github.com/wireviz/WireViz")
4632 (commit (string-append "v" version))))
4633 (file-name (git-file-name name version))
4634 (sha256
4635 (base32 "0ggh2xmf60b84pi0q2bxjpq1ivgrm0wklgjdyqh1h7i51avhxcf1"))))
4636 (build-system pyproject-build-system)
4637 (arguments
4638 (list #:tests? #f)) ; no tests in git checkout
4639 (native-inputs
4640 (list python-setuptools))
4641 (inputs
4642 (list python-click
4643 python-graphviz
4644 python-pillow
4645 python-pyyaml))
4646 (home-page "https://github.com/wireviz/WireViz")
4647 (synopsis "Easily document cables and wiring harnesses")
4648 (description
4649 "WireViz is a tool for easily documenting cables, wiring harnesses and
4650connector pinouts. It takes plain text, YAML-formatted files as input and
4651produces beautiful graphical output thanks to GraphViz. It handles automatic
4652BOM creation and has a lot of extra features.")
4653 (license license:gpl3)))
4654
4655(define-public libarcus
4656 (package
4657 (name "libarcus")
4658 (version "4.13.0") ; Should same version as Cura package.
4659 (source
4660 (origin
4661 (method git-fetch)
4662 (uri (git-reference
4663 (url "https://github.com/Ultimaker/libArcus")
4664 (commit version)))
4665 (file-name (git-file-name name version))
4666 (sha256
4667 (base32 "19fi0y0lk45cyampczgh3kz2swai4zcgzkffp0xf5h55rxxrdpvk"))))
4668 (build-system cmake-build-system)
4669 (arguments
4670 `(#:tests? #f
4671 #:configure-flags '("-DBUILD_EXAMPLES=OFF")
4672 #:phases
4673 (modify-phases %standard-phases
4674 (add-after 'unpack 'fix-protobuf-compatibility
4675 (lambda _
4676 (substitute* "src/Socket_p.h"
4677 (("stream\\.SetTotalBytesLimit\\(message_size_maximum,.*\\);")
4678 "stream.SetTotalBytesLimit(message_size_maximum);"))))
4679 (add-before 'configure 'fix-python-sitearch
4680 (lambda* (#:key outputs #:allow-other-keys)
4681 (substitute* "cmake/FindSIP.cmake"
4682 (("\\$\\{_process_output\\} Python3_SITEARCH")
4683 (string-append (assoc-ref outputs "out")
4684 "/lib/python"
4685 ,(version-major+minor
4686 (package-version python))
4687 "/site-packages"
4688 " Python3_SITEARCH"))))))))
4689 (inputs
4690 (list protobuf
4691 python
4692 python-sip-4))
4693 (native-inputs (list python-setuptools))
4694 (home-page "https://github.com/Ultimaker/libArcus")
4695 (synopsis "Communication library for Ultimaker software components")
4696 (description "This library contains C++ code and Python3 bindings for
4697creating a socket in a thread and using this socket to send and receive
4698messages based on the Protocol Buffers library. It is designed to
4699facilitate the communication between Cura and its backend and similar code.")
4700 (license license:lgpl3+)))
4701
4702(define-public cura-engine
4703 (package
4704 (name "cura-engine")
4705 (version "4.13.2")
4706 (source
4707 (origin
4708 (method git-fetch)
4709 (uri (git-reference
4710 (url "https://github.com/Ultimaker/CuraEngine")
4711 (commit version)))
4712 (patches (search-patches "cura-engine-gcc-14.patch"))
4713 (file-name (git-file-name name version))
4714 (sha256
4715 (base32 "0xp2r0m5wwfsh9wdb3biqzvfqfz5jsmyw4bww93aksw0rgli07bp"))))
4716 (build-system cmake-build-system)
4717 (native-inputs
4718 (list googletest-1.13 pkg-config))
4719 (inputs
4720 (list libarcus protobuf stb-image))
4721 (arguments
4722 `(#:configure-flags '("-DBUILD_TESTS=ON")
4723 #:phases
4724 (modify-phases %standard-phases
4725 (add-after 'unpack 'fix-paths
4726 (lambda* (#:key inputs #:allow-other-keys)
4727 (substitute* "../source/cmake/FindStb.cmake"
4728 (("/usr/include")
4729 (string-append (assoc-ref inputs "stb-image")
4730 "/include"))
4731 (("stb/stb_image_resize.h")
4732 "stb_image.h"))
4733 (substitute*
4734 "../source/src/infill/ImageBasedDensityProvider.cpp"
4735 (("stb/stb_image.h")
4736 "stb_image.h")))))))
4737 (home-page "https://github.com/Ultimaker/CuraEngine")
4738 (synopsis "Cura slicing engine")
4739 (description
4740 "CuraEngine is an engine for processing 3D models into 3D printing
4741instructions for Ultimaker and other GCode-based 3D printers. It is part of a
4742larger project called Cura.")
4743 (license license:agpl3+)))
4744
4745(define-public cura-binary-data
4746 (package
4747 (name "cura-binary-data")
4748 (version "4.13.1")
4749 (source
4750 (origin
4751 (method git-fetch)
4752 (uri (git-reference
4753 (url "https://github.com/Ultimaker/cura-binary-data")
4754 (commit version)))
4755 (file-name (git-file-name name version))
4756 (sha256
4757 (base32 "11dra399adky7jxpaqqk1swrg5y3cc1086l54c3injg3ccgrvwik"))
4758 (modules '((guix build utils)))
4759 (snippet
4760 '(begin
4761 ;; Remove Windows executables and prebuilt firmware files.
4762 (delete-file-recursively "cura/resources/firmware")
4763 (delete-file-recursively "windows")))))
4764 (build-system cmake-build-system)
4765 (arguments
4766 `(#:tests? #f ; No test suite.
4767 #:configure-flags '("-DENABLE_FIRMWARE_INSTALL=OFF")))
4768 (home-page "https://github.com/Ultimaker/cura-binary-data")
4769 (synopsis "Binary data for Cura, like compiled translations")
4770 (description "This package contains binary data for Cura releases, like
4771compiled translations. Prebuilt Firmware files are removed.")
4772 (license license:agpl3)))
4773
4774(define-public udis86
4775 (let ((commit "5336633af70f3917760a6d441ff02d93477b0c86")
4776 (revision "0"))
4777 (package
4778 (name "udis86")
4779 (version (git-version "1.7.2" revision commit))
4780 (source (origin
4781 (method git-fetch)
4782 (uri (git-reference
4783 (url "https://github.com/canihavesomecoffee/udis86")
4784 (commit commit)))
4785 (file-name (git-file-name name version))
4786 (sha256
4787 (base32
4788 "0y5z1169wff578jylpafsww4px4y6gickhcs885a9c660d8xs9qy"))))
4789 (build-system gnu-build-system)
4790 (native-inputs (list autoconf automake libtool python-minimal-wrapper))
4791 ;; Fork of <https://github.com/vmt/udis86>.
4792 (home-page "https://github.com/canihavesomecoffee/udis86")
4793 (synopsis "Disassembler library for x86 and x86-64")
4794 (description
4795 "Udis86 is a disassembler for the x86 and x86-64 class of instruction
4796set architectures. It consists of a C library called @code{libudis86} which
4797provides a clean and simple interface to decode and inspect a stream of raw
4798binary data as disassembled instructions in a structured manner, and a command
4799line tool called @command{udcli} that incorporates the library.")
4800 (license license:bsd-2))))
4801
4802(define-public uranium
4803 (package
4804 (name "uranium")
4805 (version "4.13.1")
4806 (source
4807 (origin
4808 (method git-fetch)
4809 (uri (git-reference
4810 (url "https://github.com/Ultimaker/Uranium")
4811 (commit version)))
4812 (file-name (git-file-name name version))
4813 (sha256
4814 (base32 "1nyxm3fdyrsisqkxbqld66bljd852wnc1yc6i1lyvncwvzn8ai32"))))
4815 (build-system cmake-build-system)
4816 (native-inputs
4817 (list doxygen
4818 gettext-minimal
4819 graphviz
4820 pkg-config
4821 python-pytest
4822 python-certifi
4823 python-twisted))
4824 (propagated-inputs
4825 (list cura-binary-data
4826 libarcus
4827 python
4828 python-cryptography
4829 python-numpy
4830 python-pyqt
4831 python-scipy
4832 python-shapely
4833 python-trimesh
4834 python-zeroconf
4835 qtbase
4836 qtdeclarative-5
4837 qtgraphicaleffects
4838 qtquickcontrols-5
4839 qtquickcontrols2-5
4840 qtsvg-5))
4841 (arguments
4842 `(;; FIXME: tests are disabled, because they cause an infinite loop.
4843 #:tests? #f
4844 #:configure-flags
4845 ,#~(list (string-append "-DGETTEXT_MSGINIT_EXECUTABLE="
4846 #$(this-package-native-input "gettext-minimal")
4847 "/bin/msginit")
4848 (string-append "-DCURA_BINARY_DATA_DIRECTORY="
4849 #$(this-package-input "cura-binary-data")))
4850 #:phases
4851 (modify-phases %standard-phases
4852 (add-after 'unpack 'fix-uranium-plugin-path
4853 (lambda* (#:key outputs #:allow-other-keys)
4854 (substitute* "UM/Application.py"
4855 (("app_root =.*$")
4856 (string-append "app_root = \""
4857 (assoc-ref outputs "out") "\"\n"))
4858 (("app_root, \"share\", \"uranium\", \"plugins\"")
4859 "app_root, \"lib\", \"uranium\", \"plugins\"")))))))
4860 (home-page "https://github.com/Ultimaker/Uranium")
4861 (synopsis "Python framework for building desktop applications")
4862 (description "Uranium is a Python Framework for building 3D printing
4863related desktop applications using PyQt5. It belongs to the Cura project
4864from Ultimaker.")
4865 (license license:lgpl3+)))
4866
4867(define-public libnest2d-for-cura
4868 ;; Cura uses a custom fork of the libnest2d library.
4869 (package
4870 (name "libnest2d-for-cura")
4871 (version "4.12.0")
4872 (source
4873 (origin
4874 (method git-fetch)
4875 (uri (git-reference
4876 (url "https://github.com/Ultimaker/libnest2d")
4877 (commit version)))
4878 (file-name (git-file-name name version))
4879 (sha256
4880 (base32 "1wk7cv8sqnxy7srq61scrr18dz2i0l4s4slmjfh4890iy0wf9i7n"))))
4881 (build-system cmake-build-system)
4882 (inputs
4883 (list boost clipper nlopt))
4884 (arguments
4885 `(#:tests? #f
4886 #:phases
4887 (modify-phases %standard-phases
4888 (add-before 'configure 'fix-clipper-detection
4889 (lambda* (#:key inputs #:allow-other-keys)
4890 (setenv "CLIPPER_PATH" (assoc-ref inputs "clipper")))))))
4891 (home-page "https://github.com/Ultimaker/libnest2d")
4892 (synopsis "2D irregular bin packaging and nesting library")
4893 (description
4894 "Libnest2D is a library and framework for the 2D bin packaging
4895problem. It was inspired from the SVGNest Javascript library.")
4896 (license license:lgpl3)))
4897
4898(define-public python-pynest2d
4899 (package
4900 (name "python-pynest2d")
4901 (version "4.12.0")
4902 (source
4903 (origin
4904 (method git-fetch)
4905 (uri (git-reference
4906 (url "https://github.com/Ultimaker/pynest2d")
4907 (commit version)))
4908 (file-name (git-file-name name version))
4909 (sha256
4910 (base32 "0jhqfylg6vzlbz9rqs981bg6y8s18iklw1p8hmax72xq2c7561s1"))))
4911 (build-system cmake-build-system)
4912 (arguments
4913 `(#:tests? #f
4914 #:phases
4915 (modify-phases %standard-phases
4916 (add-before 'configure 'fix-clipper-detection
4917 (lambda* (#:key inputs #:allow-other-keys)
4918 (setenv "CLIPPER_PATH" (assoc-ref inputs "clipper"))))
4919 (add-before 'configure 'fix-python-sitearch
4920 (lambda* (#:key outputs #:allow-other-keys)
4921 (let ((path (string-append (assoc-ref outputs "out")
4922 "/lib/python"
4923 ,(version-major+minor
4924 (package-version python))
4925 "/site-packages")))
4926 (substitute* "cmake/FindSIP.cmake"
4927 (("\\$\\{_process_output\\} Python3_SITEARCH")
4928 (string-append path " Python3_SITEARCH"))
4929 (("\\$\\{_process_output\\} Python3_SITELIB")
4930 (string-append path " Python3_SITELIB")))))))))
4931 (native-inputs
4932 (list pkg-config
4933 python-setuptools))
4934 (inputs
4935 (list boost
4936 clipper
4937 libnest2d-for-cura
4938 nlopt
4939 python
4940 python-sip-4))
4941 (home-page "https://github.com/Ultimaker/pynest2d")
4942 (synopsis "Python bindings for libnest2d")
4943 (description
4944 "This package contains CPython bindings for libnest2d-for-cura.")
4945 (license license:lgpl3+)))
4946
4947(define-public libcharon
4948 (package
4949 (name "libcharon")
4950 (version "4.13.0")
4951 (source
4952 (origin
4953 (method git-fetch)
4954 (uri (git-reference
4955 (url "https://github.com/Ultimaker/libCharon")
4956 (commit version)))
4957 (file-name (git-file-name name version))
4958 (sha256
4959 (base32 "0ibv15y7lfxs09k6rbc3kiaz13gq3v9vqxrk20rqp6bdclk3izff"))))
4960 (build-system cmake-build-system)
4961 (native-inputs
4962 (list python-pytest))
4963 (inputs
4964 (list python))
4965 (home-page "https://github.com/Ultimaker/libCharon")
4966 (synopsis "File metadata and streaming library")
4967 (description "LibCharon is a Python file metadata and streaming library. It
4968belongs to the Cura project from Ultimaker.")
4969 (license license:lgpl3+)))
4970
4971(define-public libsavitar
4972 (package
4973 (name "libsavitar")
4974 (version "4.13.0")
4975 (source
4976 (origin
4977 (method git-fetch)
4978 (uri (git-reference
4979 (url "https://github.com/Ultimaker/libSavitar")
4980 (commit version)))
4981 (file-name (git-file-name name version))
4982 (sha256
4983 (base32 "1cq85x0xizsjwf9nl7v7x4i9vl335mgv2lda3q2c9fcwrndsc3wk"))))
4984 (build-system cmake-build-system)
4985 (arguments
4986 `(#:tests? #f ; No test suite.
4987 #:phases
4988 (modify-phases %standard-phases
4989 (add-before 'configure 'fix-python-sitearch
4990 (lambda* (#:key outputs #:allow-other-keys)
4991 (let ((path (string-append (assoc-ref outputs "out")
4992 "/lib/python"
4993 ,(version-major+minor
4994 (package-version python))
4995 "/site-packages")))
4996 (substitute* "cmake/FindSIP.cmake"
4997 (("\\$\\{_process_output\\} Python3_SITEARCH")
4998 (string-append path " Python3_SITEARCH"))
4999 (("\\$\\{_process_output\\} Python3_SITELIB")
5000 (string-append path " Python3_SITELIB")))))))))
5001 (inputs (list python python-sip-4))
5002 (native-inputs (list python-setuptools))
5003 (home-page "https://github.com/Ultimaker/libSavitar")
5004 (synopsis "C++ implementation of 3mf loading with SIP python bindings")
5005 (description "LibSavitar is a C++ implementation of 3mf loading with SIP
5006python bindings. It belongs to the Cura project from Ultimaker.")
5007 (license license:lgpl3+)))
5008
5009(define-public cura
5010 (package
5011 (name "cura")
5012 (version "4.13.1")
5013 (source
5014 (origin
5015 (method git-fetch)
5016 (uri (git-reference
5017 (url "https://github.com/Ultimaker/Cura")
5018 (commit version)))
5019 (file-name (git-file-name name version))
5020 (sha256
5021 (base32 "0yg17pcrj5gm02aqcjfk40ynvpb9r9aaq9rj108dkpki1is15ks7"))))
5022 (build-system qt-build-system)
5023 (native-inputs
5024 (list python-certifi
5025 python-pytest
5026 python-requests))
5027 (inputs
5028 (list bash-minimal
5029 cura-engine
5030 libcharon
5031 libsavitar
5032 python
5033 python-keyring
5034 python-pynest2d
5035 python-pyserial
5036 python-sentry-sdk
5037 python-sip
5038 uranium))
5039 (arguments
5040 `(;; TODO: Fix tests.
5041 #:tests? #f
5042 #:configure-flags '("-DURANIUM_SCRIPTS_DIR=")
5043 #:phases
5044 (modify-phases %standard-phases
5045 (add-after 'install 'link-to-CuraEngine
5046 (lambda* (#:key inputs outputs #:allow-other-keys)
5047 (symlink (string-append (assoc-ref inputs "cura-engine")
5048 "/bin/CuraEngine")
5049 (string-append (assoc-ref outputs "out")
5050 "/bin/CuraEngine"))))
5051 (add-after 'link-to-CuraEngine 'wrap-pythonpath
5052 (lambda* (#:key outputs #:allow-other-keys)
5053 (let ((out (assoc-ref outputs "out")))
5054 (wrap-program (string-append out "/bin/cura")
5055 (list "GUIX_PYTHONPATH"
5056 'prefix (list (string-append out
5057 "/lib/python"
5058 ,(version-major+minor
5059 (package-version python))
5060 "/site-packages")
5061 (getenv "GUIX_PYTHONPATH"))))))))))
5062 (home-page "https://github.com/Ultimaker/Cura")
5063 (synopsis "Slicer for 3D printers")
5064 (description "Cura is a slicing software from Ultimaker. A @emph{slicer}
5065generates G-Code for 3D printers.")
5066 (license license:lgpl3+)))
5067
5068(define-public bcnc
5069 (package
5070 (name "bcnc")
5071 (version "0.9.15")
5072 (source
5073 (origin
5074 (method url-fetch)
5075 (uri (pypi-uri "bCNC" version))
5076 (sha256
5077 (base32 "1wsz5ppgncn992znj9wpkvjkf87m93zb2pdzlas53nnj2j4pz9vw"))
5078 ;; Comment out opencv-python which cannot be detected because
5079 ;; the opencv python library lacks necessary metadata files.
5080 ;; https://github.com/opencv/opencv-python/issues/944
5081 (modules '((guix build utils)))
5082 (snippet '(substitute* "setup.py"
5083 (("\"opencv-python.*" line)
5084 (string-append "# " line))
5085 (("\\+.*" line)
5086 (string-append "# " line))))))
5087 (build-system pyproject-build-system)
5088 ;; Tests require pyautogui which is not packaged yet.
5089 (arguments
5090 (list
5091 #:tests? #f)) ; all tests depend on not packaged pyautogui
5092 (native-inputs
5093 (list python-setuptools
5094 python-wheel))
5095 (inputs
5096 (list `(,python "tk")))
5097 (propagated-inputs
5098 (list opencv
5099 python-numpy
5100 python-pillow
5101 python-pyserial
5102 python-shxparser
5103 python-svgelements))
5104 (home-page "https://github.com/vlachoudis/bCNC")
5105 (synopsis "Swiss army knife for all your CNC/g-code needs")
5106 (description
5107 "GrblHAL CNC command sender, autoleveler, g-code editor, digitizer, CAM
5108and swiss army knife for all your CNC needs. The sender is robust and fast
5109able to work nicely with old or slow hardware.")
5110 (license (list license:gpl2+
5111 ;; XXX: Check if the mentioned sources may be unbundled,
5112 ;; they specify their own compatible licenses as take from
5113 ;; project's README:
5114 ;;
5115 ;; Numpy-STL (https://github.com/WoLpH/numpy-stl)
5116 ;; lib/stl
5117 ;; Python-Utils (https://github.com/WoLpH/python-utils)
5118 ;; lib/python_utils
5119 license:bsd-3
5120
5121 ;; MeshCut (https://github.com/julienr/meshcut)
5122 ;; Copyright (c) 2015 Julien Rebetez
5123 ;; lib/mescut.py
5124 ;; lib/ply.py
5125 ;; lib/utils.py
5126 ;; svg.path (https://github.com/regebro/svg.path)
5127 ;; Copyright (c) 2013-2014 Lennart Regebro
5128 ;; lib/svg/*
5129 license:expat))))
5130
5131(define-public candle
5132 (package
5133 (name "candle")
5134 (version "11.2")
5135 (source (origin
5136 (method git-fetch)
5137 (uri (git-reference
5138 (url "https://github.com/Denvi/Candle")
5139 (commit (string-append "v" version))))
5140 (file-name (git-file-name name version))
5141 (sha256
5142 (base32
5143 "0dn7ywfik343h62sphgxhdv16ilglb1asmgg32f8r22lvsavjb2r"))))
5144 (build-system cmake-build-system)
5145 (native-inputs (list qt5ct qttools-5 qtscript-5))
5146 (inputs
5147 (list bash-minimal
5148 qtbase-5
5149 qtmultimedia-5
5150 qtserialport-5
5151 qtwayland-5
5152 qtwebsockets-5))
5153 (arguments
5154 (list #:tests? #f ; no tests.
5155 #:phases #~(modify-phases %standard-phases
5156 (add-after 'unpack 'fix-installation-paths
5157 (lambda _
5158 (substitute* "src/designerplugins/CMakeLists.txt"
5159 (("DESIGNER_DESTINATION \"designerplugins\"")
5160 "DESIGNER_DESTINATION \"lib/designerplugins\""))
5161 (substitute* "src/customwidgets/CMakeLists.txt"
5162 (("TARGETS customwidgets RUNTIME DESTINATION .")
5163 "TARGETS customwidgets RUNTIME DESTINATION lib"))
5164 (substitute* "src/candle/CMakeLists.txt"
5165 (("candle PROPERTIES INSTALL_RPATH \"\\$ORIGIN/lib\"")
5166 "candle PROPERTIES INSTALL_RPATH \"$ORIGIN/../lib\"")
5167 (("install(.*/LICENSE DESTINATION .*)$")
5168 (string-append
5169 "install(FILES"
5170 " ${CMAKE_SOURCE_DIR}/LICENSE"
5171 " DESTINATION ${GENERAL_DESTINATION}/share/candle/)"))
5172 (("install(.*/help DESTINATION .*)$")
5173 (string-append
5174 "install(DIRECTORY"
5175 " ${CMAKE_SOURCE_DIR}/help"
5176 " DESTINATION ${GENERAL_DESTINATION}/share/candle/)"))
5177 (("TARGETS candle RUNTIME DESTINATION .")
5178 "TARGETS candle RUNTIME DESTINATION bin"))))
5179 (add-after 'install 'wrap-executable
5180 (lambda _
5181 (let ((qtbase #$(this-package-input "qtbase"))
5182 (qtwayland #$(this-package-input "qtwayland")))
5183 (wrap-program (string-append #$output "/bin/candle")
5184 `("QT_PLUGIN_PATH" ":" =
5185 (,(string-append qtwayland "/lib/qt5/plugins")))
5186 `("QT_QPA_PLATFORM_PLUGIN_PATH" ":" =
5187 (,(string-append qtwayland
5188 "/lib/qt5/plugins/platforms"))))))))))
5189 (home-page "https://github.com/Denvi/Candle")
5190 (synopsis "GRBL controller with G-Code visualizer")
5191 (description
5192 "Candle is a GRBL controller application with a visualizer for G-Code,
5193the @acronym{CNC, computer numerical control} programming language.
5194
5195Supported functions include:
5196
5197@itemize
5198@item Controlling GRBL-based cnc-machine via console commands, buttons on
5199form, numpad.
5200@item Monitoring CNC-machine state.
5201@item Loading, editing, saving and sending of G-code files to CNC-machine.
5202@item Visualizing G-code files.
5203@end itemize")
5204 (license license:gpl3+)))
5205
5206(define-public rizin
5207 (package
5208 (name "rizin")
5209 (version "0.8.2") ;keep in sync with cutter
5210 (source
5211 (origin
5212 (method url-fetch)
5213 (uri (string-append
5214 "https://github.com/rizinorg/rizin/releases/download/v"
5215 version "/rizin-src-v" version ".tar.xz"))
5216 (sha256
5217 (base32
5218 "159ddi96mlqdynixy3h831dip59gr2gnj85jgvrjyvz8p99clc0n"))))
5219 (build-system meson-build-system)
5220 (arguments
5221 (list
5222 #:configure-flags
5223 #~(list "--wrap-mode=nodownload" ;for rzgdb, rzheap, etc.
5224 "-Dpackager=guix"
5225 (string-append "-Dpackager_version=" #$version)
5226 "-Duse_sys_capstone=enabled"
5227 "-Duse_sys_magic=enabled"
5228 "-Duse_sys_libzip=enabled"
5229 "-Duse_sys_zlib=enabled"
5230 "-Duse_sys_lz4=enabled"
5231 "-Duse_sys_libzstd=enabled"
5232 "-Duse_sys_xxhash=enabled"
5233 "-Duse_sys_openssl=enabled"
5234 "-Duse_sys_tree_sitter=enabled"
5235 "-Duse_sys_lzma=enabled"
5236 "-Duse_sys_libmspack=enabled"
5237 "-Duse_sys_pcre2=enabled"
5238 "-Duse_zlib=true"
5239 "-Duse_lzma=true"
5240 "-Dinstall_sigdb=false"
5241 "-Duse_swift_demangler=true"
5242 "-Duse_gpl=true")
5243 #:phases
5244 #~(modify-phases %standard-phases
5245 (add-before 'configure 'skip-integration-tests
5246 (lambda _
5247 ;; Skip integration tests, which require prebuilt binaries at:
5248 ;; <https://github.com/rizinorg/rizin-testbins>.
5249 (substitute* "test/meson.build"
5250 (("subdir\\('integration'\\)") ""))
5251 ;;; Skip failing tests.
5252 (substitute* "test/unit/meson.build"
5253 (("'tokens',\n") "")))))))
5254 (native-inputs (list pkg-config))
5255 (inputs
5256 (list capstone
5257 file
5258 libuv
5259 libzip
5260 lz4
5261 openssl
5262 pcre2
5263 tree-sitter
5264 xxhash
5265 zlib
5266 (list zstd "lib")
5267 libmspack))
5268 (home-page "https://rizin.re")
5269 (synopsis "Disassemble, debug, analyze, and manipulate binary files")
5270 (description
5271 "Rizin is a reverse engineering framework and a set of small command-line
5272utilities, providing a complete binary analysis experience with features like
5273disassembler, hexadecimal editor, emulation, binary inspection, debugger, and
5274more.")
5275 ;; Most files are under LGPL-3.0-only, other are under: Apache-2.0,
5276 ;; BSD-2-Clause, BSD-3-Clause, CC0-1.0, CC-BY-SA-4.0, GPL-1.0-or-later,
5277 ;; GPL-2.0-only, GPL-2.0-or-later, GPL-3.0-or-later, LGPL-2.0-or-later,
5278 ;; LGPL-2.1-only, LGPL-2.1-or-later, LGPL-3.0-only, MIT, NCSA.
5279 (license license:gpl3+)))
5280
5281(define-public python-asyncua
5282 (package
5283 (name "python-asyncua")
5284 (version "2.0.1")
5285 (source
5286 (origin
5287 (method git-fetch)
5288 (uri (git-reference
5289 (url "https://github.com/FreeOpcUa/opcua-asyncio")
5290 (commit (string-append "v" version))
5291 ;; XXX: It clones <https://github.com/OPCFoundation/UA-Nodeset>
5292 ;; submodule, check if it may be unbundled.
5293 (recursive? #t)))
5294 (file-name (git-file-name name version))
5295 (sha256
5296 (base32 "1qrsrgj7x6l010s9msvfc1a23lzlygi2sis6xw1jj4mw1glxick5"))))
5297 (build-system pyproject-build-system)
5298 (arguments
5299 (list
5300 ;; tests: 774 passed, 6 skipped, 1 deselected, 2479 warnings
5301 #:test-flags
5302 ;; KeyError: 'Simple'
5303 #~(list "--deselect=tests/test_pubsub.py::test_full_simple")))
5304 (native-inputs
5305 (list python-hatchling
5306 python-pytest
5307 python-pytest-asyncio
5308 python-pytest-mock))
5309 (propagated-inputs
5310 (list python-aiosqlite
5311 python-anyio
5312 python-cryptography
5313 python-dateutil
5314 python-pyopenssl
5315 python-pytz
5316 python-sortedcontainers
5317 python-typing-extensions))
5318 (home-page "https://freeopcua.github.io/")
5319 (synopsis "OPC UA / IEC 62541 client and server library")
5320 (description "This package provides an OPC UA / IEC 62541 client and
5321server for Python and pypy3.")
5322 (license license:lgpl3+)))
5323
5324;; NOTE: modglue is frozen, receiving zero development since 2017-01-19.
5325;; However it is a dependency of cadabra 1.x, and cadabra 1.x is a
5326;; soft dependency of TeXmacs.
5327(define-public modglue
5328 (package
5329 (name "modglue")
5330 (version "1.20")
5331 (source (origin
5332 (method git-fetch)
5333 (uri (git-reference
5334 (url "https://github.com/kpeeters/modglue.git")
5335 (commit "89d65f5be9c737123b7beb721bd96c4eed650d9a")))
5336 (file-name (git-file-name name version))
5337 (sha256
5338 (base32
5339 "0cfrp2wyyfb6c71s5skg2g7gdg7bpvv77x6rvw7r9dqvamxsgmih"))
5340 (patches
5341 (search-patches "modglue-fix-build.patch"))))
5342 (build-system gnu-build-system)
5343 (arguments
5344 `(#:parallel-build? #f
5345 #:make-flags
5346 (list "TIMESTAMP=-DDATETIME=\\\"\\\" -DHOSTNAME=\\\"\\\"")
5347 #:phases
5348 (modify-phases %standard-phases
5349 (replace 'check
5350 (lambda _
5351 (invoke "make" "-C" "src" "tests"))))))
5352 (native-inputs
5353 (list pkg-config libtool))
5354 (inputs
5355 (list libsigc++-2))
5356 (synopsis "C++ library for handling of multiple co-processes")
5357 (description "This package provides a C++ library for handling of
5358multiple co-processes in cadabra.")
5359 (home-page "https://cadabra.science/")
5360 (license license:gpl2+)))
5361
5362;; NOTE: cadabra is frozen, receiving zero development since 2016-12-20.
5363;; However it is a soft dependency of TeXmacs (as a plugin).
5364(define-public cadabra
5365 (package
5366 (name "cadabra")
5367 (version "1.46")
5368 (source (origin
5369 (method git-fetch)
5370 (uri (git-reference
5371 (url "https://github.com/kpeeters/cadabra.git")
5372 (commit version)))
5373 (file-name (git-file-name name version))
5374 (sha256
5375 (base32
5376 "0kks3qv1rka9ynw386kspjwq0g7xmwjycwlr3bbmxjmnk9zvnn9h"))))
5377 (build-system gnu-build-system)
5378 (arguments
5379 `(#:configure-flags '("--disable-gui")
5380 #:make-flags
5381 (list (string-append "TIMESTAMP=-DRELEASE=\"\\\""
5382 ,version
5383 "\\\"\" -DDATETIME=\"\\\""
5384 "Thu Jan 1 01:02:00 AM CET 1970"
5385 "\\\"\" -DHOSTNAME=\"\\\""
5386 "dummy"
5387 "\\\"\""))
5388 #:test-target "test"
5389 #:phases
5390 (modify-phases %standard-phases
5391 (add-after 'unpack 'fix
5392 (lambda _
5393 (substitute* "tests/Makefile.in"
5394 (("TIMER=/usr/bin/time ")
5395 "TIMER=time "))
5396 ;; Upstream bug. spino is a pointer.
5397 (substitute* "src/exchange.cc"
5398 (("ngr.spino==false")
5399 "!ngr.spino")))))))
5400 (native-inputs
5401 (list pkg-config time))
5402 (inputs
5403 (list lie pcre gmp libsigc++-2 modglue))
5404 (synopsis "Computer algebra system geared towards field theory")
5405 (description "This package provides a computer algebra system geared
5406towards field theory. This package is mostly meant to be used by texmacs
5407and mogan.")
5408 (home-page "https://cadabra.science/")
5409 (license license:gpl3+)))
5410
5411(define-public cadabra2
5412 (package
5413 (name "cadabra2")
5414 (version "2.5.8")
5415 (source (origin
5416 (method git-fetch)
5417 (uri (git-reference
5418 (url "https://github.com/kpeeters/cadabra2")
5419 (commit version)
5420 (recursive? #t)))
5421 (file-name (git-file-name name version))
5422 (sha256
5423 (base32
5424 "0pcijvvv75x6408r6slkwljhqb4l4csnk6dhf5333dv9j9cm76ck"))))
5425 (build-system cmake-build-system)
5426 (arguments
5427 (list
5428 #:configure-flags
5429 #~(list
5430 (string-append "-DPYTHON_SITE_PATH=" #$output
5431 "/lib/python"
5432 #$(version-major+minor
5433 (package-version (this-package-input "python")))
5434 "/site-packages")
5435 (string-append "-DCMAKE_INSTALL_PREFIX="
5436 (assoc-ref %outputs "out")))
5437 #:phases
5438 #~(modify-phases %standard-phases
5439 (add-after 'unpack 'patch-paths
5440 (lambda* (#:key outputs #:allow-other-keys)
5441 (substitute* "client_server/ComputeThread.cc"
5442 (("[(]\"cadabra-server\"[)]")
5443 (string-append "(\"" (assoc-ref outputs "out")
5444 "/bin/cadabra-server\")")))
5445 (substitute* "client_server/Server.cc"
5446 (("'\" [+] python_path [+]")
5447 (string-append "'\" + std::string(\""
5448 (assoc-ref outputs "out")
5449 "/lib/python"
5450 #$(version-major+minor (package-version python))
5451 "/site-packages"
5452 "\") +")))))
5453 (add-before 'check 'prepare-checks
5454 (lambda _
5455 (setenv "HOME" "/tmp"))))))
5456 (native-inputs
5457 (list pkg-config))
5458 (inputs
5459 (list glibmm-2.66 gmp python boost-1.83 gtkmm-3 sqlite python-gmpy2 python-sympy
5460 python-mpmath python-matplotlib texlive-dvipng
5461 `(,util-linux "lib")))
5462 (synopsis "Computer algebra system geared towards field theory")
5463 (description "This package provides a computer algebra system geared
5464towards field theory.")
5465 (home-page "https://cadabra.science/")
5466 (license license:gpl3+)))
5467
5468(define-public orocos-kinematics-dynamics
5469 (let ((commit "34ecff4ca7bae52fa16ca13fdb3d9db26fd2a293")
5470 ;; There hasn't been a new release in many years (version 1.5.1)
5471 ;; Using the latest commit (which has internally set version to 1.5.2)
5472 (revision "0"))
5473 (package
5474 (name "orocos-kinematics-dynamics")
5475 (version (git-version "1.5.2" revision commit))
5476 (source
5477 (origin
5478 (method git-fetch)
5479 (uri (git-reference
5480 (url "https://github.com/orocos/orocos_kinematics_dynamics")
5481 (commit commit)))
5482 (sha256
5483 (base32 "1c7vimy065908qs5nwhnrk9pp0wh8pjgdvz2hwb12a9wcsj50kf0"))
5484 (file-name (git-file-name name version))))
5485 (build-system cmake-build-system)
5486 (native-inputs (list cppunit))
5487 (propagated-inputs (list eigen))
5488 (arguments
5489 (list
5490 #:configure-flags
5491 #~(list "-DENABLE_TESTS=ON")
5492 #:phases
5493 #~(modify-phases %standard-phases
5494 (add-after 'unpack 'fix-tests
5495 (lambda _
5496 ;; Make tests deterministic by seeding the random number generator.
5497 (substitute* '("orocos_kdl/tests/treeinvdyntest.cpp"
5498 "orocos_kdl/tests/solvertest.cpp")
5499 (("srand\\( \\(unsigned\\)time\\( NULL \\)\\)")
5500 "srand(0u)"))
5501 ;; CTest requires tests to be enabled in the top-level directory.
5502 (substitute* "orocos_kdl/CMakeLists.txt"
5503 (("IF\\( ENABLE_TESTS \\)" _all)
5504 (string-append _all "\n" "enable_testing()")))))
5505 (add-after 'fix-tests 'chdir
5506 (lambda _
5507 (chdir "orocos_kdl"))))))
5508 (home-page "https://docs.orocos.org/kdl/overview.html")
5509 (synopsis "Orocos Kinematics and Dynamics (KDL) C++ Library")
5510 (description
5511 "A C++ library for rigid body kinematics calculations
5512and representations for kinematic structures and their inverse and
5513forward kinematics solvers.")
5514 (license license:lgpl2.1+))))
5515
5516(define-public python-orocos-kinematics-dynamics
5517 (package
5518 (inherit orocos-kinematics-dynamics)
5519 (name "python-orocos-kinematics-dynamics")
5520 (source
5521 (origin
5522 (inherit (package-source orocos-kinematics-dynamics))))
5523 (native-inputs (list python pybind11-2 python-psutil))
5524 (inputs (list orocos-kinematics-dynamics))
5525 (arguments
5526 (list
5527 #:phases
5528 #~(modify-phases %standard-phases
5529 (add-after 'unpack 'fix
5530 (lambda _
5531 (substitute* "python_orocos_kdl/CMakeLists.txt"
5532 ;; Use the system pybind11 instead of the bundled version
5533 (("add_subdirectory\\(pybind11\\)")
5534 "find_package(pybind11)")
5535 ;; change debian-specific python install directory
5536 (("dist-packages")
5537 "site-packages"))
5538 ;; ROS 1 uses some dynamic attributes, which are
5539 ;; disabled by default in pybind11. No harm in enabling them
5540 ;; See "https://github.com/ros2/geometry2/issues/624
5541 ;; and https://pybind11.readthedocs.io/en/stable/classes.html
5542 ;; #dynamic-attributes <Both accessed June 1 2025>
5543 (substitute* "python_orocos_kdl/PyKDL/frames.cpp"
5544 (("m, \"Vector\"")
5545 "m, \"Vector\", py::dynamic_attr()")
5546 (("m, \"Frame\"")
5547 "m, \"Frame\", py::dynamic_attr()")
5548 (("m, \"Twist\"")
5549 "m, \"Twist\", py::dynamic_attr()")
5550 (("m, \"Wrench\"")
5551 "m, \"Wrench\", py::dynamic_attr()"))
5552 (chdir "python_orocos_kdl")))
5553 (replace 'check
5554 (lambda* (#:key tests? #:allow-other-keys)
5555 (setenv "PYTHONPATH" "./")
5556 (when tests?
5557 (invoke "python3"
5558 "../python_orocos_kdl/tests/PyKDLtest.py")))))))
5559 (synopsis "Python bindings for orocos-kinematics-dynamics")
5560 (description "Python bindings for orocos-kinematics-dynamics.")))