summary refs log tree commit diff
path: root/pkgs/development/arduino/arduino-core
diff options
context:
space:
mode:
authorJonathan Glines <auntieNeo@gmail.com>2016-12-02 03:31:01 -0700
committerMoritz U <moritz@tarn-vedra.de>2016-12-02 11:31:01 +0100
commit538ec0cc929684058a0dda7587446afd2ab351dc (patch)
treef7e0483c563bb0a3748233c6e51993a95d8ef418 /pkgs/development/arduino/arduino-core
parentda3d8d077d3533a493fd2ae6554a7962a3d831b4 (diff)
downloadnixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar.gz
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar.bz2
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar.lz
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar.xz
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.tar.zst
nixpkgs-538ec0cc929684058a0dda7587446afd2ab351dc.zip
teensyduino: init at 1.31 (#20807)
Diffstat (limited to 'pkgs/development/arduino/arduino-core')
-rw-r--r--pkgs/development/arduino/arduino-core/default.nix112
1 files changed, 107 insertions, 5 deletions
diff --git a/pkgs/development/arduino/arduino-core/default.nix b/pkgs/development/arduino/arduino-core/default.nix
index ccf6dac895c..fbc139c314f 100644
--- a/pkgs/development/arduino/arduino-core/default.nix
+++ b/pkgs/development/arduino/arduino-core/default.nix
@@ -1,10 +1,21 @@
 { stdenv, lib, fetchFromGitHub, fetchurl, jdk, ant
 , libusb, libusb1, unzip, zlib, ncurses, readline
-, withGui ? false, gtk2 ? null
+, withGui ? false, gtk2 ? null, withTeensyduino ? false
+  /* Packages needed for Teensyduino */
+, upx, fontconfig, xorg, gcc, xdotool, xvfb_run
+, atk, glib, pango, gdk_pixbuf, libpng12, expat, freetype
 }:
 
 assert withGui -> gtk2 != null;
-
+assert withTeensyduino -> withGui;
+
+# TODO: Teensyduino is disabled for i686-linux due to an indefinite hang in the
+# xdotool script; the cause of this hang is not yet known.
+# TODO: There is a fair chance that Teensyduino works with arm-linux, but it
+# has not yet been tested.
+if withTeensyduino && (stdenv.system != "x86_64-linux") then throw
+  "Teensyduino is only supported on x86_64-linux at this time (patches welcome)."
+else
 let
   externalDownloads = import ./downloads.nix {inherit fetchurl; inherit (lib) optionalAttrs; inherit (stdenv) system;};
   # Some .so-files are later copied from .jar-s to $HOME, so patch them beforehand
@@ -14,10 +25,37 @@ let
   ;
   # abiVersion 6 is default, but we need 5 for `avrdude_bin` executable
   ncurses5 = ncurses.override { abiVersion = "5"; };
+
+  teensy_libpath = stdenv.lib.makeLibraryPath [
+    atk
+    expat
+    fontconfig
+    freetype
+    gcc.cc.lib
+    gdk_pixbuf
+    glib
+    gtk2
+    libpng12
+    libusb
+    pango
+    xorg.libSM
+    xorg.libX11
+    xorg.libXext
+    xorg.libXft
+    xorg.libXinerama
+    zlib
+  ];
+  teensy_architecture =
+      lib.optionalString (stdenv.system == "x86_64-linux") "linux64"
+      + lib.optionalString (stdenv.system == "i686-linux") "linux32"
+      + lib.optionalString (stdenv.system == "arm-linux") "linuxarm";
+
+  flavor = (if withTeensyduino then "teensyduino" else "arduino")
+             + stdenv.lib.optionalString (!withGui) "-core";
 in
 stdenv.mkDerivation rec {
   version = "1.6.12";
-  name = "arduino${stdenv.lib.optionalString (withGui == false) "-core"}-${version}";
+  name = "${flavor}-${version}";
 
   src = fetchFromGitHub {
     owner = "arduino";
@@ -26,7 +64,19 @@ stdenv.mkDerivation rec {
     sha256 = "0rz8dv1mncwx2wkafakxqdi2y0rq3f72fr57cg0z5hgdgdm89lkh";
   };
 
-  buildInputs = [ jdk ant libusb libusb1 unzip zlib ncurses5 readline ];
+  teensyduino_src = fetchurl {
+    url = "http://www.pjrc.com/teensy/td_131/TeensyduinoInstall.${teensy_architecture}";
+    sha256 =
+      lib.optionalString ("${teensy_architecture}" == "linux64")
+        "1q4wv6s0900hyv9z1mjq33fr2isscps4q3bsy0h12wi3l7ir94g9"
+      + lib.optionalString ("${teensy_architecture}" == "linux32")
+        "06fl951f44avqyqim5qmy73siylbqcnsmz55zmj2dzhgf4sflkvc"
+      + lib.optionalString ("${teensy_architecture}" == "linuxarm")
+        "0ldf33w8wkqwklcj8fn4p22f23ibpwpf7873dc6i2jfmmbx0yvxn";
+  };
+
+  buildInputs = [ jdk ant libusb libusb1 unzip zlib ncurses5 readline
+  ] ++ stdenv.lib.optionals withTeensyduino [ upx xvfb_run xdotool ];
   downloadSrcList = builtins.attrValues externalDownloads;
   downloadDstList = builtins.attrNames externalDownloads;
 
@@ -75,6 +125,50 @@ stdenv.mkDerivation rec {
         --replace '<BINARY_LOCATION>' "$out/bin/arduino" \
         --replace '<ICON_NAME>' "$out/share/arduino/icons/128x128/apps/arduino.png"
     ''}
+
+    ${stdenv.lib.optionalString withTeensyduino ''
+      # Extract and patch the Teensyduino installer
+      cp ${teensyduino_src} ./TeensyduinoInstall.${teensy_architecture}
+      chmod +w ./TeensyduinoInstall.${teensy_architecture}
+      upx -d ./TeensyduinoInstall.${teensy_architecture}
+      patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+          --set-rpath "${teensy_libpath}" \
+          ./TeensyduinoInstall.${teensy_architecture}
+      chmod +x ./TeensyduinoInstall.${teensy_architecture}
+
+      # Run the GUI-only installer in a virtual X server
+      # Script thanks to AUR package. See:
+      #   <https://aur.archlinux.org/packages/teensyduino/>
+      echo "Running Teensyduino installer..."
+      # Trick the GUI into using HOME as the install directory.
+      export HOME=$out/share/arduino
+      # Run the installer in a virtual X server in memory.
+      xvfb-run -n 99 ./TeensyduinoInstall.${teensy_architecture} &
+      sleep 4
+      echo "Waiting for Teensyduino to install (about 1 minute)..."
+      # Control the installer GUI with xdotool.
+      DISPLAY=:99 xdotool search --class "teensyduino" \
+        windowfocus \
+        key space sleep 1 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key space sleep 1 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key Tab sleep 0.4 \
+        key space sleep 1 \
+        key Tab sleep 0.4 \
+        key space sleep 35 \
+        key space sleep 2 &
+      # Wait for xdotool to terminate and swallow the inevitable XIO error
+      wait $! || true
+
+      # Check for successful installation
+      [ -d $out/share/arduino/hardware/teensy ] || exit 1
+    ''}
   '';
 
   # So we don't accidentally mess with firmware files
@@ -101,6 +195,14 @@ stdenv.mkDerivation rec {
     # avrdude_bin is linked against libtinfo.so.5
     mkdir $out/lib/
     ln -s ${lib.makeLibraryPath [ncurses5]}/libncursesw.so.5 $out/lib/libtinfo.so.5
+
+    ${stdenv.lib.optionalString withTeensyduino ''
+      # Patch the Teensy loader binary
+      patchelf --debug \
+          --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+          --set-rpath "${teensy_libpath}" \
+          $out/share/arduino/hardware/tools/teensy
+    ''}
   '';
 
   meta = with stdenv.lib; {
@@ -108,6 +210,6 @@ stdenv.mkDerivation rec {
     homepage = http://arduino.cc/;
     license = stdenv.lib.licenses.gpl2;
     platforms = platforms.linux;
-    maintainers = with maintainers; [ antono robberer bjornfor ];
+    maintainers = with maintainers; [ antono auntie robberer bjornfor ];
   };
 }