#!/bin/bash # Slackware build script for mame # Written by B. Watson (urchlay@slackware.uk) # Adapted from Erik W. Hanson's mame.SlackBuild for older mame versions, # which was originally adapted from sdlmame.SlackBuild by B. Watson. # Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details. # 20241101 bkw: Updated for v0.271 (incl. groovy patch). # 20241009 bkw: # - Updated for v0.270 (incl. groovy patch). # - Add SLKCFLAGS for aarch64, courtesy of stormtracknole. # 20240907 bkw: Updated for v0.269 (incl. groovy patch). # 20240805 bkw: add groovy patch for v0.268 (no other changes). # 20240802 bkw: Updated for v0.268. # 20240330 bkw: Updated for v0.264. # 20231031 bkw: Updated for v0.260, add WAYLAND option. # 20230710 bkw: Updated for v0.256. # 20230428 bkw: Updated for v0.254. # 20230103 bkw: Updated for v0.251. # 20220205 bkw: Updated for v0.240. # 20211115 bkw: # - updated for v0.237 on -current aka 15.0rc1. # - new-style icons. # - update mame.ini (lots of new options, some old ones went away). # - include the new support stuff (hash, language, etc) # - rename mame's 'split' to 'mame-split' to avoid potential conflict # with coreutils (if someone has /usr/games before /usr/bin in $PATH). # - include ini/{examples,presets} in the package (in the doc dir). # - make ccache work! finally! see README_ccache.txt if you care. # - make GroovyMAME support work again (upstream switched to github). # - remove gcc9 stuff. it was specific to Slackware 14.2. # 20191208 bkw: Updated for v0.214, after long hiatus. This isn't # actually the latest version, but it's the latest version that will # compile with any of the compilers available in Slackware 14.2: # gcc-5.5.0, llvm-3.8.0, llvm-8.0.1 (from /extra). It may still be # possible to patch 0.216 to build, or possibly 0.217 will have a fix for # llvm-8.0.1 (mame docs claim to support "clang version 5 and later"). # Meanwhile this update is better than nothing. Special thanks for ponce # and chriswilling for doing test builds on much faster machines than # I currently have access to. Also, moved old comment log entries to # ChangeLog.old as it was getting ridiculously long. # 20181227 bkw: Updated for v0.205. # 20181130 bkw: Updated for v0.204, including compile fix for xavix.cpp. # 20181031 bkw: Updated for v0.203. # 20180928 bkw: Updated for v0.202. # 20180830 bkw: Updated for v0.201. cd $(dirname $0) ; CWD=$(pwd) PRGNAM=mame VERSION=${VERSION:-0.271} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} PKGTYPE=${PKGTYPE:-tgz} if [ -z "$ARCH" ]; then case "$( uname -m )" in i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac fi if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE" exit 0 fi TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} # NB nonstandard flags here. Upstream defaults to -O3, so we'll leave # that as-is. Only the arch-specific stuff goes here. if [ "$ARCH" = "i586" ]; then SLKCFLAGS="-march=i586 -mtune=i686" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-march=i686 -mtune=i686" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-fPIC" elif [ "$ARCH" = "aarch64" ]; then SLKCFLAGS="-fPIC" else SLKCFLAGS="" fi # Source extracts to e.g. mame-mame0175/ SHORTNAME=${PRGNAM}${VERSION/./} DIRNAME=$PRGNAM-$SHORTNAME set -e # 20200108 bkw: before doing ANYTHING else, check to make sure # our required deps are installed. This is helpful because if # they are missing, the mame compile will still start and run # for an hour or more before it errors out, wasting a lot of # time (some of which was mine). MISSING="" for i in sdl2 SDL2_ttf; do pkg-config --exists $i || MISSING="$MISSING $i" done if [ -n "$MISSING" ]; then echo "*** Missing required dependencies:$MISSING" 1>&2 exit 1 fi # 20211112 bkw: GroovyMAME support has changed, see README_groovy.txt. # This part of it has to run in $CWD. GROOVY="${GROOVY:-no}" if [ "$GROOVY" = "update" ]; then sh mkgroovy.sh $VERSION GROOVY=yes fi rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $DIRNAME tar xvf $CWD/$DIRNAME.tar.gz cd $DIRNAME chown -R root:root . # 20181201 bkw: Urchlay's personal template: find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \ \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+ # OK, building modern mame is a bit of a PITA. It uses genie (written # in lua, a fork of premake), but you don't get to run genie directly, # you got a main makefile that builds lua, then builds genie, # then runs genie with arguments based on the options in the main # makefile... and genie generates a bunch of makefiles, then runs make # on those. Also, it uses python3 to convert XML layout files to # C++ code. # During the Slackware 14.2 cycle, I used to do this: # LDOPTS="-fuse-ld=gold -static-libstdc++ -static-libgcc" \ # This allowed installing Pat's unsupported gcc9 package, # building mame with it, then restoring the original gcc # version and mame would still run. # Where possible, use system libraries instead of building the ones # bundled with the mame source. However, SBo's lua is (still!) too old # for mame. #USE_SYSTEM_LIB_LUA=1 \ # Upstream dropped sqlite as a dependency, this no longer matters. #USE_SYSTEM_LIB_SQLITE3=1 \ # Not going to USE_SYSTEM_LIB_PORTAUDIO or USE_SYSTEM_LIB_PORTMIDI, # the bundled versions are fine and I don't want a mile-long dependency # tree. Using an external portmidi dep would make mame require Oracle's # JDK! In case you're wondering, only the C code in the bundled portmidi # is built (no Java needed). # Version-specific patches & sed fixes. We do it this way to keep this # script compatible with older versions. PATCHES="" case "$VERSION" in 0.200) # couple files missing an include... sed -i '1i#include ' \ src/devices/cpu/mips/ps2vif1.cpp \ src/devices/cpu/mips/mips3.cpp ;; 0.204) sed -i '1i#include ' src/mame/video/xavix.cpp ;; *) ;; esac [ -n "$PATCHES" ] && \ for i in "$PATCHES"; do [ -f "$CWD/$i" ] && patch -p1 < "$CWD/$i" done # This is purely cosmetic, and can't be set on the make command line. sed -i 's,ubuntu-intrepid,slackware,g' scripts/genie.lua sed -i 's/DISTRO := generic/DISTRO := slackware/' makefile # SDL_INI_PATH needs to contain a $ character. I haven't figured out # how (or even if) I can pass this through multiple layers of make # calling genie which calls make again, so screw it: sed -i 's,\.;ini,/etc,' src/osd/sdl/sdlmain.cpp # Tried several variants of this, none work, ended up using the sed # stuff above. #SDL_INI_PATH='$$HOME/.mame;/etc' \ # 20211110 bkw: undocumented option. keep this Just In Case. if [ "${QTDEBUG:-yes}" = "yes" ]; then QTOPT=1 else QTOPT=0 fi # 20211112 bkw: the rest of the GroovyMAME stuff. # The diffs look to be close to half a meg, so they're compressed. if [ "$GROOVY" = "yes" ]; then GROOVYDIFF="$( /bin/ls $CWD/gm${VERSION/./}*.diff.xz 2>/dev/null | tail -1 )" if [ -e "$GROOVYDIFF" ]; then GROOVYVER="$( basename $GROOVYDIFF .diff.xz )" echo "=== GROOVYDIFF $GROOVYDIFF" echo "=== GROOVYVER $GROOVYVER" # The "-f -Z" is necessary to make sure the patched files end up # with the same timestamp every time the script is run. ccache # needs this because the include_file_mtime doesn't seem to # play nice with precompiled headers, even though it's supposed to. # When the patch is generated, we have to add timestamps to make # this work (see mkgroovy.sh for details). xzcat "$GROOVYDIFF" | patch -p1 -f -Z else cat < $PKG/usr/share/applications/$PRGNAM.desktop # Icon extracted from src/mame/osd/windows/mame/mame.ico with icotool. for px in 16 32 48 64 128; do size=${px}x${px} dir=$PKG/usr/share/icons/hicolor/$size/apps mkdir -p $dir convert -resize $size $CWD/desktop/$PRGNAM.png $dir/$PRGNAM.png done ln -s ../icons/hicolor/48x48/apps/$PRGNAM.png $PKG/usr/share/pixmaps/$PRGNAM.png cat $CWD/$PRGNAM.ini > $PKG/etc/$PRGNAM.ini.new # This one *must* exist. install -s -m0755 -oroot -groot $PRGNAM $PKG/usr/games/ # 20211110 bkw: removed src2html (no longer exists) and renamed split # to mame-split since we have a split command in coreutils already. # Also, in case upstream drops another of these utilities, check for # existence before trying to install (because it takes hours to # compile). # Install the tools: for i in castool chdman floptool imgtool jedutil \ ldresample ldverify nltool nlwav pngcmp \ regrep romcmp srcclean unidasm do [ -e $i ] && install -s -m0755 -oroot -groot $i $PKG/usr/games/ done [ -e split ] && install -s -m0755 -oroot -groot $i $PKG/usr/games/$PRGNAM-split ln -s $PRGNAM $PKG/usr/games/mess # Install the man pages. mame and mess still have separate man # pages, though the binaries are combined now. install -m0644 -oroot -groot docs/man/*.1 $PKG/usr/man/man1 install -m0644 -oroot -groot docs/man/*.6 $PKG/usr/man/man6 gzip -9 $PKG/usr/man/man?/*.? # Create empty dirs for the user to populate with ROMs and such. SHAREDIR=$PKG/usr/share/games/$PRGNAM mkdir -p $SHAREDIR/{roms,font,cheat} # Install the support stuff. cp -a artwork bgfx plugins samples hash ctrlr $SHAREDIR # 20211110 bkw: also the translations (but not the .po files, those are # the sources for the .mo files, which are what mame actually needs). cp -p --parents language/*/*.mo $SHAREDIR # CONTRIBUTING.md is a 1-byte placeholder, and we don't need a shell script. rm -f docs/CONTRIBUTING.md docs/update.sh PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION mkdir -p $PKGDOC # can't just "cp docs/* ..." because man/ is a dir, set -e kills the script # 20240330 bkw: docs/swlist is gone in 0.264. cp docs/L* docs/*.* $PKGDOC cp -a docs/legal $PKGDOC cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild # in case someone finds these useful... cp -a ini/examples ini/presets $PKGDOC mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc [ -n "$GROOVYVER" ] && \ sed -i "19s,\$, This package was patched with GroovyMAME $GROOVYVER.," \ $PKG/install/slack-desc cat $CWD/doinst.sh > $PKG/install/doinst.sh cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE