c7f94ff3ce
GitOrigin-RevId: b85ed9dcbf187b909ef7964774f8847d554fab3b
166 lines
4.7 KiB
Nix
166 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 ];
|
|
};
|
|
})
|