Initial commit
This commit is contained in:
commit
b2afa2da8c
7
flake.lock
generated
Normal file
7
flake.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"nodes": {
|
||||
"root": {}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
21
flake.nix
Normal file
21
flake.nix
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
description = "Wrapper for arduino-cli";
|
||||
|
||||
outputs = { self }: {
|
||||
mkArduinoPackageOverlay = packageIndexFile: (self: super: {
|
||||
arduinoPackages = self.lib.recursiveUpdate (super.arduinoPackages or {}) (self.callPackage ./packages.nix {
|
||||
packageIndex = builtins.fromJSON (builtins.readFile packageIndexFile);
|
||||
});
|
||||
});
|
||||
|
||||
mkArduinoLibraryOverlay = libraryIndexFile: (self: super: {
|
||||
arduinoLibraries = self.lib.recursiveUpdate (super.arduinoLibraries or {}) (self.callPackage ./libraries.nix {
|
||||
libraryIndex = builtins.fromJSON (builtins.readFile libraryIndexFile);
|
||||
});
|
||||
});
|
||||
|
||||
overlay = (self: super: {
|
||||
wrapArduinoCLI = self.callPackage ./wrap-arduino-cli.nix { };
|
||||
});
|
||||
};
|
||||
}
|
32
lib.nix
Normal file
32
lib.nix
Normal file
@ -0,0 +1,32 @@
|
||||
{ lib }:
|
||||
let
|
||||
alt = a: b: if a == null then b else a;
|
||||
in
|
||||
with builtins; rec {
|
||||
latestVersion = attrs: (builtins.head (builtins.sort (a: b: (builtins.compareVersions a.version b.version) == 1) (builtins.attrValues (builtins.mapAttrs (version: value: { inherit version value; }) attrs)))).value;
|
||||
selectSystem = system: systems:
|
||||
if system == "aarch64-darwin" then
|
||||
alt (lib.findFirst ({host, ...}: (match "arm64-apple-darwin.*" host) != null) null systems) (selectSystem "x86_64-darwin" systems)
|
||||
else if system == "x86_64-darwin" then
|
||||
alt (lib.findFirst ({host, ...}: (match "x86_64-apple-darwin.*" host) != null) null systems) (selectSystem "i686-darwin" systems)
|
||||
else if system == "i686-darwin" then
|
||||
lib.findFirst ({host, ...}: (match "i[3456]86-apple-darwin.*" host) != null) null systems
|
||||
else if system == "aarch64-linux" then
|
||||
lib.findFirst ({host, ...}: (match "(aarch64|arm64)-linux-gnu" host) != null) null systems
|
||||
else if system == "x86_64-linux" then
|
||||
lib.findFirst ({host, ...}: (match "x86_64-.*linux-gnu" host) != null) null systems
|
||||
else null;
|
||||
convertHash = hash: let
|
||||
m = (match "(SHA-256|SHA-1|MD5):(.*)" hash);
|
||||
algo = elemAt m 0;
|
||||
h = elemAt m 1;
|
||||
in
|
||||
if m == null then
|
||||
throw "Unsupported hash format ${hash}"
|
||||
else if algo == "SHA-256" then
|
||||
{ sha256 = h; }
|
||||
else if algo == "SHA-1" then
|
||||
{ sha1 = h; }
|
||||
else
|
||||
{ md5 = h; };
|
||||
}
|
24
libraries.nix
Normal file
24
libraries.nix
Normal file
@ -0,0 +1,24 @@
|
||||
{ fetchzip, stdenv, lib, libraryIndex, pkgsBuildHost, pkgs, arduinoPackages }:
|
||||
|
||||
with builtins;
|
||||
let
|
||||
inherit (pkgs.callPackage ./lib.nix {}) convertHash;
|
||||
|
||||
libraries = mapAttrs (name: versions: listToAttrs (map ({version, url, checksum, ...}: {
|
||||
name = version;
|
||||
value = stdenv.mkDerivation {
|
||||
pname = name;
|
||||
inherit version;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p "$out/libraries/$pname"
|
||||
cp -R * "$out/libraries/$pname/"
|
||||
'';
|
||||
nativeBuildInputs = [ pkgs.unzip ];
|
||||
src = fetchurl ({
|
||||
url = url;
|
||||
} // (convertHash checksum));
|
||||
};
|
||||
}) versions)) (groupBy ({ name, ... }: name) libraryIndex.libraries);
|
||||
in
|
||||
libraries
|
80
packages.nix
Normal file
80
packages.nix
Normal file
@ -0,0 +1,80 @@
|
||||
# From tools.go in arduino-cli
|
||||
# regexpLinuxArm = regexp.MustCompile("arm.*-linux-gnueabihf")
|
||||
# regexpLinuxArm64 = regexp.MustCompile("(aarch64|arm64)-linux-gnu")
|
||||
# regexpLinux64 = regexp.MustCompile("x86_64-.*linux-gnu")
|
||||
# regexpLinux32 = regexp.MustCompile("i[3456]86-.*linux-gnu")
|
||||
# regexpWindows32 = regexp.MustCompile("i[3456]86-.*(mingw32|cygwin)")
|
||||
# regexpWindows64 = regexp.MustCompile("(amd64|x86_64)-.*(mingw32|cygwin)")
|
||||
# regexpMac64 = regexp.MustCompile("x86_64-apple-darwin.*")
|
||||
# regexpMac32 = regexp.MustCompile("i[3456]86-apple-darwin.*")
|
||||
# regexpMacArm64 = regexp.MustCompile("arm64-apple-darwin.*")
|
||||
# regexpFreeBSDArm = regexp.MustCompile("arm.*-freebsd[0-9]*")
|
||||
# regexpFreeBSD32 = regexp.MustCompile("i?[3456]86-freebsd[0-9]*")
|
||||
# regexpFreeBSD64 = regexp.MustCompile("amd64-freebsd[0-9]*")
|
||||
|
||||
{ fetchzip, stdenv, lib, packageIndex, pkgsBuildHost, pkgs, arduinoPackages }:
|
||||
|
||||
with builtins;
|
||||
let
|
||||
inherit (pkgsBuildHost.xorg) lndir;
|
||||
inherit (pkgs.callPackage ./lib.nix {}) selectSystem convertHash;
|
||||
|
||||
# Tools are installed in $platform_name/tools/$name/$version
|
||||
tools = listToAttrs (map ({ name, tools, ... }: {
|
||||
inherit name;
|
||||
value = let platformName = name; in mapAttrs (_: versions: listToAttrs (map ({name, version, systems, ...}: {
|
||||
name = version;
|
||||
value = let
|
||||
system = selectSystem stdenv.hostPlatform.system systems;
|
||||
in
|
||||
if system == null then
|
||||
throw "Unsupported platform ${stdenv.hostPlatform.system}"
|
||||
else
|
||||
stdenv.mkDerivation {
|
||||
pname = "${platformName}-${name}";
|
||||
inherit version;
|
||||
|
||||
dirName = "packages/${platformName}/tools/${name}/${version}";
|
||||
installPhase = ''
|
||||
mkdir -p "$out/$dirName"
|
||||
cp -R * "$out/$dirName/"
|
||||
'';
|
||||
nativeBuildInputs = [ pkgs.unzip ];
|
||||
src = fetchurl ({
|
||||
url = system.url;
|
||||
} // (convertHash system.checksum));
|
||||
};
|
||||
}) versions)) (groupBy ({ name, ... }: name) tools);
|
||||
}) packageIndex.packages);
|
||||
|
||||
# Platform are installed in $platform_name/hardware/$architecture/$version
|
||||
platforms = listToAttrs (map ({ name, platforms, ... }: {
|
||||
inherit name;
|
||||
value = mapAttrs (architecture: versions: listToAttrs (map ({version, url, checksum, toolsDependencies ? [], ...}: {
|
||||
name = version;
|
||||
value = stdenv.mkDerivation {
|
||||
pname = "${name}-${architecture}";
|
||||
inherit version;
|
||||
dirName = "packages/${name}/hardware/${architecture}/${version}";
|
||||
|
||||
toolsDependencies = map ({packager, name, version}: arduinoPackages.tools.${packager}.${name}.${version}) toolsDependencies;
|
||||
passAsFile = [ "toolsDependencies" ];
|
||||
installPhase = ''
|
||||
mkdir -p "$out/$dirName"
|
||||
cp -R * "$out/$dirName/"
|
||||
|
||||
for i in $(cat $toolsDependenciesPath); do
|
||||
${lndir}/bin/lndir -silent $i $out
|
||||
done
|
||||
'';
|
||||
nativeBuildInputs = [ pkgs.unzip ];
|
||||
src = fetchurl ({
|
||||
url = url;
|
||||
} // (convertHash checksum));
|
||||
};
|
||||
}) versions)) (groupBy ({ architecture, ... }: architecture) platforms);
|
||||
}) packageIndex.packages);
|
||||
in
|
||||
{
|
||||
inherit tools platforms;
|
||||
}
|
35
wrap-arduino-cli.nix
Normal file
35
wrap-arduino-cli.nix
Normal file
@ -0,0 +1,35 @@
|
||||
{ lib, pkgs }:
|
||||
let
|
||||
wrap = {
|
||||
packages ? []
|
||||
, libraries ? []
|
||||
}:
|
||||
let
|
||||
inherit (pkgs.callPackage ./lib.nix {}) latestVersion;
|
||||
|
||||
builtinPackages = (map latestVersion (builtins.attrValues pkgs.arduinoPackages.tools.builtin));
|
||||
|
||||
libPath = pkgs.symlinkJoin {
|
||||
name = "arduino-libraries";
|
||||
paths = libraries;
|
||||
};
|
||||
|
||||
dataPath = pkgs.symlinkJoin {
|
||||
name = "arduino-data";
|
||||
paths = builtinPackages ++ packages ++ [
|
||||
# Add some dummy files to keep the CLI happy
|
||||
(pkgs.writeTextDir "inventory.yaml" (builtins.toJSON {}))
|
||||
(pkgs.writeTextDir "package_index.json" (builtins.toJSON {packages = [];}))
|
||||
(pkgs.writeTextDir "library_index.json" (builtins.toJSON {libraries = [];}))
|
||||
];
|
||||
};
|
||||
in
|
||||
pkgs.runCommand "arduino-cli-wrapped" {
|
||||
buildInputs = [ pkgs.makeWrapper ];
|
||||
meta.mainProgram = "arduino-cli";
|
||||
} ''
|
||||
makeWrapper ${pkgs.arduino-cli}/bin/arduino-cli $out/bin/arduino-cli --set ARDUINO_UPDATER_ENABLE_NOTIFICATION false --set ARDUINO_DIRECTORIES_DATA ${dataPath} --set ARDUINO_DIRECTORIES_USER ${libPath}
|
||||
'';
|
||||
in
|
||||
lib.makeOverridable wrap
|
||||
|
Loading…
x
Reference in New Issue
Block a user