# Cargo.nix and crate-hashes.json were created with: # - `nix run '.#crate2nix' -- generate -f ~/ref/repos/schmiddi-on-mobile/flare/Cargo.toml` # - `sed -i 's/target."curve25519_dalek_backend"/target."curve25519_dalek_backend" or ""/g' Cargo.nix` # # the generated Cargo.nix points to an impure source (~/ref/...), but that's resolved by overriding `src` below # # compatibility matrix: # - 0.10.1-beta.6 (2023/12/12): # - link to signald JMP.chat: NO (http 405) # - primary device via JMP.chat: NO (http 422) # - link to iOS tel: NO (http 405) # - 0.10.1-beta.4 (2023/12/12): # - link to signald JMP.chat: NO (http 405) # - primary device via JMP.chat: NO (http 422) # - link to iOS tel: NO (http 405) { lib , appstream-glib , blueprint-compiler , buildPackages , defaultCrateOverrides , desktop-file-utils , fetchFromGitLab , flare-signal , gdk-pixbuf , glib , gobject-introspection , gst_all_1 , gtk4 , gtksourceview5 , libadwaita , libsecret , libspelling , meson , ninja , pkg-config , pkgs , protobuf , rust , stdenv , wrapGAppsHook4 , writeText , crateOverrideFn ? x: x }: let extraCrateOverrides = { flare = attrs: attrs // { # inherit (flare-signal) src; src = fetchFromGitLab { domain = "gitlab.com"; owner = "schmiddi-on-mobile"; repo = "flare"; rev = "0.10.1-beta.6"; hash = "sha256-NhQu9gpnweI+kIWh3Mbb9bCQnfgthxocAqDRwG0m2Hg="; # flare/Cargo.nix version compatibility: # - flare 0.10.1-beta.6: compiles # - flare 0.10.1-beta.5: can't crate2nix because Cargo.lock is out of date with Cargo.toml # - flare 0.10.1-beta.4: compiles # - flare 0.10.1-beta.2: requires gtk 4.11, not yet in nixpkgs # - # - specifically, that's because of gdk4-sys 0.7.2. # - after 0.10.1-beta.1, there's a translations update, then immediately "ui(): Port to GTK 4.12 and Libadwaita 1.4" # so 0.10.1-beta.1 is effectively the last gtk 4.10 compatible version # - flare 0.10.1-beta.1: uses a variant of serde_derive which doesn't cross compile in nixpkgs # - after serde_derive downgraded => 1.0.171: # ``` # > 424 | .send(manager.sync_contacts().await) # > | ^^^^^^^^^^^^^ private method # > --> /presage-d6d8fff/presage/src/manager.rs:650:5 # > = note: private method defined here # ``` # - flare 0.10.0: uses a version of serde_derive which doesn't cross compile in nixpkgs # - same error as 0.9.0 once serde_derive is downgraded to 1.0.171 # - flare 0.9.3: uses a version of serde_derive which doesn't cross compile in nixpkgs # - same error as 0.9.0 once serde_derive is downgraded to 1.0.171 # - flare 0.9.2: uses a version of serde_derive which doesn't cross compile in nixpkgs # - same error as 0.9.0 once serde_derive is downgraded to 1.0.171 # - flare 0.9.1: uses a version of serde_derive (1.0.175) which doesn't cross compile in nixpkgs # - flare 16acc70ceb6e80eb2d87a92e72e2727e8b98b4db (last rev before serde_derive 1.0.175): same error as 0.9.0 # - flare 0.9.0: deps build but crate itself fails because `mod config` is unknown (i.e. we didn't invoke meson and let it generate config.rs) # rev = "0.10.1-beta.6"; # hash = "sha256-NhQu9gpnweI+kIWh3Mbb9bCQnfgthxocAqDRwG0m2Hg="; # rev = "0.10.1-beta.5"; # hash = "sha256-AAxasck8rm8N73jcJU6qW+zR3qSAH5nsi4hTunSnW8Y="; # rev = "0.10.1-beta.4"; # hash = "sha256-SkHARJ4V8t4dXITH+V36RIfPrWL5Bdju1gahCS2aiWo="; # rev = "0.10.1-beta.2"; # hash = "sha256-xkTM8Jeyb89ZUo2lFKNm8HlTe8BTlO/flZmENRfDEm4="; # rev = "0.10.1-beta.1"; # hash = "sha256-nUR3jnbjMJvI3XbguFLz5yQL3SAXzLkdVwXyhcMeZoc="; # rev = "0.10.0"; # hash = "sha256-+9zpYW9xjLe78c2GRL6raFDR5g+R/JWxQzU/ZS+5JtY="; # rev = "0.9.3"; # hash = "sha256-bTR3Jzzy8dVdBJ4Mo2PYstEnNzBVwiWE8hRBnJ7pJSs="; # rev = "0.9.2"; # hash = "sha256-70OqHCe+NZ0dn1sjpkke5MtXU3bFgpwkm0TYlbXOUl8="; # rev = "16acc70ceb6e80eb2d87a92e72e2727e8b98b4db"; # hash = "sha256-Lz7h5JUrqBUsvRICW3QacuO8rkeGBY9yroq/Gtb7nMw="; # rev = "0.9.0"; # hash = "sha256-6p9uuK71fJvJs0U14jJEVb2mfpZWrCZZFE3eoZe9eVo="; }; codegenUnits = 16; # speeds up the build a bit outputs = [ "out" ]; # default is "out" and "lib", but that somehow causes cycles outputDev = [ "out" ]; nativeBuildInputs = [ appstream-glib # for appstream-util blueprint-compiler desktop-file-utils # for update-desktop-database gobject-introspection meson ninja pkg-config wrapGAppsHook4 ]; buildInputs = [ gtksourceview5 libadwaita libsecret # libspelling # optional feature. to enable, add it to `rootFeatures` above too. protobuf # To reproduce audio messages gst_all_1.gstreamer gst_all_1.gst-plugins-base gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad ]; mesonFlags = let # this gets meson to shutup about rustc not producing executables. # kinda silly though, since we patch out the actual cargo (rustc) invocations. crossFile = writeText "cross-file.conf" '' [binaries] rust = [ 'rustc', '--target', '${rust.toRustTargetSpec stdenv.hostPlatform}' ] ''; in lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ "--cross-file=${crossFile}" ]; postPatch = '' # patch so meson will invoke our `crate2nix_cmd.sh` instead of cargo substituteInPlace src/meson.build \ --replace 'cargo_options,' "" \ --replace "cargo, 'build'," "'bash', 'crate2nix_cmd.sh'," \ --replace "'target' / rust_target" "'target/bin'" # enable the "Primary Device" button (beta) substituteInPlace data/resources/ui/setup_window.blp \ --replace 'sensitive: false;' "" ''; postConfigure = '' # copied from mesonFlags="--prefix=$prefix $mesonFlags" mesonFlags="\ --libdir=''${!outputLib}/lib --libexecdir=''${!outputLib}/libexec \ --bindir=''${!outputBin}/bin --sbindir=''${!outputBin}/sbin \ --includedir=''${!outputInclude}/include \ --mandir=''${!outputMan}/share/man --infodir=''${!outputInfo}/share/info \ --localedir=''${!outputLib}/share/locale \ -Dauto_features=''${mesonAutoFeatures:-enabled} \ -Dwrap_mode=''${mesonWrapMode:-nodownload} \ $mesonFlags" mesonFlags="''${crossMesonFlags+$crossMesonFlags }--buildtype=''${mesonBuildType:-plain} $mesonFlags" echo "meson flags: $mesonFlags ''${mesonFlagsArray[@]}" meson setup build $mesonFlags "''${mesonFlagsArray[@]}" cd build ''; preBuild = '' build_bin() { # build_bin is what buildRustCrate would use to invoke rustc, but we want to drive the build # with meson instead. however, meson doesn't know how to plumb our rust dependencies into cargo, # so we still need to use build_bin for just one portion of the build. # # so, this mocks out the original build_bin: # - we patch upstream flare to call our `crate2nix_cmd.sh` when it wants to compile the rust. # - we don't actually invoke meson (ninja) at all here, but rather in the `installPhase`. # if we invoked it here, the whole build would just get re-done in installPhase anyway. # # rustc invocation copied from crate_name_=flare main_file=../src/main.rs fix_link="-C linker=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc" cat >> crate2nix_cmd.sh <