Package Nix pour Ğcli

Et voilà le default.nix utilisable directement sur le code non modifié :tada:

{ pkgs ? import <nixpkgs> {} }:
let
  pkgsPatched = pkgs.applyPatches {
    src = pkgs.path;
    patches = [
      (pkgs.fetchpatch {
        url = "https://patch-diff.githubusercontent.com/raw/NixOS/nixpkgs/pull/377721.patch";
        sha256 = "sha256-jsy5msGbkNK+4x9Y+XGV0pyF14pOPvsETvj+cNAJSAw=";
      })
    ];
  };
in
with import pkgsPatched {};
rustPlatform.buildRustPackage {
  pname = "gcli";
  version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
  src = lib.cleanSource ./.;
  cargoHash = "sha256-lQbvBOE/9ufZ1UacEmnAE483P63CBT1ejansamxU8Ug=";
  useFetchCargoVendor = true;
}

Il n’y aura plus besoin de patcher nixpkgs une fois que Allow "package" key in Cargo.toml dependencies by immae · Pull Request #377721 · NixOS/nixpkgs · GitHub sera mergée

@immae Tu es un ouf en nix ! Une PR sur le dépôt officiel :upside_down_face:
Je ferais bien une visio avec toi si tu as le temps ! J’ai plein de questions…
Je suis largué en nix :roll_eyes:

Depuis mon repo gcli-v2s, git pull.
Puis j’ai créé le default.nix avec ton code ci-dessus, puis commande nix-shell et ça plante :cry:

C’est pas ça qu’il fallait faire ? Faut attendre le merge de ta PR ?

Output :

this derivation will be built:
  /nix/store/gcz4dqpajkwdvr0j1n1qc5z9vkhlgdsb-gcli-0.3.0-vendor.tar.gz.drv
these 7 paths will be fetched (0.39 MiB download, 1.18 MiB unpacked):
  /nix/store/r0qnqmfq11rpf6n6zflld014xjp5808l-auditable-cargo-1.82.0
  /nix/store/ydhbsmaazzw9q9ny1i5yjk850mmmfanl-cargo-auditable-0.6.2
  /nix/store/j4qrwpqim26jhm243im22wzgxb7w0gxk-cargo-build-hook.sh
  /nix/store/2ai38pkyd83mcvs0lr9nwh38xpnihxga-cargo-check-hook.sh
  /nix/store/n8xilr39f5b6q6givmvq6qsrmyfhlzws-cargo-install-hook.sh
  /nix/store/8950g8dgzmy2gslcg1dcn5dkl5b64018-cargo-setup-hook.sh
  /nix/store/fh7vjdscr0jc0qww7wvfw739vzglynpy-cargo-vendor-normalise
