Package Nix pour Ğcli

Je suis en train d’essayer de build un package Nix de Ğcli, parce que j’ai cru que ce serait facile.

Cela permettrait d’installer Ğcli rapidement sur des anciennes versions de Linux avec Devbox ou Nix.
Et sûrement d’autres cas d’usage que je ne connais pas.

J’ai pris un fichier flake.nix et je l’ai modifié. J’ai corrigé des erreurs, mais là je bloque sur la crate age dont le source semble introuvable lors du cargo build via Nix.

J’ai mis le dépôt github de age dans Cargo.toml, mais sans succès…

Je précise que j’ai réussi à build Ğcli localement sans problème et qu’il fonctionne.

Si le projet intéresse @immae ou d’autres, je peux pousser une MR sur le dépôt de Ğcli pour investiguer…

Les logs de la commande nix build :

error: builder for '/nix/store/raz92b1d9zzfpsnbdcp1srp4f2c7bjdb-gcli.drv' failed with exit code 101;
       last 25 log lines:
       > Validating consistency between /build/r61zjcv8c2l391yslm7vbxa0dr4daqh6-source/Cargo.lock and /build/cargo-vendor-dir/Cargo.lock
       > Finished cargoSetupPostPatchHook
       > configuring
       > building
       > Executing cargoBuildHook
       > ++ env CC_x86_64-unknown-linux-gnu=/nix/store/061ybr50r1m2jnvih4vvpgmgwb37df3r-gcc-wrapper-12.2.0/bin/cc CXX_x86_64-unknown-linux-gnu=/nix/store/061ybr50r1m2jnvih4vvpgmgwb37df3r-gcc-wrapper-12.2.0/bin/c++ CC_x86_64-unknown-linux-gnu=/nix/store/061ybr50r1m2jnvih4vvpgmgwb37df3r-gcc-wrapper-12.2.0/bin/cc CXX_x86_64-unknown-linux-gnu=/nix/store/061ybr50r1m2jnvih4vvpgmgwb37df3r-gcc-wrapper-12.2.0/bin/c++ cargo build -j 4 --target x86_64-unknown-linux-gnu --frozen --release
       > error: failed to get `age` as a dependency of package `gcli v0.2.9 (/build/r61zjcv8c2l391yslm7vbxa0dr4daqh6-source)`
       >
       > Caused by:
       >   failed to load source for dependency `age`
       >
       > Caused by:
       >   Unable to update registry `crates-io`
       >
       > Caused by:
       >   failed to update replaced source registry `crates-io`
       >
       > Caused by:
       >   failed to parse manifest at `/build/cargo-vendor-dir/sp-tracing-16.0.0/Cargo.toml`
       >
       > Caused by:
       >   error inheriting `lints` from workspace root manifest's `workspace.lints`
       >
       > Caused by:
       >   failed to find a workspace root
       For full logs, run 'nix log /nix/store/raz92b1d9zzfpsnbdcp1srp4f2c7bjdb-gcli.drv'.
1 Like

Suite de mes aventures avec nix build :

Ce qui me donne :

{ pkgs ? import <nixpkgs> { } }:
pkgs.rustPlatform.buildRustPackage rec {
  pname = "gcli";
  version = "0.2.9";
  cargoLock.lockFile = ./Cargo.lock;
  src = pkgs.lib.cleanSource ./.;
cargoLock.outputHashes = {
    "ark-secret-scalar-0.0.2" = "sha256-91sODxaj0psMw0WqigMCGO5a7+NenAsRj5ZmW6C7lvc=";
    "common-0.1.0" = "sha256-LHz2dK1p8GwyMimlR7AxHLz1tjTYolPwdjP7pxork1o=";
    "fflonk-0.1.0" = "sha256-+BvZ03AhYNP0D8Wq9EMsP+lSgPA6BBlnWkoxTffVLwo=";
    "simple-mermaid-0.1.0" = "sha256-IekTldxYq+uoXwGvbpkVTXv2xrcZ0TQfyyE2i2zH+6w=";
    "sp-application-crypto-23.0.0" = "sha256-Ju+VoWSw/KLF1dnTbgxw+ezwTUQV+tUTYuehD7G8M+k=";
    "sp-ark-bls12-381-0.4.2" = "sha256-nNr0amKhSvvI9BlsoP+8v6Xppx/s7zkf0l9Lm3DW8w8=";
    "sp-crypto-ec-utils-0.10.0" = "sha256-OVoNzvupbqpQSEz1bYcrhkGxfyKoUsQ6/w+kQgFlk/o=";
    "subxt-0.34.0" = "sha256-i6yIRBllVedBIh57x1Ye6gDtQ08VlV08uwwnd1bjgzI=";
  };
}

