167 lines
4.7 KiB
Nix
167 lines
4.7 KiB
Nix
|
{ lib
|
||
|
, stdenv
|
||
|
, alsa-lib
|
||
|
, alsa-plugins
|
||
|
, autoPatchelfHook
|
||
|
, fetchFromGitHub
|
||
|
, freetype
|
||
|
, installShellFiles
|
||
|
, libGLU
|
||
|
, libpulseaudio
|
||
|
, libX11
|
||
|
, libXcursor
|
||
|
, libXext
|
||
|
, libXfixes
|
||
|
, libXi
|
||
|
, libXinerama
|
||
|
, libXrandr
|
||
|
, libXrender
|
||
|
, makeWrapper
|
||
|
, openssl
|
||
|
, pkg-config
|
||
|
, scons
|
||
|
, udev
|
||
|
, yasm
|
||
|
, zlib
|
||
|
}:
|
||
|
|
||
|
stdenv.mkDerivation (self: {
|
||
|
pname = "godot3";
|
||
|
version = "3.5.2";
|
||
|
godotBuildDescription = "X11 tools";
|
||
|
|
||
|
src = fetchFromGitHub {
|
||
|
owner = "godotengine";
|
||
|
repo = "godot";
|
||
|
rev = "${self.version}-stable";
|
||
|
sha256 = "sha256-C+1J5N0ETL1qKust+2xP9uB4x9NwrMqIm8aFAivVYQw=";
|
||
|
};
|
||
|
|
||
|
nativeBuildInputs = [
|
||
|
autoPatchelfHook
|
||
|
installShellFiles
|
||
|
makeWrapper
|
||
|
pkg-config
|
||
|
scons
|
||
|
];
|
||
|
|
||
|
buildInputs = [
|
||
|
alsa-lib
|
||
|
freetype
|
||
|
libGLU
|
||
|
libpulseaudio
|
||
|
libX11
|
||
|
libXcursor
|
||
|
libXext
|
||
|
libXfixes
|
||
|
libXi
|
||
|
libXinerama
|
||
|
libXrandr
|
||
|
libXrender
|
||
|
openssl
|
||
|
udev
|
||
|
yasm
|
||
|
zlib
|
||
|
];
|
||
|
|
||
|
shouldAddLinkFlagsToPulse = true;
|
||
|
|
||
|
patches = map (rp: ./patches + rp) [
|
||
|
# The version of SConstruct in the godot source appends the OS's PATH to the Scons PATH,
|
||
|
# but because it is an append, the Scons PATH takes precedence. The Scons PATH contains a
|
||
|
# bunch of standard Linux paths like /usr/bin, so if they happen to contain versions of any
|
||
|
# build-time dependencies of Godot, they will be used instead of the Nix version of them.
|
||
|
#
|
||
|
# This patch simply replaces the entire Scons environment (including the PATH) with that
|
||
|
# of the OS. This isn't as surgical as just fixing the PATH, but it seems to work, and
|
||
|
# seems to be the Nix community's current strategy when using Scons.
|
||
|
/SConstruct/dontClobberEnvironment.patch
|
||
|
];
|
||
|
|
||
|
enableParallelBuilding = true;
|
||
|
godotBuildPlatform = "x11";
|
||
|
shouldBuildTools = true;
|
||
|
godotBuildTarget = "release_debug";
|
||
|
|
||
|
shouldUseLinkTimeOptimization = self.godotBuildTarget == "release";
|
||
|
|
||
|
sconsFlags = [
|
||
|
"arch=${stdenv.hostPlatform.linuxArch}"
|
||
|
"platform=${self.godotBuildPlatform}"
|
||
|
"tools=${lib.boolToString self.shouldBuildTools}"
|
||
|
"target=${self.godotBuildTarget}"
|
||
|
"bits=${toString stdenv.hostPlatform.parsed.cpu.bits}"
|
||
|
"use_lto=${lib.boolToString self.shouldUseLinkTimeOptimization}"
|
||
|
];
|
||
|
|
||
|
shouldWrapBinary = self.shouldBuildTools;
|
||
|
shouldInstallManual = self.shouldBuildTools;
|
||
|
shouldPatchBinary = self.shouldBuildTools;
|
||
|
shouldInstallHeaders = self.shouldBuildTools;
|
||
|
shouldInstallShortcut = self.shouldBuildTools && self.godotBuildPlatform != "server";
|
||
|
|
||
|
outputs = ["out"] ++ lib.optional self.shouldInstallManual "man" ++ lib.optional self.shouldBuildTools "dev";
|
||
|
|
||
|
builtGodotBinNamePattern = if self.godotBuildPlatform == "server" then "godot_server.*" else "godot.*";
|
||
|
|
||
|
godotBinInstallPath = "bin";
|
||
|
installedGodotBinName = self.pname;
|
||
|
installedGodotShortcutFileName = "org.godotengine.Godot3.desktop";
|
||
|
installedGodotShortcutDisplayName = "Godot Engine 3";
|
||
|
|
||
|
installPhase = ''
|
||
|
runHook preInstall
|
||
|
|
||
|
echo "Installing godot binaries."
|
||
|
outbin="$out/$godotBinInstallPath"
|
||
|
mkdir -p "$outbin"
|
||
|
cp -R bin/. "$outbin"
|
||
|
mv "$outbin"/$builtGodotBinNamePattern "$outbin/$installedGodotBinName"
|
||
|
|
||
|
if [ -n "$shouldWrapBinary" ]; then
|
||
|
wrapProgram "$outbin/$installedGodotBinName" \
|
||
|
--set ALSA_PLUGIN_DIR ${alsa-plugins}/lib/alsa-lib
|
||
|
fi
|
||
|
|
||
|
if [ -n "$shouldInstallManual" ]; then
|
||
|
echo "Installing godot manual."
|
||
|
mansrc=misc/dist/linux
|
||
|
mv "$mansrc"/godot.6 "$mansrc"/godot3.6
|
||
|
installManPage "$mansrc"/godot3.6
|
||
|
fi
|
||
|
|
||
|
if [ -n "$shouldInstallHeaders" ]; then
|
||
|
echo "Installing godot headers."
|
||
|
mkdir -p "$dev"
|
||
|
cp -R modules/gdnative/include "$dev"
|
||
|
fi
|
||
|
|
||
|
if [ -n "$shouldInstallShortcut" ]; then
|
||
|
echo "Installing godot shortcut."
|
||
|
mkdir -p "$out"/share/{applications,icons/hicolor/scalable/apps}
|
||
|
cp misc/dist/linux/org.godotengine.Godot.desktop "$out"/share/applications/$installedGodotShortcutFileName
|
||
|
cp icon.svg "$out"/share/icons/hicolor/scalable/apps/godot.svg
|
||
|
cp icon.png "$out"/share/icons/godot.png
|
||
|
substituteInPlace "$out"/share/applications/$installedGodotShortcutFileName \
|
||
|
--replace "Exec=godot" "Exec=\"$outbin/$installedGodotBinName\"" \
|
||
|
--replace "Name=Godot Engine" "Name=$installedGodotShortcutDisplayName"
|
||
|
fi
|
||
|
|
||
|
runHook postInstall
|
||
|
'';
|
||
|
|
||
|
runtimeDependencies = lib.optionals self.shouldPatchBinary (map lib.getLib [
|
||
|
alsa-lib
|
||
|
libpulseaudio
|
||
|
udev
|
||
|
]);
|
||
|
|
||
|
meta = with lib; {
|
||
|
homepage = "https://godotengine.org";
|
||
|
description = "Free and Open Source 2D and 3D game engine (" + self.godotBuildDescription + ")";
|
||
|
license = licenses.mit;
|
||
|
platforms = [ "i686-linux" "x86_64-linux" "aarch64-linux" ];
|
||
|
maintainers = with maintainers; [ rotaerk twey ];
|
||
|
};
|
||
|
})
|