copying path '/nix/store/n8xilr39f5b6q6givmvq6qsrmyfhlzws-cargo-install-hook.sh' from 'https://cache.nixos.org'...
copying path '/nix/store/ydhbsmaazzw9q9ny1i5yjk850mmmfanl-cargo-auditable-0.6.2' from 'https://cache.nixos.org'...
copying path '/nix/store/2ai38pkyd83mcvs0lr9nwh38xpnihxga-cargo-check-hook.sh' from 'https://cache.nixos.org'...
copying path '/nix/store/j4qrwpqim26jhm243im22wzgxb7w0gxk-cargo-build-hook.sh' from 'https://cache.nixos.org'...
copying path '/nix/store/8950g8dgzmy2gslcg1dcn5dkl5b64018-cargo-setup-hook.sh' from 'https://cache.nixos.org'...
copying path '/nix/store/fh7vjdscr0jc0qww7wvfw739vzglynpy-cargo-vendor-normalise' from 'https://cache.nixos.org'...
building '/nix/store/gcz4dqpajkwdvr0j1n1qc5z9vkhlgdsb-gcli-0.3.0-vendor.tar.gz.drv'...
copying path '/nix/store/r0qnqmfq11rpf6n6zflld014xjp5808l-auditable-cargo-1.82.0' from 'https://cache.nixos.org'...
Running phase: unpackPhase
unpacking source archive /nix/store/vnjzndgdgh2jfrlzdm2r1zm8ih6fs507-source
source root is source
Running phase: patchPhase
Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: configurePhase
no configure script, doing nothing
Running phase: buildPhase
source = "git+https://github.com/duniter/ring-vrf#93af77b15de3bb34f1c46913599f4f4c4faa3215"
source = "git+https://github.com/duniter/ring-vrf#93af77b15de3bb34f1c46913599f4f4c4faa3215"
source = "git+https://github.com/duniter/ring-vrf#93af77b15de3bb34f1c46913599f4f4c4faa3215"
source = "git+https://github.com/w3f/ring-proof?rev=665f5f5#665f5f51af5734c7b6d90b985dd6861d4c5b4752"
source = "git+https://github.com/duniter/ring-vrf#93af77b15de3bb34f1c46913599f4f4c4faa3215"
source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35"
source = "git+https://github.com/w3f/ring-proof?rev=665f5f5#665f5f51af5734c7b6d90b985dd6861d4c5b4752"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/arkworks-substrate#1dbec3114648697c992d3d022ade24c7a221c4c8"
source = "git+https://github.com/duniter/arkworks-substrate#1dbec3114648697c992d3d022ade24c7a221c4c8"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"

ERROR: The Cargo.lock contains git dependencies

This is currently not supported in the fixed-output derivation fetcher.
Use cargoLock.lockFile / importCargoLock instead.

error: builder for '/nix/store/gcz4dqpajkwdvr0j1n1qc5z9vkhlgdsb-gcli-0.3.0-vendor.tar.gz.drv' failed with exit code 1;
       last 25 log lines:
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.14.0#bcc60f3e4170c3908689252242f40761270c9a51"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       > source = "git+https://github.com/duniter/subxt?branch=subxt-v0.37.0-duniter-substrate-v1.14.0#00f181c1a5d8986e7146ddc72a745c793a9a1d8e"
       >
       > ERROR: The Cargo.lock contains git dependencies
       >
       > This is currently not supported in the fixed-output derivation fetcher.
       > Use cargoLock.lockFile / importCargoLock instead.
       >
       For full logs, run 'nix log /nix/store/gcz4dqpajkwdvr0j1n1qc5z9vkhlgdsb-gcli-0.3.0-vendor.tar.gz.drv'.

C’est plutôt nix-build qu’il faut lancer que nix-shell.

Mais en l’occurence l’erreur suggère que ton installation de nix est peut être un peu ancienne.
Essaye NIX_PATH=nixpkgs=channel:nixos-unstable nix-build ?

Pour répondre à des questions précises sur nix aucun problème pour faire une visio. Si c’est plutôt pour une formation je suis pas certain d’être le mieux placé pour ça

Il s’est passé un tas de truc : execute, symlink, copy, build, created, unpack, patch, run, test… et mis 20 min !
Mais pas de gcli dans mon terminal ?!
J’ai raté un truc ?

La fin des logs de 20 min :

Finished cargoCheckHook
Running phase: installPhase
Executing cargoInstallHook
Finished cargoInstallHook
Running phase: fixupPhase
shrinking RPATHs of ELF executables and libraries in /nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0
shrinking /nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0/bin/gcli
checking for references to /build/ in /nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0...
patching script interpreter paths in /nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0
stripping (with command strip and flags -S -p) in  /nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0/bin
/nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0

oui à la fin du nix-build il t’a créé un symlink (/nix/store/pd7h4by1jbgkdkx9cv55prsxi2f03xys-gcli-0.3.0 -> result ) dans ton dossier actuel, qui contient le gcli

(note: la dernière ligne de ton log contient aussi le chemin qui vient d’être buildé)

Avec un peu de délai (j’ai essayé plusierus fois entretemps en vain) j’ai enfin réussi à packager gcli:

