biome: 1.9.2 -> 1.9.3
[NixPkgs.git] / pkgs / applications / emulators / mame / default.nix
blob763e4a59de5dc3c32315e4ec503195c0a60a7431
1 { lib
2 , stdenv
3 , fetchFromGitHub
4 , alsa-lib
5 , SDL2
6 , SDL2_ttf
7 , copyDesktopItems
8 , expat
9 , flac
10 , fontconfig
11 , glm
12 , installShellFiles
13 , libXi
14 , libXinerama
15 , libjpeg
16 , libpcap
17 , libpulseaudio
18 , makeDesktopItem
19 , makeWrapper
20 , papirus-icon-theme
21 , pkg-config
22 , portaudio
23 , portmidi
24 , pugixml
25 , python3
26 , qtbase
27 , rapidjson
28 , sqlite
29 , utf8proc
30 , which
31 , writeScript
32 , zlib
33 , darwin
36 let
37   inherit (darwin.apple_sdk.frameworks) CoreAudioKit ForceFeedback;
39 stdenv.mkDerivation rec {
40   pname = "mame";
41   version = "0.270";
42   srcVersion = builtins.replaceStrings [ "." ] [ "" ] version;
44   src = fetchFromGitHub {
45     owner = "mamedev";
46     repo = "mame";
47     rev = "mame${srcVersion}";
48     hash = "sha256-l1mgkPhYO/U/77veC0Mpyzr6hzz/FSkn+4GMAdLSfOk=";
49   };
51   outputs = [ "out" "tools" ];
53   makeFlags = [
54     "CC=${stdenv.cc.targetPrefix}cc"
55     "CXX=${stdenv.cc.targetPrefix}c++"
56     "TOOLS=1"
57     "USE_LIBSDL=1"
58     # "USE_SYSTEM_LIB_ASIO=1"
59     "USE_SYSTEM_LIB_EXPAT=1"
60     "USE_SYSTEM_LIB_FLAC=1"
61     "USE_SYSTEM_LIB_GLM=1"
62     "USE_SYSTEM_LIB_JPEG=1"
63     # https://www.mamedev.org/?p=523
64     # "USE_SYSTEM_LIB_LUA=1"
65     "USE_SYSTEM_LIB_PORTAUDIO=1"
66     "USE_SYSTEM_LIB_PORTMIDI=1"
67     "USE_SYSTEM_LIB_PUGIXML=1"
68     "USE_SYSTEM_LIB_RAPIDJSON=1"
69     "USE_SYSTEM_LIB_UTF8PROC=1"
70     "USE_SYSTEM_LIB_SQLITE3=1"
71     "USE_SYSTEM_LIB_ZLIB=1"
72   ];
74   dontWrapQtApps = true;
76   # https://docs.mamedev.org/initialsetup/compilingmame.html
77   buildInputs = [
78     expat
79     zlib
80     flac
81     portmidi
82     portaudio
83     utf8proc
84     libjpeg
85     rapidjson
86     pugixml
87     glm
88     SDL2
89     SDL2_ttf
90     sqlite
91     qtbase
92   ]
93   ++ lib.optionals stdenv.hostPlatform.isLinux [ alsa-lib libpulseaudio libXinerama libXi fontconfig ]
94   ++ lib.optionals stdenv.hostPlatform.isDarwin [ libpcap CoreAudioKit ForceFeedback ];
96   nativeBuildInputs = [
97     copyDesktopItems
98     installShellFiles
99     makeWrapper
100     pkg-config
101     python3
102     which
103   ];
105   patches = [
106     # by default MAME assumes that paths with stock resources are relative and
107     # that you run MAME changing to install directory, so we add absolute paths
108     # here
109     ./001-use-absolute-paths.diff
110   ];
112   # Since the bug described in https://github.com/NixOS/nixpkgs/issues/135438,
113   # it is not possible to use substituteAll
114   postPatch = ''
115     substituteInPlace src/emu/emuopts.cpp \
116       --subst-var-by mamePath "$out/opt/mame"
117   '';
119   desktopItems = [
120     (makeDesktopItem {
121       name = "MAME";
122       desktopName = "MAME";
123       exec = "mame";
124       icon = "mame";
125       type = "Application";
126       genericName = "MAME is a multi-purpose emulation framework";
127       comment = "Play vintage games using the MAME emulator";
128       categories = [ "Game" "Emulator" ];
129       keywords = [ "Game" "Emulator" "Arcade" ];
130     })
131   ];
133   # TODO: copy shaders from src/osd/modules/opengl/shader/glsl*.*h
134   # to the final package after we figure out how they work
135   installPhase = let
136     icon = "${papirus-icon-theme}/share/icons/Papirus/32x32/apps/mame.svg";
137   in ''
138     runHook preInstall
140     # mame
141     mkdir -p $out/opt/mame
143     install -Dm755 mame -t $out/bin
144     install -Dm644 ${icon} $out/share/icons/hicolor/scalable/apps/mame.svg
145     installManPage docs/man/*.1 docs/man/*.6
146     cp -ar {artwork,bgfx,plugins,language,ctrlr,keymaps,hash} $out/opt/mame
148     # mame-tools
149     for _tool in castool chdman floptool imgtool jedutil ldresample ldverify \
150                  nltool nlwav pngcmp regrep romcmp split srcclean testkeys \
151                  unidasm; do
152        install -Dm755 $_tool -t $tools/bin
153     done
154     mv $tools/bin/{,mame-}split
156     runHook postInstall
157   '';
159   # man1 is the tools documentation, man6 is the emulator documentation
160   # Need to be done in postFixup otherwise multi-output hook will move it back to $out
161   postFixup = ''
162     moveToOutput share/man/man1 $tools
163   '';
165   enableParallelBuilding = true;
167   passthru.updateScript = writeScript "mame-update-script" ''
168     #!/usr/bin/env nix-shell
169     #!nix-shell -i bash -p curl common-updater-scripts jq
171     set -eu -o pipefail
173     latest_version=$(curl -s https://api.github.com/repos/mamedev/mame/releases/latest | jq --raw-output .tag_name)
174     update-source-version mame "''${latest_version/mame0/0.}"
175   '';
177   meta = with lib; {
178     homepage = "https://www.mamedev.org/";
179     description = "Multi-purpose emulation framework";
180     longDescription = ''
181       MAME's purpose is to preserve decades of software history. As electronic
182       technology continues to rush forward, MAME prevents this important
183       "vintage" software from being lost and forgotten. This is achieved by
184       documenting the hardware and how it functions. The source code to MAME
185       serves as this documentation. The fact that the software is usable serves
186       primarily to validate the accuracy of the documentation (how else can you
187       prove that you have recreated the hardware faithfully?). Over time, MAME
188       (originally stood for Multiple Arcade Machine Emulator) absorbed the
189       sister-project MESS (Multi Emulator Super System), so MAME now documents a
190       wide variety of (mostly vintage) computers, video game consoles and
191       calculators, in addition to the arcade video games that were its initial
192       focus.
193     '';
194     changelog = "https://github.com/mamedev/mame/releases/download/mame${srcVersion}/whatsnew_${srcVersion}.txt";
195     license = with licenses; [ bsd3 gpl2Plus ];
196     maintainers = with maintainers; [ thiagokokada ];
197     platforms = platforms.unix;
198     broken = stdenv.hostPlatform.isDarwin;
199     mainProgram = "mame";
200   };