spacefrogg-overlay/x-plane/default.nix

231 lines
7.8 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Does not touch paths inside xplanePathStr.
# Setup needed to integrate the addons.
# HeadShake
# Create the following softlink:
# ln -sf /xplane-extra/HeadShake $xplanePathStr/Resources/plugins
# Beautiful Roads:
# Rename the following directory in "$xplanePathStr/Resources/default scenery/1000 roads":
# mv textures textures.orig
#
# and create the following softlink to textures:
# ln -sf /xplane-extra/beautiful-roads textures
#
# To switch to the old roads, callPackage this file with the beautifulRoads
# attribute set to null.
{ stdenv
, lib
, writeScript
, buildFHSUserEnv
, xplanePathStr, unzip
, addons ? []
, name ? "x-plane-env"
}:
let
inherit (lib) concatMapStrings optionalString unique;
runScript = writeScript "x-plane-script" ''
#!${stdenv.shell}
usage() {
cat <<EOF >&2
${name} OPT
X-Plane run X-Plane (default)
Airfoil run Airfoil Maker
Plane run Plane Maker
Installer run Installer
SHELL run bash inside FHS environment
prepare prepare all currently activated addons
revert [ADDON]...
remove modifications from named addons
navdata FILE [OLDCYCLE]
update navigation DB
ortho update links to zOrtho4XP scenery files
/abs/path [ARG]...
run /abs/path inside FHS environment
rel/path [ARG]...
run $XPLANEPATH/rel/path inside FHS environment
EOF
}
sys=${stdenv.targetPlatform.system}
sys=''${sys%-linux}
bin=$1
: ''${XPLANEPATH:=${xplanePathStr}}
export XPLANEPATH
case "$bin" in
--help) usage; exit ;;
X-Plane) exec "''${XPLANEPATH}/X-Plane-$sys" ;;
Airfoil*) exec "''${XPLANEPATH}/Airfoil Maker-$sys" ;;
Plane*) exec "''${XPLANEPATH}/Plane Maker-$sys" ;;
Installer*) for f in "''${XPLANEPATH}/X-Plane "*" Installer Linux"; do exec "$f"; break; done ;;
''') exec "''${XPLANEPATH}/X-Plane-$sys" ;;
SHELL) exec "bash" ;;
prepare) exec ${prepareScript} ;;
revert) shift; exec ${revertScript} "$@" ;;
navdata) shift; exec ${navdbScript} "$@" ;;
ortho) exec ${orthoScript} ;;
/*) exec "$@" ;;
*) shift; exec "''${XPLANEPATH}/$bin" "$@" ;;
esac
'';
uniqueAddons = unique addons;
prepareScript = writeScript "x-plane-addons-prepare" (''
#!${stdenv.shell}
set -e
: ''${XPLANEPATH:=${xplanePathStr}}
printf "Preparing %s for accessing addons\n" "$XPLANEPATH" >&2
mkdir -p "$XPLANEPATH/.addons"
if [ -f "$XPLANEPATH/.addons/dont-prepare" ]; then
printf "Warning: %s found. Not preparing tree.\n" "$XPLANEPATH/.addons/dont-prepare" >&2
exit 1
fi
'' + (concatMapStrings (addon:
optionalString (addon.passthru ? prepare) (''
# Addon ${addon.pname}-${addon.version}
ADDONPATH=${addon}
printf "Preparing %s\n" "${addon.pname}-${addon.version}" >&2
if [ -f "$XPLANEPATH/.addons/revert-${addon.pname}" ]; then
printf "Warning: Old revert script found. Not modifying X-Plane tree. Revert first.\n" >&2
else
${addon.passthru.prepare}
'' + (if (addon.passthru ? revert) then ''
cat <<'EOF' >"$XPLANEPATH/.addons/revert-${addon.pname}"
#!/usr/bin/env bash
set -e
${addon.passthru.revert}
rm $0
EOF
chmod +x "$XPLANEPATH/.addons/revert-${addon.pname}"
fi
'' else ''
fi
''))) uniqueAddons));
revertScript = writeScript "x-plane-addons-revert" ''
#!/bin/sh
set -e
: ''${XPLANEPATH:=${xplanePathStr}}
printf "Reverting modifications made to %s\n" "$XPLANEPATH";
if [ $# -eq 0 ]; then
printf "Reverting all modifications\n"
for f in "$XPLANEPATH/.addons"/revert-* ; do
printf "Reverting %s\n" "''${f##*/revert-}"
"''${f}" || { printf "Failed reverting %s\n" "''${f##*/revert-}. Stopping"; exit 1; }
done
else
for f in "$@" ; do
printf "Reverting %s\n" "''${f##*/revert-}"
"$XPLANEPATH"/.addons/revert-"''${f##*/revert-}"
done
fi
'';
navdbScript = writeScript "update-navdata" ''
#!/usr/bin/env bash
set -euo pipefail
: ''${XPLANEPATH:=${xplanePathStr}}
[ $# -ne 0 ] || {
printf "usage: update-navdata FILE [OLDCYCLE]\n\nFILE xplane11_native_CYCL.zip file\nOLDCYCLE old cycle ID for backup (default auto detect)\n" >&2
exit 1; }
if [ $# -ge 2 ]; then
oldcycle=$2
elif [ -e "$XPLANEPATH/Custom Data/cycle_info.txt" ]; then
oldcycle=$(head -n1 "$XPLANEPATH/Custom Data/cycle_info.txt" | sed -E -n -e "s/^AIRAC cycle[ :]+([0-9]+)\r$/\1/p")
[ -n "$oldcycle" ] || { printf "Unable to determine old AIRAC cycle\n" >&2; exit 1; }
else
oldcycle=
fi
f=$1
[ -e "$f" ] || { printf "No such file or directory\n" >&2; exit 1; }
cycle=''${1##*_}
cycle=''${cycle%.zip}
newpath="$XPLANEPATH/Custom Data AIRAC$cycle"
if [ -z "$oldcycle" ]; then
rm -r "$XPLANEPATH/Custom Data"
elif [ ! -h "$XPLANEPATH/Custom Data" ]; then
mv "$XPLANEPATH/Custom Data" "$XPLANEPATH/Custom Data AIRAC$oldcycle"
fi
if [ -d "$newpath" ]; then
rm -rf "$newpath"
fi
${lib.getBin unzip}/bin/unzip -d "$newpath" "$f"
cat <<EOF >"$newpath/Readme.txt"
Place newer navigational data for the global database in THIS folder.
If you want to replace any of X-Plane's
earth_nav.dat
earth_awy.dat
earth_fix.dat
CIFP/*
with newer data, then place them HERE IN THIS FOLDER to avoid conflicts with the X-Plane updater.
Note that this database is also used by X-Planes GPS and previously needed files in other subfolders are now ignored.
Also, you can place the FAACIFP18 file here, which you can get from the FAA website: https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/cifp/
If the file FAACIFP18 is found in this folder, X-Plane will load instrument flight procedures from this file.
EOF
rm -f "$XPLANEPATH/Custom Data"
ln -sf "$newpath" "$XPLANEPATH/Custom Data"
'';
orthoScript = writeScript "update-scenery-packs-ini" ''
: ''${XPLANEPATH:=${xplanePathStr}}
(
cd "$XPLANEPATH"
sed -i -e '/^SCENERY_PACK Custom Scenery\/zOrtho4XP_.*$/d' "Custom Scenery/scenery_packs.ini"
for f in "Custom Scenery/zOrtho4XP_"*; do
echo "SCENERY_PACK $f/"
done >>"Custom Scenery/scenery_packs.ini"
)
'';
in buildFHSUserEnv rec {
inherit name;
passthru = { inherit addons; };
# Also add GAppsWrapper environment stuff such that binaries see the GTK theme...
targetPkgs = pkgs: (with pkgs; [ unzip atk gdk-pixbuf cairo pango mesa_glu libGL openalSoft gtk2 glib dbus pulseaudio vulkan-tools vulkan-loader ] ++
(with xorg; [ libX11 libXext libXrandr libXcursor libXinerama ]) ++
# X-Plane 12
[ nss harfbuzz nspr cups at-spi2-core at-spi2-atk libdrm expat alsa-lib mesa ] ++
(with xorg; [ libXcomposite libXdamage libXfixes libxcb libxkbcommon ]) ++
# For reality expansion pack
[ stdenv.cc.cc.lib curl openssl ] ++
# For fly with lua
[ freeglut udev ]);
extraBuildCommands = ''
chmod u+w $out/etc
mkdir $out/etc/openal
chmod u-w $out/etc
echo "drivers=pulse" > $out/etc/openal/alsoft.conf
mkdir -p $out/xplane-extra
'' + (concatMapStrings (addon:
optionalString (addon.passthru ? build) ''
ADDONPATH=${addon}
printf "Addon ${addon.pname}\n" >&2
${addon.passthru.build}
'') uniqueAddons);
extraInstallCommands = ''
mkdir -p $out/share/zsh/site-functions
ln -s ${./x-plane-env.zcomp} $out/share/zsh/site-functions/_${name}
'';
inherit runScript;
}