summary refs log tree commit diff
path: root/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'default.nix')
-rw-r--r--default.nix41
1 files changed, 35 insertions, 6 deletions
diff --git a/default.nix b/default.nix
index e4d4f7e..c79ba7c 100644
--- a/default.nix
+++ b/default.nix
@@ -1,11 +1,12 @@
-{ craneLib, lib
-, pkg-config, wrapGAppsHook
-, gtk4, libadwaita, libpanel, libsoup_3, libsecret, librsvg, gettext
+{ craneLib, lib, rustc
+, pkg-config, wrapGAppsHook, meson, ninja, gettext
+, desktop-file-utils
+, gtk4, libadwaita, libpanel, libsoup_3, libsecret, librsvg
 }:
 
 let
   src = let
-    suffixes = [];
+    suffixes = [ "meson.options" "meson.build" ".sh" ".po" ".pot" ".in" ];
     suffixFilter = name: type: let
       base = baseNameOf (toString name);
     in type == "directory" || lib.any (ext: lib.hasSuffix ext base) suffixes;
@@ -30,7 +31,7 @@ let
     # cargoExtraArgs can be used to inject features
 
     buildInputs = [ gtk4 libadwaita libpanel libsoup_3 libsecret librsvg gettext ];
-    nativeBuildInputs = [ pkg-config wrapGAppsHook gettext ];
+    nativeBuildInputs = [ pkg-config wrapGAppsHook gettext meson ninja ];
 
     meta = with lib.meta; {
       maintainers = with lib.maintainers; [ vikanezrimaya ];
@@ -42,7 +43,35 @@ let
   cargoArtifacts = craneLib.buildDepsOnly args;
   args' = args // { inherit cargoArtifacts; };
 
-in craneLib.buildPackage (args' // {
+in craneLib.mkCargoDerivation (args' // {
+  # This is the magic sauce to integrate Crane and Meson builds
+  # (see `src/meson.build` for details on how we call Cargo)
+
+  # Use source replacement so we can use the crane vendor tarball
+  postConfigure = ''
+    mkdir -p cargo-home
+    cp $CARGO_HOME/config.toml cargo-home/config.toml
+  '';
+  # Move intermediate artefacts from Cargo to the Meson build folder
+  preBuild = ''
+    mv ../target/release src/release
+  '';
+  # Use standard Meson and Ninja build phases
+  configurePhase = "mesonConfigurePhase";
+  buildPhase = "ninjaBuildPhase";
+  buildPhaseCargoCommand = "# unused";
+  checkPhase = "mesonCheckPhase";
+  installPhase = "mesonInstallPhase";
+
+  nativeBuildInputs = args'.nativeBuildInputs ++ [
+    rustc # Only needed for Meson to successfully detect the Rust toolchain
+
+    # Auxiliary packages
+    desktop-file-utils
+  ];
+
+  doInstallCargoArtifacts = false;
+
   passthru = {
     inherit src cargoArtifacts;
     clippy = craneLib.cargoClippy args';