À noter:

  • les tests ne passent pas, je les ai désactivés (à investigue)
  • le build n’est pas incrémental : à chaque modification du dépôt, on rebuilde toutes les dépendances et gcli.

Mais ça peut faire déjà un début

J’ai ajouté un commit pour avoir un build incrémental (cf “nix flake show”).

  • le build incrémental prend un temps initial beaucoup plus long (~40min) mais les builds suivants sont beaucoup plus rapides. Et les tests passent

  • le build non-incrémental est plus long à chaque changement mais ne prend “que” ~15min.

Je veux bien une review / merge, je n’ai pas les droits sur ce repo

Je viens d’approuver alors que je ne comprends rien au code nix, et j’ai aussi fusionné car les modifications ne concernent que les fichiers nix.

Peut-être que tu peux faire une aide au build nix dans le README.md, pour savoir comment lancer le build dans nixos ? Mais alors je laisserai un mainteneur du dépôt valider la modification.

@immae Effectivement ce serais top si tu pouvais ajouter les infos de base pour lancer ces builds classique & incrémental depuis NixOS (j’utilise NixOS également, mais je n’ai pas encore trop regardé pour les possibilités de build que cela offre :slightly_smiling_face:)

J’ai posté une MR pour ajouter des informations dans le readme: Add packaging readme for nix (!51) · Merge requests · clients / Rust / Ğcli-v2s · GitLab

À noter que de façon générale les flakes sont auto-découvrables :

En faisant nix flake showdepuis le repo on peut voir la liste de ce qu’il contient. Ici, on a donc deux packages .#gcli et `.#incremental-gclidisponibles (j’ai ajouté une description similaire à ce que j’ai ajouté dans le readme).

Du coup le README est un peu redondant ici

Juste une petite faute à corriger dans le text (j’ai fait une suggestion) et on peut merger :slightly_smiling_face:

Merci, c’est intégré !

C’est mergé :slight_smile:

Je ne connais pas cette commande nix profile install.
J’ai fait un nix profile install .#incremental-gcli, ça build jusqu’au bout mais j’ai cette erreur à la fin:
error: cannot read directory “/nix/var/nix/profiles/per-user/manu”: No such file or directory

Je pense que ça vient de ma config…
Pour info, je fais tout à l’ancienne en mettant à la main dans mon home.nix les packages que je veux.

Résolu !
J’avais un lien symbolique dans mon home:
lrwxrwxrwx - manu 10 oct. 2023 .nix-profile → /nix/var/nix/profiles/per-user/manu/profile qui pointé vers rien.
Je l’ai supprimé, relancé la commande nix profile install .#incremental-gcli et en un quart de seconde c’est passé. Maintenant j’ai un lien symbolique:
lrwxrwxrwx - manu 5 sept. 13:52 .nix-profile → /home/manu/.local/state/nix/profiles/profile/

Je ne comprends pas bien ou a été installé gcli… mais la command gcli fonctionne. gcli -V retourne gcli 0.4.2 !

which gcli retourne:
/home/manu/.nix-profile/bin/gcli

Du coup, pour les prochaines mise à jour, je dois faire dans mon dossier gcli-v2s un git pull puis de nouveau nix profile install .#incremental-gcli ?

Je pense que nix profile install .#incremental-gcli marcherait oui, mais en vrai tu n’as pas besoin de cloner / puller le repo, tu peux juste l’installer directement avec nix profile install git+https://git.duniter.org/clients/rust/gcli-v2s#incremental-gcli puis nix profile upgrade (ou nix profile upgrade incremental-gcli pour ne mettre à jour qu’un seul paquet)

Dans ton home.nix tu peux aussi le faire (et c’est mieux, si tu as un home-manager), avec par exemple

home.packages = 
let
   gcli-src = builtins.fetchTarball {
       (url vers un tarball du repo...)
   }
in
   [ (builtins.getFlake gcli-src).packages.x86_64-linux.incremental-gcli
   ];

(à ajuster si tu as des flakes, mais ça ne semble pas être le cas)

Merci pour les infos !
Je vais essayer…