From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60389) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dQuzv-0006FR-F1 for guix-patches@gnu.org; Fri, 30 Jun 2017 08:26:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dQuzs-0001ai-JB for guix-patches@gnu.org; Fri, 30 Jun 2017 08:26:07 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:42913) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dQuzs-0001ab-FM for guix-patches@gnu.org; Fri, 30 Jun 2017 08:26:04 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dQuzs-0007hJ-8A for guix-patches@gnu.org; Fri, 30 Jun 2017 08:26:04 -0400 Subject: [bug#27537] [PATCH 6/6] gnu: Add Axoloti. Resent-Message-ID: From: Ricardo Wurmus Date: Fri, 30 Jun 2017 14:25:23 +0200 Message-Id: <20170630122523.30510-6-rekado@elephly.net> In-Reply-To: <20170630122523.30510-1-rekado@elephly.net> References: <20170630122523.30510-1-rekado@elephly.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 27537@debbugs.gnu.org Cc: Ricardo Wurmus * gnu/packages/axoloti.scm: New file. * gnu/packages/patches/libusb-for-axoloti.patch: New file. * gnu/local.mk (dist_patch_DATA): Add patch. (GNU_SYSTEM_MODULES): Add module. --- gnu/local.mk | 2 + gnu/packages/axoloti.scm | 322 ++++++++++++++++++++++++++ gnu/packages/patches/libusb-for-axoloti.patch | 14 ++ 3 files changed, 338 insertions(+) create mode 100644 gnu/packages/axoloti.scm create mode 100644 gnu/packages/patches/libusb-for-axoloti.patch diff --git a/gnu/local.mk b/gnu/local.mk index 83b019605..456b5dce7 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -65,6 +65,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/autotools.scm \ %D%/packages/avahi.scm \ %D%/packages/avr.scm \ + %D%/packages/axoloti.scm \ %D%/packages/backup.scm \ %D%/packages/base.scm \ %D%/packages/bash.scm \ @@ -780,6 +781,7 @@ dist_patch_DATA = \ %D%/packages/patches/libtorrent-rasterbar-boost-compat.patch \ %D%/packages/patches/libtool-skip-tests2.patch \ %D%/packages/patches/libunwind-CVE-2015-3239.patch \ + %D%/packages/patches/libusb-for-axoloti.patch \ %D%/packages/patches/libvpx-CVE-2016-2818.patch \ %D%/packages/patches/libxcb-python-3.5-compat.patch \ %D%/packages/patches/libxml2-CVE-2016-4658.patch \ diff --git a/gnu/packages/axoloti.scm b/gnu/packages/axoloti.scm new file mode 100644 index 000000000..79a2150cf --- /dev/null +++ b/gnu/packages/axoloti.scm @@ -0,0 +1,322 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2016, 2017 Ricardo Wurmus +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu packages axoloti) + #:use-module (guix utils) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix build-system gnu) + #:use-module (guix build-system ant) + #:use-module (gnu packages) + #:use-module (gnu packages base) + #:use-module (gnu packages cross-base) + #:use-module (gnu packages embedded) + #:use-module (gnu packages flashing-tools) + #:use-module (gnu packages java) + #:use-module (gnu packages libusb) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages textutils) + #:use-module (gnu packages version-control) + #:use-module (gnu packages xml) + #:use-module (gnu packages zip)) + +(define libusb-for-axoloti + (package (inherit libusb) + (name "axoloti-libusb") + (version (package-version libusb)) + (source + (origin + (inherit (package-source libusb)) + (patches (list (search-patch "libusb-for-axoloti.patch"))))))) + +(define dfu-util-for-axoloti + (package (inherit dfu-util) + (name "axoloti-dfu-util") + (version "0.8") + (source + (origin + (method url-fetch) + (uri (string-append "http://dfu-util.sourceforge.net/releases/" + "dfu-util-" version ".tar.gz")) + (sha256 + (base32 + "0n7h08avlzin04j93m6hkq9id6hxjiiix7ff9gc2n89aw6dxxjsm")))) + (inputs + `(("libusb" ,libusb-for-axoloti))))) + +(define-public axoloti + (package + (name "axoloti") + (version "1.0.12") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/axoloti/axoloti/" + "archive/" version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "1dynk6h0nixp4zihpirpqa4vi8fq1lhm443jsmvhk135ykhf364p")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove pre-built Java binaries. + (delete-file-recursively "lib/") + #t)))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; no check target + #:modules ((guix build gnu-build-system) + ((guix build ant-build-system) #:prefix ant:) + (guix build utils) + (srfi srfi-1) + (srfi srfi-26) + (ice-9 match) + (ice-9 regex) + (sxml simple) + (sxml xpath) + (sxml transform)) + #:imported-modules ((guix build ant-build-system) + (guix build syscalls) + ,@%gnu-build-system-modules) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-paths + (lambda* (#:key inputs #:allow-other-keys) + ;; prepare ChibiOS + (and (zero? (system* "unzip" "-o" (assoc-ref inputs "chibios"))) + (zero? (system* "mv" "ChibiOS_2.6.9" "chibios")) + (with-directory-excursion "chibios/ext" + (zero? (system* "unzip" "-o" "fatfs-0.9-patched.zip")))) + + ;; Remove source of non-determinism in ChibiOS + (substitute* "chibios/os/various/shell.c" + (("#ifdef __DATE__") "#if 0")) + + ;; Patch shell paths + (substitute* '("src/main/java/qcmds/QCmdCompileFirmware.java" + "src/main/java/qcmds/QCmdCompilePatch.java" + "src/main/java/qcmds/QCmdFlashDFU.java") + (("/bin/sh") (which "sh"))) + + ;; Override cross compiler base name + (substitute* "firmware/Makefile.patch" + (("arm-none-eabi-(gcc|g\\+\\+|objcopy|objdump)" tool) + (which tool))) + + ;; Hardcode full path to compiler tools + (substitute* '("firmware/Makefile" + "firmware/flasher/Makefile" + "firmware/mounter/Makefile") + (("TRGT =.*") + (string-append "TRGT = " + (assoc-ref inputs "cross-toolchain") + "/bin/arm-none-eabi-\n"))) + + ;; Hardcode path to "make" + (substitute* '("firmware/compile_firmware_linux.sh" + "firmware/compile_patch_linux.sh") + (("make") (which "make"))) + + ;; Hardcode path to "dfu-util" + (substitute* "platform_linux/upload_fw_dfu.sh" + (("-f \"\\$\\{platformdir\\}/bin/dfu-util\"") "-z \"\"") + (("\\./dfu-util") (which "dfu-util"))) + #t)) + (delete 'configure) + (replace 'build + ;; Build Axoloti firmware with cross-compiler + (lambda* (#:key inputs #:allow-other-keys) + (let* ((toolchain (assoc-ref inputs "cross-toolchain")) + (headers (string-append + toolchain + "/arm-none-eabi/include:" + toolchain + "/arm-none-eabi/include/arm-none-eabi/armv7e-m"))) + (setenv "CROSS_CPATH" headers) + (setenv "CROSS_CPLUS_INCLUDE_PATH" headers) + (setenv "CROSS_LIBRARY_PATH" + (string-append toolchain + "/arm-none-eabi/lib"))) + (with-directory-excursion "platform_linux" + (zero? (system* "sh" "compile_firmware.sh"))))) + (add-after 'build 'build-java-application + (lambda* (#:key inputs #:allow-other-keys) + (setenv "JAVA_HOME" (assoc-ref inputs "icedtea")) + ;; We want to use our own jar files instead of the pre-built + ;; stuff in lib. So we replace the zipfileset tags in the + ;; build.xml with new ones that reference our jars. + (let* ((build.xml (with-input-from-file "build.xml" + (lambda _ + (xml->sxml #:trim-whitespace? #t)))) + (jars (append-map (match-lambda + (((? (cut string-prefix? "java-" <>) + label) . directory) + (find-files directory "\\.jar$")) + (_ '())) + inputs)) + (classpath (string-join jars ":")) + (fileset (map (lambda (jar) + `(zipfileset (@ (excludes "META-INF/*.SF") + (src ,jar)))) + jars))) + (call-with-output-file "build.xml" + (lambda (port) + (sxml->xml + (pre-post-order + build.xml + `(;; Remove all zipfileset tags from the "jar" tree and + ;; inject our own tags. + (jar . ,(lambda (tag . kids) + `(jar ,@(append-map + (filter (lambda (e) + (not (eq? 'zipfileset (car e))))) + kids) + ,@fileset))) + ;; Skip the "bundle" target (and the "-post-jar" target + ;; that depends on it), because we don't need it and it + ;; confuses sxml->xml. + (target . ,(lambda (tag . kids) + (let ((name ((sxpath '(name *text*)) + (car kids)))) + (if (or (member "bundle" name) + (member "-post-jar" name)) + '() ; skip + `(,tag ,@kids))))) + (*default* . ,(lambda (tag . kids) `(,tag ,@kids))) + (*text* . ,(lambda (_ txt) + (match txt + ;; Remove timestamp. + ("${TODAY}" "(unknown)") + (_ txt)))))) + port))) + + ;; Build it! + (zero? (system* "ant" + (string-append "-Djavac.classpath=" classpath) + "-Dbuild.runtime=true" + "-Dbuild.time=01/01/1970 00:00:00" + "-Djavac.source=1.7" + "-Djavac.target=1.7" + (string-append "-Dtag.short.version=" + ,version)))))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (share (string-append out "/share/axoloti/")) + (doc (string-append share "doc")) + (dir (getcwd)) + ;; These patterns were derived from the "bundle" target of + ;; the build.xml. + (pats '("/doc/[^/]+$" + "/patches/[^/]+/[^/]+$" + "/objects/[^/]+/[^/]+$" + "/firmware/[^/]+$" + "/firmware/STM[^/]+/[^/]+/[^/]+$" + "/firmware/samples/[^/]+$" + "/firmware/build/[^/]+\\.(bin|elf)$" + "/firmware/flasher/[^/]+$" + "/firmware/flasher/flasher_build/[^/]+\\.(bin|elf)$" + "/firmware/mounter/[^/]+$" + "/firmware/mounter/mounter_build/[^/]+\\.(bin|elf)$" + "/chibios/[^/]+$" + "/chibios/boards/ST_STM32F4_DISCOVERY/[^/]+$" + "/chibios/(ext|os|docs)/[^/]+/[^/]+$" + "/CMSIS/[^/]+/[^/]+$" + "/patch/[^/]+/[^/]+$" + "/[^/]+\\.txt$")) + (pattern (string-append + "(" (string-join + (map (cut string-append dir <>) + pats) + "|") ")")) + (files (find-files dir + (lambda (file stat) + (and (eq? 'regular (stat:type stat)) + (string-match pattern file)))))) + (for-each (lambda (file) + (install-file file + (string-append share (dirname file)))) + files) + (copy-recursively "dist/javadoc" doc) + (install-file "dist/Axoloti.jar" share) + + ;; We do this to ensure that this package retains references to + ;; other Java packages' jar files. + (install-file "build.xml" share) + + ;; Create a launcher script + (mkdir (string-append out "/bin")) + (let ((target (string-append out "/bin/Axoloti"))) + (with-output-to-file target + (lambda () + (let* ((dir (string-append (assoc-ref outputs "out") + "/share/axoloti")) + (toolchain (assoc-ref inputs "cross-toolchain")) + (includes (string-append + toolchain + "/arm-none-eabi/include:" + toolchain + "/arm-none-eabi/include/arm-none-eabi/armv7e-m"))) + (display + (string-append "#!" (which "sh") "\n" + "export CROSS_CPATH=" includes "\n" + "export CROSS_CPLUS_INCLUDE_PATH=" includes "\n" + "export CROSS_LIBRARY_PATH=" + toolchain "/arm-none-eabi/lib" "\n" + (which "java") + " -Daxoloti_release=" dir + " -Daxoloti_runtime=" dir + " -jar " dir "/Axoloti.jar"))))) + (chmod target #o555)) + #t))) + (add-after 'install 'strip-jar-timestamps + (assoc-ref ant:%standard-phases 'strip-jar-timestamps))))) + (inputs + `(("icedtea" ,icedtea "jdk") + ("java-simple-xml" ,java-simple-xml) + ("java-rsyntaxtextarea" ,java-rsyntaxtextarea) + ("java-usb4java" ,java-usb4java) + ("java-jsch" ,java-jsch) + ("java-slf4j-api" ,java-slf4j-api) + ("java-jgit" ,java-jgit-4.2) + ;; for the firmware + ("chibios" + ,(origin + (method url-fetch) + (uri "mirror://sourceforge/chibios/ChibiOS_RT%20stable/Version%202.6.9/ChibiOS_2.6.9.zip") + (sha256 + (base32 + "0lb5s8pkj80mqhsy47mmq0lqk34s2a2m3xagzihalvabwd0frhlj")))) + ;; for compiling patches + ("make" ,gnu-make) + ;; for compiling firmware + ("cross-toolchain" ,arm-none-eabi-nano-toolchain-4.9) + ;; for uploading compiled patches and firmware + ("dfu-util" ,dfu-util-for-axoloti))) + (native-inputs + `(("ant" ,ant) + ("zip" ,zip) ; for repacking the jar + ("unzip" ,unzip))) + (home-page "http://axoloti.com") + (synopsis "Audio development environment for the Axoloti core board") + (description + "The Axoloti patcher offers a “patcher” environment similar to Pure Data +for sketching digital audio algorithms. The patches run on a standalone +powerful microcontroller board: Axoloti Core.") + (license license:gpl3+))) diff --git a/gnu/packages/patches/libusb-for-axoloti.patch b/gnu/packages/patches/libusb-for-axoloti.patch new file mode 100644 index 000000000..2c07d767d --- /dev/null +++ b/gnu/packages/patches/libusb-for-axoloti.patch @@ -0,0 +1,14 @@ +diff -rp -u4 libusb-1.0.19-orig/libusb/descriptor.c libusb-1.0.19/libusb/descriptor.c +--- libusb-1.0.19-orig/libusb/descriptor.c 2015-05-12 00:15:19 +0200 ++++ libusb-1.0.19/libusb/descriptor.c 2015-05-12 00:17:09 +0200 +@@ -1181,9 +1181,9 @@ int API_EXPORTED libusb_get_string_descr + if (tbuf[1] != LIBUSB_DT_STRING) + return LIBUSB_ERROR_IO; + + if (tbuf[0] > r) +- return LIBUSB_ERROR_IO; ++ tbuf[0] = r; + + for (di = 0, si = 2; si < tbuf[0]; si += 2) { + if (di >= (length - 1)) + break; -- 2.12.2