nixpkgs/pkgs/development/arduino/arduino-core/default.nix

255 lines
9.0 KiB
Nix
Raw Normal View History

2020-05-10 11:05:49 +01:00
{ stdenv
, lib
, fetchFromGitHub
, fetchurl
, jdk
, ant
, libusb-compat-0_1
, libusb1
, unzip
, zlib
, ncurses
, readline
, withGui ? false
2020-12-24 13:11:28 +00:00
, gtk3 ? null
, wrapGAppsHook
2020-05-10 11:05:49 +01:00
, withTeensyduino ? false
2016-12-02 10:31:01 +00:00
/* Packages needed for Teensyduino */
2020-05-10 11:05:49 +01:00
, upx
, fontconfig
, xorg
, gcc
, atk
, glib
, pango
, gdk-pixbuf
, gtk2
2020-05-10 11:05:49 +01:00
, libpng12
, expat
, freetype
, cairo
, udev
}:
2020-12-24 13:11:28 +00:00
assert withGui -> gtk3 != null && wrapGAppsHook != null;
2016-12-02 10:31:01 +00:00
assert withTeensyduino -> withGui;
let
externalDownloads = import ./downloads.nix {
inherit fetchurl;
inherit (lib) optionalAttrs;
inherit (stdenv.hostPlatform) system;
};
# Some .so-files are later copied from .jar-s to $HOME, so patch them beforehand
patchelfInJars =
2020-05-10 11:05:49 +01:00
lib.optional (stdenv.hostPlatform.system == "aarch64-linux") { jar = "share/arduino/lib/jssc-2.8.0-arduino4.jar"; file = "libs/linux/libjSSC-2.8_aarch64.so"; }
++ lib.optional (builtins.match "armv[67]l-linux" stdenv.hostPlatform.system != null) { jar = "share/arduino/lib/jssc-2.8.0-arduino4.jar"; file = "libs/linux/libjSSC-2.8_armhf.so"; }
++ lib.optional (stdenv.hostPlatform.system == "x86_64-linux") { jar = "share/arduino/lib/jssc-2.8.0-arduino4.jar"; file = "libs/linux/libjSSC-2.8_x86_64.so"; }
++ lib.optional (stdenv.hostPlatform.system == "i686-linux") { jar = "share/arduino/lib/jssc-2.8.0-arduino4.jar"; file = "libs/linux/libjSSC-2.8_x86.so"; }
;
# abiVersion 6 is default, but we need 5 for `avrdude_bin` executable
ncurses5 = ncurses.override { abiVersion = "5"; };
teensy_libpath = lib.makeLibraryPath [
2016-12-02 10:31:01 +00:00
atk
cairo
2016-12-02 10:31:01 +00:00
expat
fontconfig
freetype
gcc.cc.lib
2019-05-22 12:03:39 +01:00
gdk-pixbuf
2016-12-02 10:31:01 +00:00
glib
gtk2
2016-12-02 10:31:01 +00:00
libpng12
2020-04-28 04:29:39 +01:00
libusb-compat-0_1
2016-12-02 10:31:01 +00:00
pango
udev
2016-12-02 10:31:01 +00:00
xorg.libSM
xorg.libX11
xorg.libXext
xorg.libXft
xorg.libXinerama
xorg.libXxf86vm
2016-12-02 10:31:01 +00:00
zlib
];
2020-06-09 16:38:39 +01:00
teensy_architecture = if stdenv.hostPlatform.isx86_32 then "linux32"
else if stdenv.hostPlatform.isx86_64 then "linux64"
else if stdenv.hostPlatform.isAarch64 then "linuxaarch64"
2020-06-09 16:38:39 +01:00
else if stdenv.hostPlatform.isAarch32 then "linuxarm"
else throw "${stdenv.hostPlatform.system} is not supported in teensy";
2016-12-02 10:31:01 +00:00
flavor = (if withTeensyduino then "teensyduino" else "arduino")
+ lib.optionalString (!withGui) "-core";
in
2012-11-28 01:55:24 +00:00
stdenv.mkDerivation rec {
2020-12-24 13:09:49 +00:00
version = "1.8.13";
2016-12-02 10:31:01 +00:00
name = "${flavor}-${version}";
2012-11-28 01:55:24 +00:00
src = fetchFromGitHub {
owner = "arduino";
repo = "Arduino";
2019-09-09 00:38:31 +01:00
rev = version;
2020-12-24 13:09:49 +00:00
sha256 = "0qg3qyj1b7wbaw2rsfly7nf3115h26nskl4ggrn6plhx272ni84p";
2012-11-28 01:55:24 +00:00
};
2020-12-25 08:35:05 +00:00
teensyduino_version = "153";
2016-12-02 10:31:01 +00:00
teensyduino_src = fetchurl {
url = "https://www.pjrc.com/teensy/td_${teensyduino_version}/TeensyduinoInstall.${teensy_architecture}";
2020-06-09 16:38:39 +01:00
sha256 = {
2020-12-25 08:35:05 +00:00
linux64 = "02qgsj4h4zrjxkcclx7clsqbqd699kg0dq1xxa9hbj3vfnddjv1f";
linux32 = "14xaff8xj176ih8ifdvxsly5xgjjm82dqbn7lqq81a43i0svjjyn";
linuxarm = "0xpg9axa6dqyhccm9cpvsv2al7rgwy4gv2l8b2kffvn974dl5759";
linuxaarch64 = "1lyn4zy4l5mml3c19fw6i2pk1ypnq6mgjmxmzk9d54wpf6n3j5dk";
2020-06-09 16:38:39 +01:00
}.${teensy_architecture} or (throw "No arduino binaries for ${teensy_architecture}");
};
# Used because teensyduino requires jars be a specific size
arduino_dist_src = fetchurl {
2020-12-24 13:09:49 +00:00
url = "https://downloads.arduino.cc/arduino-${version}-${teensy_architecture}.tar.xz";
sha256 =
2020-06-09 16:38:39 +01:00
{
2020-12-24 13:09:49 +00:00
linux64 = "1bdlk51dqiyg5pw23hs8rfv8nrjqy0jqfl89h1466ahahpnd080v";
linux32 = "0mgsw9wpwv1pgs2jslzflh7zf4ggqjgcd55hmdzrj0dvgkyw4cr2";
linuxarm = "08n4lpak3i7yfyi0085j4nq14gb2n7zx85wl9drp8gaavxnfbp5f";
linuxaarch64 = "0m4nhykzknm2hdpz1fhr2hbpncry53kvzs9y5lgj7rx3sy6ygbh7";
2020-06-09 16:38:39 +01:00
}.${teensy_architecture} or (throw "No arduino binaries for ${teensy_architecture}");
2016-12-02 10:31:01 +00:00
};
# the glib setup hook will populate GSETTINGS_SCHEMAS_PATH,
# wrapGAppHooks (among other things) adds it to XDG_DATA_DIRS
# so 'save as...' works:
nativeBuildInputs = [ glib wrapGAppsHook unzip ];
2020-05-10 11:05:49 +01:00
buildInputs = [
jdk
ant
libusb-compat-0_1
libusb1
zlib
ncurses5
readline
] ++ lib.optionals withTeensyduino [ upx ];
downloadSrcList = builtins.attrValues externalDownloads;
downloadDstList = builtins.attrNames externalDownloads;
2012-11-28 01:55:24 +00:00
buildPhase = ''
# Copy pre-downloaded files to proper locations
download_src=($downloadSrcList)
download_dst=($downloadDstList)
while [[ "''${#download_src[@]}" -ne 0 ]]; do
file_src=''${download_src[0]}
file_dst=''${download_dst[0]}
mkdir -p $(dirname $file_dst)
download_src=(''${download_src[@]:1})
download_dst=(''${download_dst[@]:1})
cp -v $file_src $file_dst
done
2017-06-01 00:05:18 +01:00
# Deliberately break build.xml's download statement in order to cause
# an error if anything needed is missing from download.nix.
2020-05-10 11:05:49 +01:00
substituteInPlace build/build.xml \
--replace 'ignoreerrors="true"' 'ignoreerrors="false"'
2017-06-01 00:05:18 +01:00
cd ./arduino-core && ant
2019-05-22 12:03:39 +01:00
cd ../build && ant
2012-11-28 01:55:24 +00:00
cd ..
'';
# This will be patched into `arduino` wrapper script
# Java loads gtk dynamically, so we need to provide it using LD_LIBRARY_PATH
2020-12-24 13:11:28 +00:00
dynamicLibraryPath = lib.makeLibraryPath [ gtk3 ];
2020-05-10 11:05:49 +01:00
javaPath = lib.makeBinPath [ jdk ];
# Everything else will be patched into rpath
2020-05-10 11:05:49 +01:00
rpath = (lib.makeLibraryPath [ zlib libusb-compat-0_1 libusb1 readline ncurses5 stdenv.cc.cc ]);
2012-11-28 01:55:24 +00:00
installPhase = ''
mkdir -p $out/share/arduino
cp -r ./build/linux/work/* "$out/share/arduino/"
echo -n ${version} > $out/share/arduino/lib/version.txt
${lib.optionalString withGui ''
mkdir -p $out/bin
substituteInPlace $out/share/arduino/arduino \
--replace "JAVA=java" "JAVA=$javaPath/java" \
--replace "LD_LIBRARY_PATH=" "LD_LIBRARY_PATH=$dynamicLibraryPath:"
ln -sr "$out/share/arduino/arduino" "$out/bin/arduino"
cp -r build/shared/icons $out/share/arduino
mkdir -p $out/share/applications
cp build/linux/dist/desktop.template $out/share/applications/arduino.desktop
substituteInPlace $out/share/applications/arduino.desktop \
--replace '<BINARY_LOCATION>' "$out/bin/arduino" \
--replace '<ICON_NAME>' "$out/share/arduino/icons/128x128/apps/arduino.png"
''}
2016-12-02 10:31:01 +00:00
${lib.optionalString withTeensyduino ''
# Back up the original jars
mv $out/share/arduino/lib/arduino-core.jar $out/share/arduino/lib/arduino-core.jar.bak
mv $out/share/arduino/lib/pde.jar $out/share/arduino/lib/pde.jar.bak
# Extract jars from the arduino distributable package
mkdir arduino_dist
cd arduino_dist
tar xfJ ${arduino_dist_src} arduino-${version}/lib/arduino-core.jar arduino-${version}/lib/pde.jar
cd ..
# Replace the built jars with the official arduino jars
mv arduino_dist/arduino-${version}/lib/{arduino-core,pde}.jar $out/share/arduino/lib/
# Delete the directory now that the jars are copied out
rm -r arduino_dist
2016-12-02 10:31:01 +00:00
# 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}
./TeensyduinoInstall.${teensy_architecture} --dir=$out/share/arduino
2016-12-02 10:31:01 +00:00
# Check for successful installation
[ -d $out/share/arduino/hardware/teensy ] || exit 1
# After the install, copy the built jars back
mv $out/share/arduino/lib/arduino-core.jar.bak $out/share/arduino/lib/arduino-core.jar
mv $out/share/arduino/lib/pde.jar.bak $out/share/arduino/lib/pde.jar
2016-12-02 10:31:01 +00:00
''}
'';
# So we don't accidentally mess with firmware files
dontStrip = true;
dontPatchELF = true;
preFixup = ''
for file in $(find $out -type f \( -perm /0111 -o -name \*.so\* \) ); do
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$file" || true
patchelf --set-rpath ${rpath}:$out/lib $file || true
done
${lib.concatMapStringsSep "\n"
2020-05-10 11:05:49 +01:00
({ jar, file }:
''
2020-05-10 11:05:49 +01:00
jar xvf $out/${jar} ${file}
patchelf --set-rpath $rpath ${file}
jar uvf $out/${jar} ${file}
rm -f ${file}
''
)
2020-05-10 11:05:49 +01:00
patchelfInJars}
# avrdude_bin is linked against libtinfo.so.5
mkdir $out/lib/
2020-05-10 11:05:49 +01:00
ln -s ${lib.makeLibraryPath [ ncurses5 ]}/libtinfo.so.5 $out/lib/libtinfo.so.5
2016-12-02 10:31:01 +00:00
${lib.optionalString withTeensyduino ''
2016-12-02 10:31:01 +00:00
# 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{,_ports,_reboot,_restart,_serialmon}
2016-12-02 10:31:01 +00:00
''}
2012-11-28 01:55:24 +00:00
'';
meta = with lib; {
description = "Open-source electronics prototyping platform";
homepage = "http://arduino.cc/";
2017-06-01 00:05:18 +01:00
license = if withTeensyduino then licenses.unfreeRedistributable else licenses.gpl2;
2016-08-11 04:29:58 +01:00
platforms = platforms.linux;
2019-09-06 15:30:12 +01:00
maintainers = with maintainers; [ antono auntie robberer bjornfor bergey ];
};
2012-11-28 01:55:24 +00:00
}