NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
17.98k stars 13.99k forks source link

Update request: liquidsoap 2.1.4 → 2.2.0 #250342

Closed nagisa closed 10 months ago

nagisa commented 1 year ago

Notify maintainers

@dandellion @ehmry


Note for maintainers: Please tag this issue in your PR.


Additional context: I have attempted to make this upgrade myself, however this has required more changes than just basic source update – version of liquidsoap now has dependencies on camomile >= 2.0.0 (not packaged yet), ocaml-metadata and even after I added packages for those, the build still failed in a way that I wasn’t able to figure out.

It is important that we keep this package up-to date as I have found couple instances already where the documentation was no longer applicable to the version available in nixpkgs, leading me to get stuck.

spietras commented 1 year ago

I think I somehow managed to make it work. I know very little about OCaml, opam or Dune, so this is mainly a product of trial and error. If anyone knows a better way to do this, feel free to pick up the code and make it better. Note that instead of the 2.2.0 version, I used the latest commit from the main branch, because I wanted all of the latest changes. But from what I can tell, not much has changed since the release, at least when it comes to building the project. There are however some API changes and that's why I needed to use the latest commit in the flac package also. Here's the whole file (I might edit it if I find some improvements myself):

{
  stdenv,
  lib,
  fetchFromGitHub,
  makeWrapper,
  git,
  dune_3,
  ocamlPackages,
  bubblewrap,
  youtube-dl,
  ffmpeg,
  awscli2,
  flac,
  faad2,
  curl,
}: let
  version = "bcd9cb8";
  rev = version;
  sha256 = "sha256-2QBRks3dIsaeEYG1czVyw8kjvpjCc/Qy2CjYpI3yOJ8=";

  src = fetchFromGitHub {
    inherit rev sha256;

    owner = "savonet";
    repo = "liquidsoap";
  };

  runtimePackages = [
    bubblewrap
    youtube-dl
    ffmpeg
    awscli2
    flac
    faad2
    curl
  ];

  customOcamlPackages = {
    cry = let
      version = "1.0.1";
      rev = "refs/tags/v${version}";
      sha256 = "sha256-wn9hLqbydzFTdYsJ1e76dmDLtwcZ7CGjbzFe5o9veYQ=";
    in
      ocamlPackages.cry.overrideAttrs (f: p: {
        inherit version;

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "savonet";
          repo = "ocaml-cry";
        };
      });

    camomile = let
      version = "2.0.0";
      rev = "refs/tags/v${version}";
      sha256 = "sha256-HklX+VPD0Ta3Knv++dBT2rhsDSlDRH90k4Cj1YtWIa8=";
    in
      ocamlPackages.buildDunePackage {
        inherit version;

        pname = "camomile";

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "ocaml-community";
          repo = "Camomile";
        };

        propagatedBuildInputs = [
          ocamlPackages.dune-site
          ocamlPackages.camlp-streams
        ];
      };

    metadata = let
      version = "0.2.0";
      rev = "refs/tags/v${version}";
      sha256 = "sha256-sSekkyJ8D6mCCmxIyd+pBk/khaehA3BcpUQl2Gln+Ic=";
    in
      ocamlPackages.buildDunePackage {
        inherit version;

        pname = "metadata";

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "savonet";
          repo = "ocaml-metadata";
        };
      };

    ffmpeg = let
      version = "1.1.8";
      rev = "refs/tags/v${version}";
      sha256 = "sha256-XqZATaxpW0lEdrRTXVTc0laQAx437+eoa/zOzZV1kHk=";

      ffmpeg-base = {
        version = version;
        duneVersion = "3";
        meta = {};

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "savonet";
          repo = "ocaml-ffmpeg";
        };
      };

      ffmpeg-avutil = ocamlPackages.ffmpeg-avutil.override {inherit ffmpeg-base;};
      ffmpeg-avcodec = ocamlPackages.ffmpeg-avcodec.override {inherit ffmpeg-base ffmpeg-avutil;};
      ffmpeg-avfilter = ocamlPackages.ffmpeg-avfilter.override {inherit ffmpeg-base ffmpeg-avutil;};
      ffmpeg-swscale = ocamlPackages.ffmpeg-swscale.override {inherit ffmpeg-base ffmpeg-avutil;};
      ffmpeg-swresample = ocamlPackages.ffmpeg-swresample.override {inherit ffmpeg-base ffmpeg-avutil ffmpeg-avcodec;};
      ffmpeg-av = ocamlPackages.ffmpeg-av.override {inherit ffmpeg-base ffmpeg-avutil ffmpeg-avcodec;};
      ffmpeg-avdevice = ocamlPackages.ffmpeg-avdevice.override {inherit ffmpeg-base ffmpeg-av;};
    in
      ocamlPackages.ffmpeg.override {
        inherit ffmpeg-base ffmpeg-avutil ffmpeg-avcodec ffmpeg-avfilter ffmpeg-swscale ffmpeg-swresample ffmpeg-av ffmpeg-avdevice;
      };

    flac = let
      version = "cb7f94c";
      rev = version;
      sha256 = "sha256-+JhltsjCR026Sig3U65RBZzohS1z4T7wYeazNXctGRI=";
    in
      ocamlPackages.flac.overrideAttrs (f: p: {
        inherit version;

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "savonet";
          repo = "ocaml-flac";
        };
      });

    lame = let
      version = "0.3.7";
      rev = "refs/tags/v${version}";
      sha256 = "sha256-/ZzoGFQQrBf17TaBPSFDQ1yHaQnva56YLmscOacrKBI=";
    in
      ocamlPackages.lame.overrideAttrs (f: p: {
        inherit version;

        src = fetchFromGitHub {
          inherit rev sha256;

          owner = "savonet";
          repo = "ocaml-lame";
        };
      });
  };
