2021-11-15 08:17:16 +00:00
# THIS IS A WORK IN PROGRESS!
{ pkgs ? import ( fetchTarball " h t t p s : / / g i t h u b . c o m / N i x O S / n i x p k g s / a r c h i v e / 2 f a 8 6 2 6 4 4 f c 1 5 e c b 5 2 5 e b 8 c d 0 a 6 0 2 7 6 f 1 c 3 4 0 c 7 c . t a r . g z " ) { }
# infrastructure
, lib ? pkgs . lib
, stdenv ? pkgs . stdenvNoCC
, buildDotnetModule ? pkgs . buildDotnetModule
, fetchFromGitHub ? pkgs . fetchFromGitHub
#, makeDesktopItem ? pkgs.makeDesktopItem
, makeWrapper ? pkgs . makeWrapper
, writeShellScriptBin ? pkgs . writeShellScriptBin
, writeText ? pkgs . writeText
# source
, useCWDAsSource ? false
, hawkVersion ? if useCWDAsSource then " 2 . 7 . 1 - l o c a l " else " 2 . 7 " # used to distinguish parallel installs' config and other data
, hawkSource ? if useCWDAsSource
then builtins . path {
path = ./. ;
name = " B i z H a w k - ${ hawkVersion } " ;
filter = let
denyList = [ " . i d e a " " E x t e r n a l C o r e P r o j e c t s " " E x t e r n a l P r o j e c t s " " E x t e r n a l T o o l P r o j e c t s " " l i b H a w k " " l i b m u p e n 6 4 p l u s " " L i b r e t r o B r i d g e " " L u a I n t e r f a c e " " l y n x " " p s x " " q u i c k n e s " " s u b m o d u l e s " " w a t e r b o x " " w o n d e r s w a n " ] ;
in path : type : type == " r e g u l a r " || ( type == " d i r e c t o r y " && ! builtins . elem ( baseNameOf path ) denyList ) ;
}
else fetchFromGitHub {
owner = " T A S E m u l a t o r s " ;
repo = " B i z H a w k " ;
rev = " d b a f 2 5 9 5 6 2 5 f 7 9 0 9 3 e e e c 3 7 d 2 d 4 a 7 a 9 a 4 d 3 7 f 3 7 0 " ;
2021-11-18 08:51:41 +00:00
hash = " s h a 2 5 6 - 2 M 9 + p 5 N Y C J Q l I t c y L x U 7 b Y 6 J C 5 / l a c M 5 j f Z o I L G k H r U = " ;
2021-11-15 08:17:16 +00:00
leaveDotGit = true ;
}
# makedeps
, git ? pkgs . git
, p7zip ? pkgs . p7zip
# rundeps for NixOS hosts
#, gtk2-x11 ? pkgs.gtk2-x11
# rundeps for all Linux hosts
, mesa ? pkgs . mesa
2021-11-18 12:39:15 +00:00
, mono ? null
2021-11-15 08:17:16 +00:00
, openal ? pkgs . openal
, uname ? stdenv
# other parameters
, buildConfig ? " R e l e a s e " # "Debug"/"Release"
, debugPInvokes ? false
, doCheck ? false # runs `Dist/BuildTest${buildConfig}.sh`
, forNixOS ? false
, initConfig ? { } # pretend this is JSON; the following env. vars will be substituted by the wrapper script (if surrounded by double-percent e.g. `%%BIZHAWK_DATA_HOME%%`): `BIZHAWK_DATA_HOME`
} :
let
2021-11-18 12:39:15 +00:00
commentUnless = b : lib . optionalString ( ! b ) " # " ;
2021-11-15 08:17:16 +00:00
versionAtLeast = reqVer : drv : builtins . compareVersions reqVer drv . version <= 0 ;
2021-11-18 12:39:15 +00:00
monoFinal = if mono != null
2021-11-15 08:17:16 +00:00
then mono
2021-11-18 12:39:15 +00:00
else if versionAtLeast " 6 . 1 2 . 0 . 1 5 1 " pkgs . mono
then pkgs . mono
else pkgs . callPackage ./mono-6.12.0.151.nix { } ;
2021-11-15 08:17:16 +00:00
bizhawk = buildDotnetModule rec {
pname = " B i z H a w k " ;
version = hawkVersion ;
src = hawkSource ;
nativeBuildInputs = [ git p7zip ] ;
buildInputs = [ mesa monoFinal openal uname ] ; # ++ lib.optionals (forNixOS) [ gtk2-x11 ];
projectFile = " B i z H a w k . s l n " ;
nugetDeps = ./deps.nix ;
extraDotnetBuildFlags = " - m a x c p u c o u n t : $ N I X _ B U I L D _ C O R E S - p : B u i l d I n P a r a l l e l = t r u e - - n o - r e s t o r e " ;
buildPhase = ''
2021-11-18 12:39:15 +00:00
$ { commentUnless useCWDAsSource } cd src/BizHawk.Version
$ { commentUnless useCWDAsSource } dotnet build $ { extraDotnetBuildFlags }
$ { commentUnless useCWDAsSource } cd ../..
2021-11-15 08:17:16 +00:00
Dist/Build $ { buildConfig } . sh $ { extraDotnetBuildFlags }
printf " N i x " > output/dll/custombuild.txt
Dist/Package.sh linux-x64
rm packaged_output/EmuHawkMono.sh # replaced w/ below script(s)
'' ;
inherit doCheck ;
checkPhase = ''
export GITLAB_CI = 1 # pretend to be in GitLab CI -- platform-specific tests don't run in CI because they assume an Arch filesystem (on Linux hosts)
# from 2.7.1, use standard -p:ContinuousIntegrationBuild=true instead
Dist/BuildTest $ { buildConfig } . sh $ { extraDotnetBuildFlags }
# can't build w/ extra Analyzers, it fails to restore :(
# Dist/Build${buildConfig}.sh -p:MachineRunAnalyzersDuringBuild=true ${extraDotnetBuildFlags}
'' ;
installPhase = ''
mkdir - p $ out
cp - aTv packaged_output $ out
'' ;
dontPatchELF = true ;
} ;
initConfigFile = writeText " c o n f i g . j s o n " ( builtins . toJSON ( {
LastWrittenFrom = if builtins . length ( builtins . splitVersion hawkVersion ) < 3 then " ${ hawkVersion } . 0 " else hawkVersion ;
PathEntries = {
Paths = [
2021-11-18 11:53:18 +00:00
( { " S y s t e m " = " G l o b a l _ N U L L " ; Type = " B a s e " ; Path = " % % B I Z H A W K _ D A T A _ H O M E % % " ; } // lib . optionalAttrs ( ! versionAtLeast " 2 . 7 . 1 " bizhawk ) { " O r d i n a l " = 1 ; } )
2021-11-15 08:17:16 +00:00
] ;
} ;
} // initConfig ) ) ;
wrapperScript = writeShellScriptBin " e m u h a w k - w r a p p e r " ''
set - e
if [ ! - e " $ B I Z H A W K _ H O M E / E m u H a w k . e x e " ] ; then
printf " n o s u c h f i l e : % s \n " " $ B I Z H A W K _ H O M E / E m u H a w k . e x e "
exit 1
fi
if [ " $ X D G _ D A T A _ H O M E " ] ; then
BIZHAWK_DATA_HOME = " $ X D G _ D A T A _ H O M E "
else
BIZHAWK_DATA_HOME = " $ H O M E / . l o c a l / s h a r e "
fi
BIZHAWK_DATA_HOME = " $ B I Z H A W K _ D A T A _ H O M E / e m u h a w k - m o n o r t - ${ hawkVersion } "
mkdir - p " $ B I Z H A W K _ D A T A _ H O M E "
cd " $ B I Z H A W K _ D A T A _ H O M E "
if [ ! - e config . json ] ; then
cat $ { initConfigFile } > config . json # cp kept the perms as 444 -- don't @ me
sed - i " s @ % % B I Z H A W K _ D A T A _ H O M E % % @ $ B I Z H A W K _ D A T A _ H O M E @ g " config . json
fi
export LD_LIBRARY_PATH = $ BIZHAWK_HOME/dll : $ BIZHAWK_GLHACKDIR : $ { lib . makeLibraryPath [ openal ] }
$ { commentUnless debugPInvokes } MONO_LOG_LEVEL = debug MONO_LOG_MASK = dll
if [ " $ 1 " = " - - m o n o - n o - r e d i r e c t " ] ; then
shift
printf " ( r e c e i v e d - - m o n o - n o - r e d i r e c t , s t d o u t w a s n o t c a p t u r e d ) \n " > EmuHawkMono_laststdout . txt
exec $ { monoFinal } /bin/mono $ BIZHAWK_HOME/EmuHawk.exe - - config = config . json " $ @ "
else
exec $ { monoFinal } /bin/mono $ BIZHAWK_HOME/EmuHawk.exe - - config = config . json " $ @ " > EmuHawkMono_laststdout . txt
fi
'' ;
wrapperScriptNonNixOS = writeShellScriptBin " e m u h a w k - w r a p p e r - n o n - n i x o s " ''
set - e
if [ " $ X D G _ S T A T E _ H O M E " ] ; then
BIZHAWK_GLHACKDIR = " $ X D G _ S T A T E _ H O M E "
else
BIZHAWK_GLHACKDIR = " $ H O M E / . l o c a l / s t a t e "
fi
export BIZHAWK_GLHACKDIR = " $ B I Z H A W K _ G L H A C K D I R / e m u h a w k - m o n o r t - ${ hawkVersion } - n o n - n i x o s "
mkdir - p " $ B I Z H A W K _ G L H A C K D I R "
if [ ! - e " $ B I Z H A W K _ G L H A C K D I R / l i b G L X _ i n d i r e c t . s o . 0 " ] ; then
ln - fsvT " ${ lib . getOutput " d r i v e r s " mesa } / l i b / l i b G L X _ m e s a . s o . 0 " " $ B I Z H A W K _ G L H A C K D I R / l i b G L X _ i n d i r e c t . s o . 0 "
fi
# collect links to certain GL libs (and their deps) from host, added to LD_LIBRARY_PATH without polluting it with all libs from host
2021-11-19 00:20:38 +00:00
for l in libbsd . so .0 libdrm_amdgpu . so .1 libdrm_nouveau . so .2 libdrm_radeon . so .1 libedit . so .0 libedit . so .2 libelf . so .1 libffi . so .7 libGLdispatch . so .0 libicudata . so .69 libicuuc . so .69 libLLVM-11 . so libLLVM-12 . so .1 liblzma . so .5 libncursesw . so .6 libsensors . so .5 libstdc ++ . so .6 libtinfo . so .6 libvulkan . so .1 libxml2 . so .2 libz . so .1 libzstd . so .1 ; do
2021-11-15 08:17:16 +00:00
if [ - e " $ B I Z H A W K _ G L H A C K D I R / $ l " ] ; then continue ; fi
# else it's either a broken link or it doesn't exist, we use ln -f to cover both
for d in /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib64 /lib /lib64 ; do
if [ - e " $ d / $ l " ] ; then
ln - fsvT " $ d / $ l " " $ B I Z H A W K _ G L H A C K D I R / $ l "
break
fi
done
done
2021-11-19 00:20:38 +00:00
for d in /usr/lib/dri /usr/lib/x86_64-linux-gnu/dri ; do
if [ - e " $ d " ] ; then
export LIBGL_DRIVERS_PATH = $ d
break
fi
done
2021-11-15 08:17:16 +00:00
exec $ { wrapperScript } /bin/emuhawk-wrapper " $ @ "
'' ;
2021-11-18 12:39:15 +00:00
in {
bizhawkAssemblies = bizhawk ;
emuhawk = stdenv . mkDerivation rec {
pname = " e m u h a w k - m o n o r t " ;
version = hawkVersion ;
nativeBuildInputs = [ makeWrapper ] ;
buildInputs = [ bizhawk ] ;
# there must be a helper for this somewhere...
dontUnpack = true ;
dontPatch = true ;
dontConfigure = true ;
dontBuild = true ;
installPhase = ''
mkdir - p $ out/bin
makeWrapper $ { if forNixOS then " ${ wrapperScript } / b i n / e m u h a w k - w r a p p e r " else " ${ wrapperScriptNonNixOS } / b i n / e m u h a w k - w r a p p e r - n o n - n i x o s " } $ out/bin / $ { pname } - $ { version } \
- - set BIZHAWK_HOME $ { bizhawk }
'' ;
dontFixup = true ;
# desktopItems = [ (makeDesktopItem rec {
# name = "emuhawk-monort-${version}"; # actually filename
# exec = "${pname}-monort-${version}";
# desktopName = "EmuHawk (Mono Runtime)"; # actually Name
# }) ];
} ;
mono = monoFinal ;
2021-11-15 08:17:16 +00:00
}