mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-05 05:13:04 +00:00
e138e656c7
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.
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 ];
|
|
};
|
|
})
|