Closed nagisa closed 10 months 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
];
}
Closed by #267817.
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.