diff --git a/pkgs/games/openmw/tes3mp.nix b/pkgs/games/openmw/tes3mp.nix index 863f818ed42..72b698ceb73 100644 --- a/pkgs/games/openmw/tes3mp.nix +++ b/pkgs/games/openmw/tes3mp.nix @@ -1,96 +1,134 @@ -{ lib, stdenv, cmake, openmw, fetchFromGitHub, luajit, makeWrapper, mygui }: +{ lib +, stdenv +, cmake +, openmw +, fetchFromGitHub +, formats +, luajit +, makeWrapper +, symlinkJoin +, mygui +, crudini +}: # revisions are taken from https://github.com/GrimKriegor/TES3MP-deploy let - # TES3MP_STABLE_VERSION_FILE - compatHash = "292536439eeda58becdb7e441fe2e61ebb74529e"; - rakNet = fetchFromGitHub { - owner = "TES3MP"; - repo = "CrabNet"; - # usually fixed: - # https://github.com/GrimKriegor/TES3MP-deploy/blob/d2a4a5d3acb64b16d9b8ca85906780aeea8d311b/tes3mp-deploy.sh#L589 - rev = "4eeeaad2f6c11aeb82070df35169694b4fb7b04b"; - sha256 = "0p0li9l1i5lcliswm5w9jql0zff9i6fwhiq0bl130m4i7vpr4cr3"; - }; - rakNetLibrary = stdenv.mkDerivation { - name = "RakNetLibrary"; - src = rakNet; - nativeBuildInputs = [ cmake ]; - installPhase = '' - install -Dm755 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a - ''; - }; - coreScripts = fetchFromGitHub { - owner = "TES3MP"; - repo = "CoreScripts"; - # usually latest in stable branch (e.g. 0.7.0) - rev = "24aae91d9ddad38cdb3b0e0a13af59f142803e94"; - sha256 = "1rfmxxr9ircfagdpbdrzl26msdhx1i3g974cblbv69078cradfh3"; - }; - # https://github.com/TES3MP/openmw-tes3mp/issues/555 - mygui_ = mygui.overrideAttrs (oldAttrs: rec { - version = "3.2.2"; + # raknet could also be split into dev and lib outputs + raknet = stdenv.mkDerivation { + pname = "raknet"; + version = "unstable-2018-07-14"; src = fetchFromGitHub { - owner = "MyGUI"; - repo = "mygui"; - rev = "MyGUI${version}"; - sha256 = "1wk7jmwm55rhlqqcyvqsxdmwvl70bysl9azh4kd9n57qlmgk3zmw"; + owner = "TES3MP"; + repo = "CrabNet"; + # usually fixed: + # https://github.com/GrimKriegor/TES3MP-deploy/blob/d2a4a5d3acb64b16d9b8ca85906780aeea8d311b/tes3mp-deploy.sh#L589 + rev = "4eeeaad2f6c11aeb82070df35169694b4fb7b04b"; + sha256 = "0p0li9l1i5lcliswm5w9jql0zff9i6fwhiq0bl130m4i7vpr4cr3"; + }; + + nativeBuildInputs = [ cmake ]; + + installPhase = '' + install -Dm555 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a + ''; + }; + + coreScripts = stdenv.mkDerivation { + pname = "corescripts"; + version = "unstable-2020-07-27"; + + src = fetchFromGitHub { + owner = "TES3MP"; + repo = "CoreScripts"; + # usually latest in stable branch (e.g. 0.7.1) + rev = "3c2d31595344db586d8585db0ef1fc0da89898a0"; + sha256 = "sha256-m/pt2Et58HOMc1xqllGf4hjPLXNcc14+X0h84ouZDeg="; + }; + + buildCommand = '' + dir=$out/share/openmw-tes3mp + mkdir -p $dir + cp -r $src $dir/CoreScripts + ''; + }; + + # build an unwrapped version so we don't have to rebuild it all over again in + # case the scripts or wrapper scripts change. + unwrapped = openmw.overrideAttrs (oldAttrs: rec { + pname = "openmw-tes3mp-unwrapped"; + version = "unstable-2020-08-07"; + + src = fetchFromGitHub { + owner = "TES3MP"; + repo = "openmw-tes3mp"; + # usually latest in stable branch (e.g. 0.7.1) + rev = "ce5df6d18546e37aac9746d99c00d27a7f34b00d"; + sha256 = "sha256-xLslShNA6rVFl9kt6BNGDpSYMpO25jBTCteLJoSTXdg="; + }; + + nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ makeWrapper ]; + + buildInputs = oldAttrs.buildInputs ++ [ luajit ]; + + cmakeFlags = oldAttrs.cmakeFlags ++ [ + "-DBUILD_OPENCS=OFF" + "-DRakNet_INCLUDES=${raknet.src}/include" + "-DRakNet_LIBRARY_RELEASE=${raknet}/lib/libRakNetLibStatic.a" + "-DRakNet_LIBRARY_DEBUG=${raknet}/lib/libRakNetLibStatic.a" + ]; + + # https://github.com/TES3MP/openmw-tes3mp/issues/552 + patches = [ ./tes3mp.patch ]; + + NIX_CFLAGS_COMPILE = "-fpermissive"; + + preConfigure = '' + substituteInPlace files/version.in \ + --subst-var-by OPENMW_VERSION_COMMITHASH ${src.rev} + ''; + + # move everything that we wrap out of the way + postInstall = '' + mkdir -p $out/libexec + mv $out/bin/tes3mp-* $out/libexec + ''; + + meta = with lib; { + description = "Multiplayer for TES3:Morrowind based on OpenMW"; + homepage = "https://tes3mp.com/"; + license = licenses.gpl3Only; + maintainers = with maintainers; [ peterhoeg ]; + platforms = [ "x86_64-linux" "i686-linux" ]; }; }); -in openmw.overrideAttrs (oldAttrs: rec { - version = "2019-11-19"; - name = "openmw-tes3mp-${version}"; - src = fetchFromGitHub { - owner = "TES3MP"; - repo = "openmw-tes3mp"; - # usually latest in stable branch (e.g. 0.7.0) - rev = "ad9ee80641a3e22d0780daca051df7f4e90f3615"; - sha256 = "03a1vldiv5lk7yq6lhicx3qz8hjfxhind2dj0w9lg5839ljyk6jv"; + cfgFile = (formats.ini { }).generate "tes3mp-server.cfg" { + Plugins.home = "${coreScripts}/share/openmw-tes3mp/CoreScripts"; }; - nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ makeWrapper ]; - buildInputs = [ luajit mygui_ ] ++ oldAttrs.buildInputs; +in +symlinkJoin rec { + name = "openmw-tes3mp-${unwrapped.version}"; + inherit (unwrapped) version meta; - cmakeFlags = oldAttrs.cmakeFlags ++ [ - "-DBUILD_OPENCS=OFF" - "-DRakNet_INCLUDES=${rakNet}/include" - "-DRakNet_LIBRARY_RELEASE=${rakNetLibrary}/lib/libRakNetLibStatic.a" - "-DRakNet_LIBRARY_DEBUG=${rakNetLibrary}/lib/libRakNetLibStatic.a" - ]; + nativeBuildInputs = [ makeWrapper ]; - dontWrapQtApps = true; + paths = [ unwrapped ]; - # https://github.com/TES3MP/openmw-tes3mp/issues/552 - patches = [ - ./tes3mp.patch - ]; - NIX_CFLAGS_COMPILE = "-fpermissive"; + # crudini --merge will create the file if it doesn't exist + postBuild = '' + mkdir -p $out/bin - preConfigure = '' - substituteInPlace files/version.in \ - --subst-var-by OPENMW_VERSION_COMMITHASH ${compatHash} - ''; + dir=\''${XDG_CONFIG_HOME:-\$HOME/.config}/openmw - postInstall = '' - # components/process/processinvoker.cpp: path.prepend(QLatin1String("./")) - wrapProgram $out/bin/tes3mp-browser \ + makeWrapper ${unwrapped}/libexec/tes3mp-browser $out/bin/tes3mp-browser \ --run "cd $out/bin" - wrapProgram $out/bin/tes3mp-server \ - --run "mkdir -p ~/.config/openmw" \ - --run "cd ~/.config/openmw" \ - --run "[ -d CoreScripts ] || cp --no-preserve=mode -r ${coreScripts} CoreScripts" \ - --run "[ -f tes3mp-server.cfg ] || echo \"[Plugins] home = \$HOME/.config/openmw/CoreScripts\" > tes3mp-server.cfg" \ + + makeWrapper ${unwrapped}/libexec/tes3mp-server $out/bin/tes3mp-server \ + --run "mkdir -p $dir" \ + --run "${crudini}/bin/crudini --merge $dir/${cfgFile.name} < ${cfgFile}" \ --run "cd $out/bin" ''; - - meta = with lib; { - description = "Multiplayer for TES3:Morrowind based on OpenMW"; - homepage = "https://tes3mp.com/"; - license = licenses.gpl3; - platforms = [ "x86_64-linux" "i686-linux" ]; - maintainers = with maintainers; [ ]; - }; -}) +}