#!/bin/bash # Slackware build script for mame # Written by B. Watson (yalhcru@gmail.com) # 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. # 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. PRGNAM=mame VERSION=${VERSION:-0.214} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac fi CWD=$(pwd) 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" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-march=i686 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-fPIC" LIBDIRSUFFIX="64" else SLKCFLAGS="" LIBDIRSUFFIX="" 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 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. Also, # it uses python to convert XML layout files to C++ code. # 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). # The OVERRIDE_CC and OVERRIDE_CXX are there because mame's build # ignores $PATH when searching for gcc/g++, and won't find my ccache # symlinks in /usr/local/bin. On a normal (non-ccache-using) system, # these options do nothing (they use the compilers in /usr/bin, which # is the default anyway) and you can forget about them... or, if you use # distcc, this will allow it to actually work. (Mini-rant: PATH has been # a standard mechanism on both Unix and DOS/Windows systems for what, # 30 or 40 years now? Come on people...) # 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' \ # Previous versions of mame used qt4 for the debugger GUI. Now it's # qt5, so I've made it optional (Slackware 14.2 still only has qt4). if [ "${QTDEBUG:-no}" = "yes" ]; then QTOPT=1 WITHQT="with" else QTOPT=0 WITHQT="without" fi # Now, let's check for GroovyMAME. All the user has to do is place # the .diff in the SlackBuild's directory. The filename always starts # with the MAME version number, minus its dots. If we find multiple # files matching this, sort them lexically and use the last (hopefully # this is the one with the highest version number). GROOVYDIFF="$( ls $CWD/${VERSION/./}_groovymame_*.diff 2>/dev/null | tail -1 )" if [ -e "$GROOVYDIFF" ]; then GROOVYVER="$( basename $GROOVYDIFF .diff | cut -d_ -f3- | sed 's,-,_,g' )" # .diffs are shipped with CRLF endings, fix: sed 's,\r,,g' "$GROOVYDIFF" > groovy.diff patch -p0 < groovy.diff echo "GROOVYDIFF $GROOVYDIFF" echo "GROOVYVER $GROOVYVER" fi # Build option notes: # Having ARCH set in the env will break the build, hence ARCH="". # Using ld.gold is *much* faster, and I see no disadvantage to it. # The static libstdc++ and libgcc args allow building a version of mame # that requires gcc9 (README_gcc9.txt), then running it on a system that # doesn't have gcc9 installed. This does make the binary slightly larger, # but it's already around 250MB so it's not going to matter much. # The point of the OVERRIDE_CC and friends is to make the build use $PATH # to find gcc (so ccache will be found if it's using the symlink method). make USE_QTDEBUG=$QTOPT \ USE_SYSTEM_LIB_EXPAT=1 \ USE_SYSTEM_LIB_ZLIB=1 \ USE_SYSTEM_LIB_JPEG=1 \ USE_SYSTEM_LIB_FLAC=1 \ PYTHON_EXECUTABLE="/usr/bin/python -S" \ OPT_FLAGS="$SLKCFLAGS" \ LDOPTS="-fuse-ld=gold -static-libstdc++ -static-libgcc" \ OVERRIDE_CC="$( which gcc )" \ OVERRIDE_CXX="$( which g++ )" \ CC="$( which gcc )" \ CXX="$( which g++ )" \ ARCH="" \ VERBOSE=1 \ NOWERROR=1 \ TOOLS=1 \ TARGET=$PRGNAM \ SUBTARGET=$PRGNAM # No 'make install' target, do it manually. mkdir -p $PKG/usr/games $PKG/etc $PKG/usr/man/man6 $PKG/usr/man/man1 \ $PKG/usr/share/applications $PKG/usr/share/pixmaps # Deal with upstream's executable-naming silliness. [ -e ${PRGNAM}64 ] && mv ${PRGNAM}64 $PRGNAM [ -e ${PRGNAM}32 ] && mv ${PRGNAM}32 $PRGNAM # .desktop borrowed from Ludovic Lechapt's Debian package. # Icon extracted from src/mame/osd/windows/mame/mame.ico with icotool. cat $CWD/desktop/$PRGNAM.desktop > $PKG/usr/share/applications/$PRGNAM.desktop cat $CWD/desktop/$PRGNAM.png > $PKG/usr/share/pixmaps/$PRGNAM.png cat $CWD/$PRGNAM.ini > $PKG/etc/$PRGNAM.ini.new # Install the binaries: install -s -m0755 -oroot -groot \ $PRGNAM castool chdman floptool imgtool jedutil \ ldresample ldverify nltool nlwav pngcmp regrep \ romcmp split src2html srcclean unidasm \ $PKG/usr/games/ 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. for i in roms samples ctrlr font cheat; do mkdir -p $PKG/usr/share/games/$PRGNAM/$i done # Install the artwork and bgfx stuff (needed for 'video bgfx' in mame.ini). cp -a artwork bgfx $PKG/usr/share/games/$PRGNAM # CONTRIBUTING.md is a 1-byte placeholder, and we don't need a shell script. rm -f docs/CONTRIBUTING.md docs/update.sh mkdir -p $PKG/usr/doc/${PRGNAM}-$VERSION # can't just "cp docs/* ..." because man/ is a dir, set -e kills the script cp docs/L* docs/*.* $PKG/usr/doc/${PRGNAM}-$VERSION cp -a docs/swlist $PKG/usr/doc/${PRGNAM}-$VERSION cat $CWD/${PRGNAM}.SlackBuild > $PKG/usr/doc/${PRGNAM}-$VERSION/${PRGNAM}.SlackBuild mkdir -p $PKG/install sed "s,@WITHQT@,$WITHQT," $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:-tgz}