about summary refs log tree commit diff stats
path: root/nix/package.nix
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--nix/package.nix138
1 files changed, 138 insertions, 0 deletions
diff --git a/nix/package.nix b/nix/package.nix
new file mode 100644
index 0000000..979696b
--- /dev/null
+++ b/nix/package.nix
@@ -0,0 +1,138 @@
+# yt - A fully featured command line YouTube client
+#
+# Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of Yt.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  lib,
+  rustPlatform,
+  installShellFiles,
+  # buildInputs
+  mpv-unwrapped,
+  ffmpeg,
+  openssl,
+  libffi,
+  zlib,
+  curl,
+  # NativeBuildInputs
+  makeWrapper,
+  llvmPackages_latest,
+  glibc,
+  sqlite,
+  fd,
+  pkg-config,
+  SDL2,
+  python3,
+  # Passthru
+  tree-sitter-yts,
+}: let
+  python = python3.withPackages (ps: [ps.yt-dlp]);
+in
+  rustPlatform.buildRustPackage (finalAttrs: {
+    pname = "yt";
+    inherit
+      ((builtins.fromTOML (builtins.readFile
+            ../Cargo.toml)).workspace.package)
+      version
+      ;
+
+    src = lib.cleanSourceWith {
+      src = lib.cleanSource ./..;
+      filter = name: type:
+        (type == "directory")
+        || (builtins.elem (builtins.baseNameOf name) [
+          "Cargo.toml"
+          "Cargo.lock"
+          "mkdb.sh"
+          "help.str"
+          "raw_error_warning.txt"
+          "golden.txt"
+        ])
+        || (lib.strings.hasSuffix ".rs" (builtins.baseNameOf name))
+        || (lib.strings.hasSuffix ".h" (builtins.baseNameOf name))
+        || (lib.strings.hasSuffix ".sql" (builtins.baseNameOf name));
+    };
+
+    nativeBuildInputs = [
+      installShellFiles
+      makeWrapper
+      sqlite
+      fd
+      pkg-config
+    ];
+
+    buildInputs = [
+      mpv-unwrapped.dev
+      ffmpeg
+      openssl
+      libffi
+      zlib
+      curl.dev
+      python
+    ];
+
+    checkInputs = [
+      # Needed for the tests in `libmpv2`
+      SDL2
+    ];
+
+    env = let
+      clang_version =
+        lib.versions.major
+        llvmPackages_latest.clang-unwrapped.version;
+    in {
+      # Needed for the compile time sqlite checks.
+      DATABASE_URL = "sqlite://database.sqlx";
+
+      # Required by yt_dlp
+      FFMPEG_LOCATION = "${lib.getExe ffmpeg}";
+
+      # Tell pyo3 which python to use.
+      PYO3_PYTHON = lib.getExe python;
+
+      # Needed for the libmpv2.
+      C_INCLUDE_PATH = "${glibc.dev}/include";
+      LIBCLANG_INCLUDE_PATH = "${llvmPackages_latest.clang-unwrapped.lib}/lib/clang/${clang_version}/include";
+      LIBCLANG_PATH = "${llvmPackages_latest.clang-unwrapped.lib}/lib/libclang.so";
+    };
+
+    doCheck = true;
+    checkFlags = [
+      # All of these tests try to connect to the internet to download test data.
+      "--skip=select::base::test_base"
+      "--skip=select::file::test_file"
+      "--skip=select::options::test_options"
+      "--skip=subscriptions::import_export::test_import_export"
+      "--skip=subscriptions::naming_subscriptions::test_naming_subscriptions"
+      "--skip=videos::downloading::test_downloading"
+    ];
+
+    prePatch = ''
+      # Generate the sqlite db, so that we can run the comp-time sqlite checks.
+      bash ./scripts/mkdb.sh
+    '';
+
+    passthru = {
+      inherit tree-sitter-yts;
+    };
+
+    cargoLock = {
+      lockFile = ../Cargo.lock;
+    };
+
+    postInstall = ''
+      installShellCompletion --cmd yt \
+        --bash <(COMPLETE=bash $out/bin/yt) \
+        --fish <(COMPLETE=fish $out/bin/yt) \
+        --zsh <(COMPLETE=zsh $out/bin/yt)
+
+      # NOTE: We cannot clear the path, because we need access to the $EDITOR. <2025-04-04>
+      wrapProgram $out/bin/yt \
+        --prefix PATH : ${lib.makeBinPath finalAttrs.buildInputs} \
+        --set YTDLP_NO_PLUGINS 1
+    '';
+  })