Unverified Commit 7641151c authored by Sandro Jäckel's avatar Sandro Jäckel Committed by GitHub
Browse files

Merge pull request #180732 from lilyinstarlight/pkg/sonic-pi-v4

sonic-pi: 3.3.1 -> 4.0.3
parents 9b3ffbf7 ff519d50
Loading
Loading
Loading
Loading
+169 −76
Original line number Diff line number Diff line
{ mkDerivation
{ stdenv
, lib
, qtbase
, fetchFromGitHub
, wrapQtAppsHook
, makeDesktopItem
, copyDesktopItems
, cmake
, pkg-config
, catch2_3
, qtbase
, qtsvg
, qttools
, qwt
, qscintilla
, kissfftFloat
, crossguid
, reproc
, platform-folders
, ruby
, erlang
, aubio
, elixir
, beamPackages
, alsa-lib
, rtmidi
, libsndfile
, cmake
, pkg-config
, boost
, bash
, aubio
, jack2
, supercollider-with-sc3-plugins
, qwt
, parallel

, withTauWidget ? false
, qtwebengine

, withImGui ? false
, gl3w
, SDL2
, fmt
}:

let
stdenv.mkDerivation rec {
  pname = "sonic-pi";
  version = "3.3.1";
  version = "4.0.3";

  src = fetchFromGitHub {
    owner = "sonic-pi-net";
    repo = "sonic-pi";
    repo = pname;
    rev = "v${version}";
    sha256 = "sha256-AE7iuSNnW1SAtBMplReGzXKcqD4GG23i10MIAWnlcPo=";
    hash = "sha256-kTuW+i/kdPhyG3L6SkgQTE9UvADY49KahJcw3+5Uz4k=";
  };

  # sonic pi uses it's own aubioonset with hardcoded parameters but will compile a whole aubio for it
  # let's just build the aubioonset instead and link against aubio from nixpkgs
  aubioonset = mkDerivation {
    name = "aubioonset";
    src = src;
    sourceRoot = "source/app/external/aubio/examples";
    buildInputs = [jack2 aubio libsndfile];
    patchPhase = ''
      sed -i "s@<aubio.h>@<aubio/aubio.h>@" jackio.c utils.h
    '';
    buildPhase = ''
      gcc -o aubioonset -laubio jackio.c utils.c aubioonset.c
    '';
    installPhase = ''
      install -D aubioonset $out/aubioonset
    '';
  mixFodDeps = beamPackages.fetchMixDeps {
    inherit version;
    pname = "mix-deps-${pname}";
    mixEnv = "test";
    src = "${src}/app/server/beam/tau";
    sha256 = "sha256-MvwUyVTS23vQKLpGxz46tEVCs/OyYk5dDaBlv+kYg1M=";
  };

in
  strictDeps = true;

mkDerivation rec {
  inherit pname version src;
  nativeBuildInputs = [
    wrapQtAppsHook
    copyDesktopItems

  nativeBuildInputs = [ cmake ];
  buildInputs = [
    bash
    cmake
    pkg-config

    erlang
    elixir
    beamPackages.hex
  ];

  buildInputs = [
    qtbase
    qtsvg
    qttools
    qwt
    qscintilla
    kissfftFloat
    catch2_3
    crossguid
    reproc
    platform-folders
    ruby
    aubio
    supercollider-with-sc3-plugins
    boost
    erlang
    alsa-lib
    rtmidi
    boost
    aubio
  ] ++ lib.optionals withTauWidget [
    qtwebengine
  ] ++ lib.optionals withImGui [
    gl3w
    SDL2
    fmt
  ];

  checkInputs = [
    parallel
    ruby
    supercollider-with-sc3-plugins
    jack2
  ];

  cmakeFlags = [
    "-DUSE_SYSTEM_LIBS=ON"
    "-DBUILD_IMGUI_INTERFACE=${if withImGui then "ON" else "OFF"}"
    "-DWITH_QT_GUI_WEBENGINE=${if withTauWidget then "ON" else "OFF"}"
  ];

  dontUseCmakeConfigure = true;
  doCheck = true;

  prePatch = ''
    sed -i '/aubio/d' app/external/linux_build_externals.sh
    sed -i '/aubio/d' app/linux-prebuild.sh
    patchShebangs app
  postPatch = ''
    # Fix shebangs on files in app and bin scripts
    patchShebangs app bin
  '';

  configurePhase = ''
    runHook preConfigure
  preConfigure = ''
    # Set build environment
    export SONIC_PI_HOME="$TMPDIR/spi"

    export HEX_HOME="$TEMPDIR/hex"
    export HEX_OFFLINE=1
    export MIX_REBAR3='${beamPackages.rebar3}/bin/rebar3'
    export REBAR_GLOBAL_CONFIG_DIR="$TEMPDIR/rebar3"
    export REBAR_CACHE_DIR="$TEMPDIR/rebar3.cache"
    export MIX_HOME="$TEMPDIR/mix"
    export MIX_DEPS_PATH="$TEMPDIR/deps"
    export MIX_ENV=prod

    # Copy Mix dependency sources
    echo 'Copying ${mixFodDeps} to Mix deps'
    cp --no-preserve=mode -R '${mixFodDeps}' "$MIX_DEPS_PATH"

    ./app/linux-prebuild.sh
    ./app/linux-config.sh
    # Change to project base directory
    cd app

    runHook postConfigure
    # Prebuild Ruby vendored dependencies and Qt docs
    ./linux-prebuild.sh -o

    # Append CMake flag depending on the value of $out
    cmakeFlags+=" -DAPP_INSTALL_ROOT=$out/app"
  '';

  postBuild = ''
    # Build BEAM server
    ../linux-post-tau-prod-release.sh -o
  '';

  buildPhase = ''
    runHook preBuild
  checkPhase = ''
    runHook preCheck

    # BEAM tests
    pushd ../server/beam/tau
      MIX_ENV=test TAU_ENV=test mix test
    popd

    # Ruby tests
    pushd ../server/ruby
      rake test
    popd

    pushd app/build
    cmake --build . --config Release
    # API tests
    pushd api-tests
      # run JACK parallel to tests and quit both when one exits
      SONIC_PI_ENV=test parallel --no-notice -j2 --halt now,done=1 ::: 'jackd -rd dummy' 'ctest --verbose'
    popd

    runHook postBuild
    runHook postCheck
  '';

  installPhase = ''
    runHook preInstall

    mkdir $out
    cp -r {bin,etc} $out/

    # Copy server whole.
    mkdir -p $out/app
    cp -r app/server $out/app/
    # Run Linux release script
    ../linux-release.sh

    # We didn't build this during linux-prebuild.sh so copy from the separate derivation
    cp ${aubioonset}/aubioonset $out/app/server/native/
    # Copy dist directory to output
    mkdir $out
    cp -r linux_dist/* $out/

    # Copy only necessary files for the gui app.
    mkdir -p $out/app/gui/qt
    cp -r app/gui/qt/{book,fonts,help,html,images,image_source,info,lang,theme} $out/app/gui/qt/
    mkdir -p $out/app/build/gui/qt
    cp app/build/gui/qt/sonic-pi $out/app/build/gui/qt/sonic-pi
    # Copy icon
    install -Dm644 ../gui/qt/images/icon-smaller.png $out/share/icons/hicolor/256x256/apps/sonic-pi.png

    runHook postInstall
  '';
@@ -117,19 +187,42 @@ mkDerivation rec {
  # $out/bin/sonic-pi is a shell script, and wrapQtAppsHook doesn't wrap them.
  dontWrapQtApps = true;
  preFixup = ''
    wrapQtApp "$out/bin/sonic-pi" \
      --prefix PATH : ${lib.makeBinPath [ bash jack2 ruby supercollider-with-sc3-plugins erlang] }
    makeWrapper \
      $out/app/server/ruby/bin/sonic-pi-server.rb \
      $out/bin/sonic-pi-server \
      --prefix PATH : ${lib.makeBinPath [ bash jack2 ruby supercollider-with-sc3-plugins erlang ] }
    # Wrap Qt GUI (distributed binary)
    wrapQtApp $out/bin/sonic-pi \
      --prefix PATH : ${lib.makeBinPath [ ruby supercollider-with-sc3-plugins jack2 ]}

    # If ImGui was built
    if [ -e $out/app/build/gui/imgui/sonic-pi-imgui ]; then
      # Wrap ImGui into bin
      makeWrapper $out/app/build/gui/imgui/sonic-pi-imgui $out/bin/sonic-pi-imgui \
        --inherit-argv0 \
        --prefix PATH : ${lib.makeBinPath [ ruby supercollider-with-sc3-plugins jack2 ]}
    fi

    # Remove runtime Erlang references
    for file in $(grep -FrIl '${erlang}/lib/erlang' $out/app/server/beam/tau); do
      substituteInPlace "$file" --replace '${erlang}/lib/erlang' $out/app/server/beam/tau/_build/prod/rel/tau
    done
  '';

  meta = {
  stripDebugList = [ "app" "bin" ];

  desktopItems = [
    (makeDesktopItem {
      name = "sonic-pi";
      exec = "sonic-pi";
      icon = "sonic-pi";
      desktopName = "Sonic Pi";
      comment = meta.description;
      categories = [ "Audio" "AudioVideo" "Education" ];
    })
  ];

  meta = with lib; {
    homepage = "https://sonic-pi.net/";
    description = "Free live coding synth for everyone originally designed to support computing and music lessons within schools";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ Phlogistique kamilchm c0deaddict sohalt lilyinstarlight ];
    platforms = lib.platforms.linux;
    license = licenses.mit;
    maintainers = with maintainers; [ Phlogistique kamilchm c0deaddict sohalt lilyinstarlight ];
    platforms = platforms.linux;
  };
}
+24 −0
Original line number Diff line number Diff line
{ lib, stdenv, fetchFromGitHub, cmake, libuuid }:

stdenv.mkDerivation rec {
  pname = "crossguid";
  version = "unstable-2019-05-29";

  src = fetchFromGitHub {
    owner = "graeme-hill";
    repo = pname;
    rev = "ca1bf4b810e2d188d04cb6286f957008ee1b7681";
    hash = "sha256-37tKPDo4lukl/aaDWWSQYfsBNEnDjE7t6OnEZjBhcvQ=";
  };

  nativeBuildInputs = [ cmake ];
  buildInputs = lib.optional stdenv.isLinux libuuid;

  meta = with lib; {
    description = "Lightweight cross platform C++ GUID/UUID library";
    license = licenses.mit;
    homepage = "https://github.com/graeme-hill/crossguid";
    maintainers = with maintainers; [ lilyinstarlight ];
    platforms = platforms.unix;
  };
}
+37 −0
Original line number Diff line number Diff line
{ lib, stdenv, fetchFromGitHub, python3, cmake, libglvnd, libGLU }:

stdenv.mkDerivation rec {
  pname = "gl3w";
  version = "unstable-2022-03-24";

  src = fetchFromGitHub {
    owner = "skaslev";
    repo = pname;
    rev = "5f8d7fd191ba22ff2b60c1106d7135bb9a335533";
    hash = "sha256-qV/PZmaP5iCHhIzTA2bE4d1RMB6LzRbTsB5gWVvi9bU=";
  };

  nativeBuildInputs = [ python3 cmake ];
  # gl3w installs a CMake config that when included expects to be able to
  # build and link against both of these libraries
  # (the gl3w generated C file gets compiled into the downstream target)
  propagatedBuildInputs = [ libglvnd libGLU ];

  dontUseCmakeBuildDir = true;

  # These files must be copied rather than linked since they are considered
  # outputs for the custom command, and CMake expects to be able to touch them
  preConfigure = ''
    mkdir -p include/{GL,KHR}
    cp ${libglvnd.dev}/include/GL/glcorearb.h include/GL/glcorearb.h
    cp ${libglvnd.dev}/include/KHR/khrplatform.h include/KHR/khrplatform.h
  '';

  meta = with lib; {
    description = "Simple OpenGL core profile loading";
    homepage = "https://github.com/skaslev/gl3w";
    license = licenses.unlicense;
    maintainers = with maintainers; [ lilyinstarlight ];
    platforms = platforms.unix;
  };
}
+27 −0
Original line number Diff line number Diff line
{ lib, stdenv, fetchFromGitHub, cmake }:

stdenv.mkDerivation rec {
  pname = "platform-folders";
  version = "4.2.0";

  src = fetchFromGitHub {
    owner = "sago007";
    repo = "PlatformFolders";
    rev = version;
    hash = "sha256-ruhAP9kjwm6pIFJ5a6oy6VE5W39bWQO3qSrT5IUtiwA=";
  };

  nativeBuildInputs = [ cmake ];

  cmakeFlags = [
    "-DBUILD_SHARED_LIBS=${if stdenv.hostPlatform.isStatic then "OFF" else "ON"}"
  ];

  meta = with lib; {
    description = "A C++ library to look for standard platform directories so that you do not need to write platform-specific code";
    homepage = "https://github.com/sago007/PlatformFolders";
    license = licenses.mit;
    maintainers = with maintainers; [ lilyinstarlight ];
    platforms = platforms.all;
  };
}
+9 −0
Original line number Diff line number Diff line
@@ -17408,6 +17408,8 @@ with pkgs;
  croaring = callPackage ../development/libraries/croaring { };
  crossguid = callPackage ../development/libraries/crossguid { };
  cryptopp = callPackage ../development/libraries/crypto++ { };
  cryptominisat = callPackage ../applications/science/logic/cryptominisat { };
@@ -18039,6 +18041,8 @@ with pkgs;
  # A GMP fork
  mpir = callPackage ../development/libraries/mpir {};
  gl3w = callPackage ../development/libraries/gl3w { };
  gnatcoll-core = callPackage ../development/libraries/ada/gnatcoll/core.nix { };
  # gnatcoll-bindings repository
@@ -20581,6 +20585,8 @@ with pkgs;
  place-cursor-at = haskell.lib.compose.justStaticExecutables haskellPackages.place-cursor-at;
  platform-folders = callPackage ../development/libraries/platform-folders { };
  plib = callPackage ../development/libraries/plib { };
  poco = callPackage ../development/libraries/poco { };
@@ -20860,6 +20866,9 @@ with pkgs;
  rtrlib = callPackage ../development/libraries/rtrlib { };
  kissfft = callPackage ../development/libraries/kissfft { };
  kissfftFloat = kissfft.override {
    datatype = "float";
  };
  lambdabot = callPackage ../development/tools/haskell/lambdabot {
    haskellLib = haskell.lib.compose;