Le build avance bien mieux !

…jusqu’au drame :

       >    Compiling sp-runtime v24.0.0 (https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.6.0#c84530c5)
       >    Compiling dirs-sys v0.4.1
       > error: couldn't read /build/cargo-vendor-dir/sp-runtime-24.0.0/src/generic/../../../../../docs/mermaid/extrinsics.mmd: No such file or directory (os error 2)
       >   --> /build/cargo-vendor-dir/sp-runtime-24.0.0/src/generic/unchecked_extrinsic.rs:60:35
       >    |
       > 60 | #[cfg_attr(feature = "std", doc = simple_mermaid::mermaid!("../../../../../docs/mermaid/extrinsics.mmd"))]
       >    |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       >    |
       >    = note: this error originates in the macro `include_str` which comes from the expansion of the macro `simple_mermaid::mermaid` (in Nightly builds, run with -Z macro-backtrace for more info)
       >
       > error: could not compile `sp-runtime` (lib) due to 1 previous error
       > warning: build failed, waiting for other jobs to finish...
       For full logs, run 'nix log /nix/store/nc57rnbc5lq3jzc3yxn4kvz9b9k68bh2-gcli-0.2.9.drv'.

Bon ben je suis bloqué parce qu’il ne trouve pas une doc ! Rognetudju ! :triumph:

A suivre…

1 Like

Si un détail dans une dépendance cause un problème bloquant, tu peux ajouter une section patch pour remplacer la dépendance (même transitive) par un fork.

Dans ce cas-là peut-être qu’il faut juste faire cargo doc avant pour que ça marche ? C’est bizarre.

cargo doc n’a pas résolu le problème… snif. Je vais regarder la solution du patch… Merci !

Le problème ne vient pas de nix mais de la dépendence simple-mermaid je pense.

J’ai testé en remplaçant import <nixpkgs> par import <nixos-unstable> sinon ça plante car il faut une version de rustc >= 1.75, et mon channel nixpkgs fourni la version 1.74.
Bref, ça build mais j’ai la même erreur :

 Compiling scale-value v0.13.0
   Compiling age-core v0.10.0
   Compiling dirs-sys v0.4.1
   Compiling sp-runtime v24.0.0 (https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.6.0#c84530c5)
error: couldn't read /build/cargo-vendor-dir/sp-runtime-24.0.0/src/generic/../../../../../docs/mermaid/extrinsics.mmd: No such file or directory (os error 2)
  --> /build/cargo-vendor-dir/sp-runtime-24.0.0/src/generic/unchecked_extrinsic.rs:60:35
   |
60 | #[cfg_attr(feature = "std", doc = simple_mermaid::mermaid!("../../../../../docs/mermaid/extrinsics.mmd"))]
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in the macro `include_str` which comes from the expansion of the macro `simple_mermaid::mermaid` (in Nightly builds, run with -Z macro-backtrace for more info)

   Compiling directories v4.0.1
   Compiling i18n-embed-fl v0.7.0
   Compiling scrypt v0.11.0
   Compiling crossterm v0.25.0
error: could not compile `sp-runtime` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: builder for '/nix/store/yz67l8671060vlxnxsf5ffcqd2wdimy7-gcli-0.2.9.drv' failed with exit code 101;
       last 10 log lines:
       >    |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       >    |
       >    = note: this error originates in the macro `include_str` which comes from the expansion of the macro `simple_mermaid::mermaid` (in Nightly builds, run with -Z macro-backtrace for more info)
       >
       >    Compiling directories v4.0.1
       >    Compiling i18n-embed-fl v0.7.0
       >    Compiling scrypt v0.11.0
       >    Compiling crossterm v0.25.0
       > error: could not compile `sp-runtime` (lib) due to 1 previous error
       > warning: build failed, waiting for other jobs to finish...
       For full logs, run 'nix log /nix/store/yz67l8671060vlxnxsf5ffcqd2wdimy7-gcli-0.2.9.drv'.

@vit pour avoir le hash c’est tout simple, tu laisse une chaine vide, et nix plante mais te retourne le hash : "simple-mermaid-0.1.0" = "";

Du coup, comme il y a une version 0.1.1, j’ai essayé mais nix plante le build, comme si cette version n’existait pas. :

❯ nix-build default.nix
error:
       … while calling the 'derivationStrict' builtin

         at /builtin/derivation.nix:9:12: (source not available)

       … while evaluating derivation 'gcli-0.2.9'
         whose name attribute is located at /nix/store/3r643hm4q1l4dj1yw0hlaya8gkbbn235-nixos-unstable/nixos-unstable/pkgs/stdenv/generic/make-derivation.nix:331:7

       … while evaluating attribute 'cargoDeps' of derivation 'gcli-0.2.9'

         at /nix/store/3r643hm4q1l4dj1yw0hlaya8gkbbn235-nixos-unstable/nixos-unstable/pkgs/build-support/rust/build-rust-package/default.nix:101:10:

          100| } // {
          101|   inherit buildAndTestSubdir cargoDeps;
             |          ^
          102|

       (stack trace truncated; use '--show-trace' to show the full trace)

       error: A hash was specified for simple-mermaid-0.1.1, but there is no corresponding git dependency.

Voilà, je ne sais pas trop non plus quoi faire de plus…

La dépendance simple-memaid dans cargo.lock viendrait de duniter-polkadot-sdk :

[[package]]
name = "sp-runtime"
version = "24.0.0"
source = "git+https://github.com/duniter/duniter-polkadot-sdk.git?branch=duniter-substrate-v1.6.0#c84530c57a6f9ab808a92f6b5d29338acf1c6e4f"
dependencies = [
 "docify",
 "either",
 "hash256-std-hasher",
 "impl-trait-for-tuples",
 "log",
 "parity-scale-codec",
 "paste",
 "rand",
 "scale-info",
 "serde",
 "simple-mermaid",
 "sp-application-crypto",
 "sp-arithmetic",
 "sp-core",
 "sp-io",
 "sp-std 8.0.0",
 "sp-weights",
]
1 Like

J’ai installé NixOS sur une machine dont j’avais pétée la distribution Ubuntu.

Afin de pouvoir apprendre mieux ce système et donc Nix.

J’ai installé l’IDE Jetbrains Intellij Idea avec le plugin Rust.

Je compile bien gcli avec l’IDE sous NixOS !

J’utilise crate2nix pour générer un fichier Cargo.nix à partir du fichier cargo.toml (ou .lock).

crate2nix generate

J’ai créé un fichier default.nix pour faire le build à partir de Cargo.nix :

let pkgs = import <nixpkgs> { }; in
let cargo_nix = pkgs.callPackage ./Cargo.nix {};
in cargo_nix.rootCrate.build

Je lance la commande de build :

nix-build

Et ça à l’air d’aller plus loin, mais boom !

unpacking source archive /nix/store/x5jjmr0dlnj4f8w15c1yk4wiyqf8c5bz-duniter-polkadot-sdk-c84530c
Running cd /build/duniter-polkadot-sdk-c84530c/substrate/primitives/storage
source root is duniter-polkadot-sdk-c84530c
Running phase: patchPhase
Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: buildPhase
Building src/lib.rs (sp-storage)
Running rustc --crate-name sp_storage src/lib.rs --out-dir target/lib -L dependency=target/deps --cap-lints allow -C opt-level=3 -C codegen-units=1 --remap-path-prefix=/build=/ --extern impl_serde=/nix/store/1n1b175hla3a229yawi713ygndnn4lvv-rust_impl-serde-0.4.0-lib/lib/libimpl_serde-278d5a2ea8.rlib --extern codec=/nix/store/rshjpjk584wa4rdvbrqxp01p5r7xdrb4-rust_parity-scale-codec-3.6.9-lib/lib/libparity_scale_codec-e9fb4e9eb3.rlib --extern ref_cast=/nix/store/8v883psgx60680w59qm8r9iq3n8wlaci-rust_ref-cast-1.0.22-lib/lib/libref_cast-7fe7ff157b.rlib --extern serde=/nix/store/4s90pqnmm9vpjcgb8550498m5q54ryan-rust_serde-1.0.196-lib/lib/libserde-bf801c33c1.rlib --extern sp_debug_derive=/nix/store/qgghmv095qjcgll24q628y3hhsx503kv-rust_sp-debug-derive-8.0.0-lib/lib/libsp_debug_derive-e1f5db7d9d.so --extern sp_std=/nix/store/7mcdn19svhl6g4rbfnxfvhjra716zpf5-rust_sp-std-8.0.0-lib/lib/libsp_std-622782830f.rlib --cfg feature="impl-serde" --cfg feature="serde" --cfg feature="std" --edition 2021 -C metadata=14b8493325 -C extra-filename=-14b8493325 --crate-type lib --color always
Running phase: configurePhase
Searching for matching Cargo.toml (sp-tracing)
error: `CARGO` env variable not set.
  --> src/lib.rs:39:63
   |
39 |     derive(Serialize, Deserialize, Hash, PartialOrd, Ord, Clone, Encode, Decode)
   |                                                                  ^^^^^^
   |
   = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
  --> src/lib.rs:39:71
   |
39 |     derive(Serialize, Deserialize, Hash, PartialOrd, Ord, Clone, Encode, Decode)
   |                                                                          ^^^^^^
   |
   = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
  --> src/lib.rs:53:75
   |
53 |     PartialEq, Eq, Ord, PartialOrd, sp_std::hash::Hash, RuntimeDebug, Clone, Encode, Decode,
   |                                                                              ^^^^^^
   |
   = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
  --> src/lib.rs:53:83
   |
53 |     PartialEq, Eq, Ord, PartialOrd, sp_std::hash::Hash, RuntimeDebug, Clone, Encode, Decode,
   |                                                                                      ^^^^^^
   |
   = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:146:63
    |
146 |     derive(Serialize, Deserialize, Hash, PartialOrd, Ord, Clone, Encode, Decode, Default)
    |                                                                  ^^^^^^
    |
    = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:146:71
    |
146 |     derive(Serialize, Deserialize, Hash, PartialOrd, Ord, Clone, Encode, Decode, Default)
    |                                                                          ^^^^^^
    |
    = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:250:76
    |
250 | #[cfg_attr(feature = "serde", derive(PartialEq, Eq, Hash, PartialOrd, Ord, Encode, Decode))]
    |                                                                            ^^^^^^
    |
    = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:250:84
    |
250 | #[cfg_attr(feature = "serde", derive(PartialEq, Eq, Hash, PartialOrd, Ord, Encode, Decode))]
    |                                                                                    ^^^^^^
    |
    = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:397:76
    |
397 | #[cfg_attr(feature = "serde", derive(PartialEq, Eq, Hash, PartialOrd, Ord, Encode, Decode))]
    |                                                                            ^^^^^^
    |
    = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:397:84
    |
397 | #[cfg_attr(feature = "serde", derive(PartialEq, Eq, Hash, PartialOrd, Ord, Encode, Decode))]
    |                                                                                    ^^^^^^
    |
    = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:418:36
    |
418 | #[cfg_attr(feature = "std", derive(Encode, Decode))]
    |                                    ^^^^^^
    |
    = note: this error originates in the derive macro `Encode` (in Nightly builds, run with -Z macro-backtrace for more info)

error: `CARGO` env variable not set.
   --> src/lib.rs:418:44
    |
418 | #[cfg_attr(feature = "std", derive(Encode, Decode))]
    |                                            ^^^^^^
    |
    = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)

