- nix with flakes suppport
Optional:
Copy flake.nix and flake.lock to the root folder of your Ledger projects.
- Run
nix develop
- Also copy
.envrcand rundirenv allow
| use flake |
Optional:
Copy flake.nix and flake.lock to the root folder of your Ledger projects.
nix develop.envrc and run direnv allow| { | |
| "nodes": { | |
| "nanos-secure-sdk": { | |
| "flake": false, | |
| "locked": { | |
| "narHash": "sha256-Qi7NFTgrXAXU+wwblN1VUJtZczhI8h5eslwlowsaivo=", | |
| "type": "tarball", | |
| "url": "https://github.com/LedgerHQ/nanos-secure-sdk/archive/refs/tags/2.0.0-1.tar.gz" | |
| }, | |
| "original": { | |
| "type": "tarball", | |
| "url": "https://github.com/LedgerHQ/nanos-secure-sdk/archive/refs/tags/2.0.0-1.tar.gz" | |
| } | |
| }, | |
| "nanox-secure-sdk": { | |
| "flake": false, | |
| "locked": { | |
| "narHash": "sha256-/vmM7DFdG2a7+lACMPM3yya+5WkRtbangcJQOa9d0uE=", | |
| "type": "tarball", | |
| "url": "https://github.com/LedgerHQ/nanox-secure-sdk/archive/refs/tags/1.3.0.tar.gz" | |
| }, | |
| "original": { | |
| "type": "tarball", | |
| "url": "https://github.com/LedgerHQ/nanox-secure-sdk/archive/refs/tags/1.3.0.tar.gz" | |
| } | |
| }, | |
| "nixpkgs": { | |
| "locked": { | |
| "lastModified": 1624172050, | |
| "narHash": "sha256-sLQEhZ6Ffjx0J1AJxHQDY4y7XWKxI/Zgm/hQJjkjZ6M=", | |
| "owner": "NixOS", | |
| "repo": "nixpkgs", | |
| "rev": "6613a30c5e3ee59753181512b4bedd4121569925", | |
| "type": "github" | |
| }, | |
| "original": { | |
| "id": "nixpkgs", | |
| "ref": "nixos-21.05", | |
| "type": "indirect" | |
| } | |
| }, | |
| "root": { | |
| "inputs": { | |
| "nanos-secure-sdk": "nanos-secure-sdk", | |
| "nanox-secure-sdk": "nanox-secure-sdk", | |
| "nixpkgs": "nixpkgs" | |
| } | |
| } | |
| }, | |
| "root": "root", | |
| "version": 7 | |
| } |
| { | |
| description = "Ledger development environment"; | |
| inputs = { | |
| nixpkgs.url = "nixpkgs/nixos-21.05"; | |
| # https://ledger.readthedocs.io/en/latest/userspace/setup.html#setting-up-the-sdk | |
| nanos-secure-sdk.url = "https://github.com/LedgerHQ/nanos-secure-sdk/archive/refs/tags/2.0.0-1.tar.gz"; | |
| nanos-secure-sdk.flake = false; | |
| nanox-secure-sdk.url = "https://github.com/LedgerHQ/nanox-secure-sdk/archive/refs/tags/1.3.0.tar.gz"; | |
| nanox-secure-sdk.flake = false; | |
| }; | |
| outputs = { self, nixpkgs, nanos-secure-sdk, nanox-secure-sdk }: | |
| let | |
| inherit (builtins) pathExists readFile; | |
| inherit (pkgs) fetchurl lib mkShell stdenv runCommand runCommandCC; | |
| system = "x86_64-linux"; | |
| pkgs = import nixpkgs { | |
| inherit system; | |
| # exposes packages from ‹outputs.packages› as ‹pkgs.custom› | |
| overlays = [ self.overlay ]; | |
| }; | |
| # File containing the private key to custom developer certificate | |
| # https://ledger.readthedocs.io/en/latest/userspace/debugging.html#pin-bypass | |
| privateKeyPath = ./.private.key; | |
| # The currently used ‹BOLOS_SDK› | |
| bolos-sdk = nanos-secure-sdk; | |
| # We need a ‹clang› with ROPI support | |
| clangTar = fetchurl { | |
| url = https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz; | |
| sha256 = "0hrqwsdiv8258zgx9splh7v1hx68dp56inxpwc1nys001hm5jpxj"; | |
| }; | |
| in { | |
| packages."${system}" = { | |
| clang = runCommandCC "bolos-env-clang-10" { | |
| buildInputs = with pkgs; [ | |
| autoPatchelfHook | |
| # using ncurses5 throws "warning", but meh: | |
| # > libtinfo.so.5: no version information available | |
| ncurses5 | |
| gcc.cc.lib | |
| python | |
| zlib | |
| libxml2 | |
| libedit | |
| ]; | |
| } '' | |
| mkdir -p "$out" tmp | |
| tar xavf '${clangTar}' --strip-components=1 -C "$out" | |
| rm -f $out/bin/clang-query | |
| ln -s ${pkgs.libedit}/lib/libedit.so tmp/libedit.so.2 | |
| addAutoPatchelfSearchPath $out/lib | |
| addAutoPatchelfSearchPath tmp | |
| autoPatchelf $out | |
| ''; | |
| gcc = pkgs.gcc-arm-embedded; | |
| bolos-env = runCommand "bolos-env" {} '' | |
| mkdir -p "$out" | |
| ln -s '${pkgs.custom.clang}' "$out/clang-arm-fropi" | |
| ln -s '${pkgs.custom.gcc}' "$out/gcc-arm-none-eabi-5_3-2016q1" | |
| '' // { | |
| inherit (pkgs.custom) clang gcc; | |
| }; | |
| nodejs = stdenv.mkDerivation rec { | |
| pname = "nodejs"; | |
| version = "12.16.2"; | |
| name = "${pname}-${version}"; | |
| system = "x86_64-linux"; | |
| src = fetchurl { | |
| url = "https://nodejs.org/download/release/v${version}/node-v${version}-linux-x64.tar.gz"; | |
| sha256 = "1hclxcqc80576kqddpab0fqgfjp77f5fg4scfcm0m8akky6jpjgz"; | |
| }; | |
| # Required for compilation | |
| nativeBuildInputs = with pkgs; [ | |
| autoPatchelfHook | |
| stdenv.cc.cc.lib | |
| ]; | |
| installPhase = '' | |
| mkdir -p "$out" | |
| cp -av bin include lib share "$out" | |
| ''; | |
| }; | |
| }; | |
| overlay = final: prev: { custom = self.packages."${system}"; }; | |
| devShell."${system}" = mkShell { | |
| nativeBuildInputs = with pkgs; [ | |
| pkg-config | |
| custom.clang | |
| custom.gcc | |
| custom.bolos-env | |
| astyle # for ‹make format› | |
| bear # for generating ‹compile_commands.json› | |
| libusb-compat-0_1 # for compiling the ‹usbtool› | |
| # https://ledger.readthedocs.io/en/latest/userspace/setup.html#python-loader | |
| (pkgs.python39.withPackages (ps: with ps; [ | |
| ledgerblue virtualenv hidapi pkgs.hidapi | |
| ])) | |
| # for js parts | |
| custom.nodejs | |
| (yarn.override { | |
| nodejs = custom.nodejs; | |
| }) | |
| ]; | |
| LD_LIBRARY_PATH="${pkgs.stdenv.cc.cc.lib}/lib64:$LD_LIBRARY_PATH"; | |
| shellHook = let | |
| bolosDevCertificatePrivateKey = if pathExists privateKeyPath then readFile privateKeyPath else ""; | |
| in '' | |
| export BOLOS_SDK="${bolos-sdk}" | |
| export BOLOS_ENV="${pkgs.custom.bolos-env}" | |
| export SCP_PRIVKEY="${bolosDevCertificatePrivateKey}" | |
| if [ -z "$SCP_PRIVKEY" ]; then | |
| cat <<EOF | |
| You don't have a private key for developer certificate set in | |
| "${toString privateKeyPath}". | |
| It is suggested to create a developer certificate to bypass PIN entry when | |
| loading a new app version to Ledger. See the documentation for more info: | |
| https://ledger.readthedocs.io/en/latest/userspace/debugging.html#pin-bypass | |
| EOF | |
| fi | |
| ''; | |
| }; | |
| }; | |
| } |