nixpkgs/pkgs/development/tools/godot/3/default.nix
rotaerk e138e656c7 godot3: refactor and rename from godot
The godot base derivation was implemented by passing a recursive
attrset to mkDerivation. This is problematic because recursive
references to attributes that are later overridden don't notice the
override. Switched to the approach of giving mkDerivation a lambda
that receives a self argument, which allows recursive references to
the final value after overrides are applied.

The related derivations (for export templates, headless, and server
builds of godot) duplicated content from the base derivation. This
refactor eliminated that by using overridable attributes to
parameterize the scripts.

The main motivation for this refactor was to help me add derivations
for mono builds of godot.

Renamed to godot3 to distinguish from version 4, which is a complete
rewrite and effectively a different tool altogether.
2023-07-30 18:46:07 -04:00

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 ];
};
})