...checking manifest_path ./Cargo.toml
error: aborting due to 12 previous errors

error: builder for '/nix/store/sm9jrgcjws8hhp3xj878zsapys3nn4m1-rust_sp-storage-13.0.0.drv' failed with exit code 1;
       last 10 log lines:
       > error: `CARGO` env variable not set.
       >    --> src/lib.rs:418:44
       >     |
       > 418 | #[cfg_attr(feature = "std", derive(Encode, Decode))]
       >     |                                            ^^^^^^
       >     |
       >     = note: this error originates in the derive macro `Decode` (in Nightly builds, run with -Z macro-backtrace for more info)
       >
       > error: aborting due to 12 previous errors
       >
       For full logs, run 'nix-store -l /nix/store/sm9jrgcjws8hhp3xj878zsapys3nn4m1-rust_sp-storage-13.0.0.drv'.
error: 1 dependencies of derivation '/nix/store/ma75jf62d0r3b9hcpbjfrx6sv4x7zlig-rust_gcli-0.2.9.drv' failed to build

Une compilation échoue car la variable d’environnement “CARGO” n’est pas trouvée…

A suivre…

Le problème vient de la dépendance duniter-polkadot-sdk

J’essaie donc de faire un cargo build sur Nixos de cette dépendance.
Cela me permet de configurer un fichier nix-shell pour réussir cette tâche. Fichier qui me permettra de compléter ce qui manque dans le fichier nix-shell de gcli.