in
  stdenv.mkDerivation {
    inherit version src;

    pname = "liquidsoap";

    installPhase = ''
      runHook preInstall
      dune install --prefix $out --libdir $OCAMLFIND_DESTDIR --docdir $out/share/doc --mandir $out/share/man
      runHook postInstall
    '';

    postFixup = ''
      wrapProgram $out/bin/liquidsoap \
        --prefix PATH : ${lib.makeBinPath runtimePackages}
    '';

    nativeBuildInputs = [
      makeWrapper
      git
      dune_3
      ocamlPackages.ocaml
      ocamlPackages.findlib
      ocamlPackages.menhir
    ];

    propagatedBuildInputs = [
      # Required dependencies
      ocamlPackages.dtools
      ocamlPackages.duppy
      ocamlPackages.mm
      ocamlPackages.ocaml_pcre
      ocamlPackages.ocurl
      customOcamlPackages.cry
      customOcamlPackages.camomile
      ocamlPackages.uri
      ocamlPackages.fileutils
      customOcamlPackages.metadata
      ocamlPackages.dune-build-info
      ocamlPackages.dune-site
      ocamlPackages.ppx_string
      ocamlPackages.sedlex
      ocamlPackages.menhirLib

      # Optional dependencies
      ocamlPackages.alsa
      ocamlPackages.ao
      ocamlPackages.bjack
      ocamlPackages.dssi
      ocamlPackages.faad
      ocamlPackages.fdkaac
      customOcamlPackages.ffmpeg
      customOcamlPackages.flac
      ocamlPackages.inotify
      ocamlPackages.ladspa
      customOcamlPackages.lame
      ocamlPackages.lilv
      ocamlPackages.lo
      ocamlPackages.mad
      ocamlPackages.magic
      ocamlPackages.ogg
      ocamlPackages.opus
      ocamlPackages.portaudio
      ocamlPackages.posix-time2
      ocamlPackages.pulseaudio
      ocamlPackages.samplerate
      ocamlPackages.shine
      ocamlPackages.soundtouch
      ocamlPackages.speex
      ocamlPackages.srt
      ocamlPackages.ssl
      ocamlPackages.taglib
      ocamlPackages.theora
      ocamlPackages.vorbis
      ocamlPackages.yaml
      ocamlPackages.xmlplaylist
    ];
  }
wegank commented 10 months ago

Closed by #267817.