Là je suis bloqué car il faut installer le nécessaire pour compiler en wasm… A suivre !

process didn't exit successfully: `/home/vit/Documents/dev/rust/duniter-polkadot-sdk/target/debug/build/westend-runtime-ffd5267f5f9a1655/build-script-build` (exit status: 1)
  --- stderr
  Rust WASM toolchain is not properly installed; please install it!

  Further error information:
  ------------------------------------------------------------
     Compiling wasm-test v1.0.0 (/run/user/1000/.tmpLgjEKF)
  error: linking with `rust-lld` failed: exit status: 102
1 Like

Effectivement, pour compiler le runtime, il faut le target wasm dans la toolchain rust : rust-toolchain.toml · master · nodes / rust / Duniter v2S · GitLab.

1 Like

Intéressant, mais le problème vient de ma méconnaissance de Nixos.
Je ne comprends pas ce que je fais, même si j’avance un peu…

Si un connaisseur de Nixos passe par là et a du temps, je veux bien de l’aide.

Le plus grand connaisseur qu’on a sous la main c’est @immae :wink:
@cgeek a pas mal appris aussi on dirait, mais en ce moment n’a pas du tout le temps.

Il faut que je m’y mette aussi un de ces jours, ça m’intéresse beaucoup, mais pour l’instant j’essaye de me freiner sur les nouvelles technos pour aller à l’essentiel pour la v2.

Donc pour l’instant je ne peux rien dire sur le côté Nixos, par contre pour Rust, je sais qu’il faut installer la bonne toolchain avec les bons targets de compilation. Là, pour Duniter, avec cette histoire de runtime webassembly, c’est normal de devoir compiler des choses en wasm.

Le premier résultat pour une recherche “nix rust wasm” a l’air pas mal :

Il a une erreur qui ressemble au début :

Error: wasm32-unknown-unknown target not found in sysroot:

Il l’explique comme ça :

This failure is because the Rust toolchain is being managed with Nix rather than with Rustup directly. The error message tells us how to solve this problem: the wasm32-unknown-unknown target needs to be installed manually.

J’imagine que la lecture t’aidera. Pour ma part, je n’ai pas encore les bases pour arriver à lire du nix.

Par contre, il y a un truc qui m’interpelle dans ton erreur :

process didn't exit successfully: `/home/vit/Documents/dev/rust/duniter-polkadot-sdk/target/debug/build/westend-runtime-ffd5267f5f9a1655/build-script-build` (exit status: 1)

Je suis surpris qu’il faille compiler le westend-runtime. Normalement ça ne devrait pas être nécessaire, gcli devrait juste devoir lire le gdev-runtime (et encore je pense qu’il devrait pouvoir tout déduire des runtime metadata sans avoir à lire le code du runtime).

Mais sans creuser plus, je vais avoir du mal à t’aider. Peut être que ça amusera @bgallois de se frotter à nix en essayant de packager gcli :stuck_out_tongue:

2 Likes

Un grand merci Hugo ! :+1:

Cette page est celle que j’avais vu dans mes débuts de recherche, mais je n’y comprenais que pouic. Plus tard j’ai voulue la retrouver, mais impossible !

C’est chose faîte, je vais pouvoir potasser ce post qui me semble très intéressant.