#!/bin/bash -e # # JoeyLib # Copyright (C) 2018-2019 Scott Duensing # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages # arising from the use of this software. # # Permission is granted to anyone to use this software for any purpose, # including commercial applications, and to alter it and redistribute it # freely, subject to the following restrictions: # # 1. The origin of this software must not be misrepresented; you must not # claim that you wrote the original software. If you use this software # in a product, an acknowledgment in the product documentation would be # appreciated but is not required. # 2. Altered source versions must be plainly marked as such, and must not be # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. # # # Global variables # G_TITLE="JoeyLib Installer" G_WORK=installerWork G_PARENT= G_SCRIPT= G_UID=$(id -ru) G_GID=$(id -rg) G_IS_INSTALLED=() G_VBCC_CURRENT="2017-08-14" G_OSX_MIN=10.6 G_IIGS=0 #G_AMIGA=1 G_ATARIST=1 G_LINUX32=2 G_LINUX64=3 G_WIN32=4 G_WIN64=5 G_MAC32=6 G_MAC64=7 #G_ANDROID=9 #G_IOS=10 function buildMacOSXSDK() { local XCODE= local OSX="${G_PARENT}/sdks/macOS" mkdir -p "${G_PARENT}/sdks" G_IS_INSTALLED[$G_MAC32]=1 G_IS_INSTALLED[$G_MAC64]=1 configWrite configRead if [[ ! -e "${OSX}/SDK" ]]; then tFileBrowser XCODE "Please locate your 'XCode 10.1' XIP" .xip .. if [[ -z ${XCODE} || "${XCODE}" == "" ]]; then return 0 fi fi if [[ ! -d osxcross ]]; then purple "Building macOS SDK - This takes FOREVER!" git clone https://github.com/tpoechtrager/osxcross.git pushd osxcross &> /dev/null ./tools/gen_sdk_package_pbzx.sh "${XCODE}" mv -f MacOSX10.* tarballs/. OSX_VERSION_MIN=${G_OSX_MIN} UNATTENDED=1 ./build.sh mv -f target "${OSX}" popd &> /dev/null fi } function buildPCDeps() { local DIST=$1 local PREFIX=$2 local CROSS=$3 local CC_EXPORT=$4 local CXX_EXPORT=$5 local CC_OLD=$CC local CXX_OLD=$CXX local SRC="${G_PARENT}/joeylib/joeylib/src" local G_CFLAGS="-Wall -D_REENTRANT_ -I${SRC} -I${PREFIX}/include -c" mkdir -p ${PREFIX} pushd deps &> /dev/null export CC="${CC_EXPORT}" export CXX="${CXX_EXPORT}" # SDL2 purple "Building SDL2" if [[ ! -d SDL ]]; then hg clone http://hg.libsdl.org/SDL fi if [[ ! -e "${PREFIX}/lib/libSDL2.a" ]]; then clearPCDepsBuild pushd build &> /dev/null ../SDL/configure \ --target="${CROSS}" \ --host="${CROSS}" \ --build=x86_64-linux \ --enable-static \ --disable-shared \ --prefix=${PREFIX} make make install popd &> /dev/null fi # libModPlug purple "Building libModPlug" if [[ ! -d libmodplug ]]; then git clone https://github.com/Konstanty/libmodplug.git pushd libmodplug &> /dev/null libtoolize --force aclocal autoheader automake --force-missing --add-missing autoconf popd &> /dev/null fi if [[ ! -e "${PREFIX}/lib/libmodplug.a" ]]; then clearPCDepsBuild pushd build &> /dev/null ../libmodplug/configure \ --target="${CROSS}" \ --host="${CROSS}" \ --build=x86_64-linux \ --enable-static \ --disable-shared \ --prefix=${PREFIX} make make install popd &> /dev/null fi # SDL_mixer purple "Building SDL_mixer" if [[ ! -d SDL_mixer ]]; then hg clone http://hg.libsdl.org/SDL_mixer fi if [[ ! -e "${PREFIX}/lib/libSDL2_mixer.a" ]]; then clearPCDepsBuild pushd build &> /dev/null MODPLUG_CFLAGS="-I${PREFIX}/include -DMODPLUG_STATIC" \ MODPLUG_LIBS="-L${PREFIX}/lib -lmodplug -lstdc++ -lm" \ ../SDL_mixer/configure \ --target="${CROSS}" \ --host="${CROSS}" \ --build=x86_64-linux \ --enable-static \ --disable-shared \ --prefix=${PREFIX} \ --with-sdl-prefix=${PREFIX} \ --disable-music-cmd \ --disable-music-wave \ --enable-music-mod-modplug \ --disable-music-mod-modplug-shared \ --disable-music-mod-mikmod \ --disable-music-midi \ --disable-music-ogg \ --disable-music-flac \ --disable-music-opus \ --disable-music-mp3 \ --disable-music-mp3-mpg123 make make install popd &> /dev/null fi export CC="${CC_OLD}" export CXX="${CXX_OLD}" # JoeyLib purple "Building JoeyLib" if [[ -d "${DIST}" ]]; then rm -rf "${DIST}" fi mkdir -p "${DIST}" clearPCDepsBuild pushd build &> /dev/null ${CC_EXPORT} ${G_CFLAGS} -o jPC.o ${SRC}/jPC.c ${CC_EXPORT} ${G_CFLAGS} -o joey.o ${SRC}/joey.c ar x ${PREFIX}/lib/libSDL2.a ar x ${PREFIX}/lib/libSDL2_mixer.a ar x ${PREFIX}/lib/libmodplug.a ar rcs ${DIST}/libjoeylib.a *.o cp -f ${SRC}/joey.h ${DIST}/../.. cp -f ${SRC}/../joey.pri ${DIST}/../.. cp -f ${SRC}/../../scripts/build-PC.helper.sh ${DIST}/../.. popd &> /dev/null popd &> /dev/null } function clearPCDepsBuild() { if [[ -d $(pwd)/build ]]; then rm -rf $(pwd)/build fi mkdir -p $(pwd)/build } function configRead() { if [[ -e "${G_PARENT}/joeyDev.sh" ]]; then source "${G_PARENT}/joeyDev.sh" fi } function configWrite() { local O=${G_PARENT}/joeyDev.sh local P=\${JOEYPATH} echo "#!/bin/bash" > "${O}" # Remember the initial path so we can run this more than once echo "if [[ -z \$JOEYPATH || \"\${JOEYPATH}\" == \"\" ]]; then" >> "${O}" echo -e "\texport JOEYPATH=\"\${PATH}\"" >> "${O}" echo "fi" >> "${O}" echo "export JOEY=\"${G_PARENT}\"" >> "${O}" if [[ ${G_IS_INSTALLED[$G_IIGS]} == 1 ]]; then # IIgs Runtime & ORCA Compilers P=\${JOEY}/sdks/IIgs:${P} echo "export GOLDEN_GATE=\"\${JOEY}/sdks/IIgs/ORCA\"" >> "${O}" echo "if [[ -e \"\${JOEY}/sdks/IIgs/mountORCA.sh\" ]]; then" >> "${O}" echo -e "\t\"\${JOEY}/sdks/IIgs/mountORCA.sh\"" >> "${O}" echo "fi" >> "${O}" fi if [[ ${G_IS_INSTALLED[$G_ATARIST]} == 1 ]]; then # All VBCC targets get these P=\${JOEY}/sdks/vbcc/bin:${P} echo "export VBCC=\"\${JOEY}/sdks/vbcc\"" >> "${O}" fi if [[ ${G_IS_INSTALLED[$G_MAC32]} == 1 || ${G_IS_INSTALLED[$G_MAC64]} == 1 ]]; then P=\${JOEY}/sdks/macOS/bin:${P} echo "export MACOSX_DEPLOYMENT_TARGET=${G_OSX_MIN}" >> "${O}" fi echo "export PATH=\"${P}\"" >> "${O}" chmod +x "${O}" } function doSudo() { local ARGS="$@" local ASK="${G_PARENT}/${G_WORK}/askPass.sh" cat <<- ASKPASS > "${ASK}" #!/bin/bash "${G_PARENT}/${G_SCRIPT}" ASKPASS ASKPASS chmod +x "${ASK}" if [[ "${ARGS}x" == "x" ]]; then SUDO_ASKPASS="${ASK}" sudo -A -v else SUDO_ASKPASS="${ASK}" sudo -A ${ARGS} fi } function doSudoAskPass() { local RET= local PASSWORD= set +e PASSWORD=$( whiptail --passwordbox "\n${G_TITLE} needs superuser access.\n\nPlease enter your password:" 12 60 --title "Need Root" 3>&1 1>&2 2>&3 ) RET=$? set -e if [[ ${RET} -ne 0 ]]; then echo "Cannot continue without superuser access." 1>&2 exit 1 fi printf "${PASSWORD}\n" exit 0 } function download() { local URL=$1 local FILE=$2 if [[ -z ${FILE} ]]; then FILE=${URL##*/} fi if [[ -e "${FILE}" ]]; then rm -f "${FILE}" fi wget -O "${FILE}" ${URL} } function fetchGitHubRelease() { local __RESULT=$1 local DEVELOPER=$2 local COMPONENT=$3 local EXTENSION=$4 local URL=$(curl -s https://api.github.com/repos/${DEVELOPER}/${COMPONENT}/releases \ | grep "browser_download_url.*${EXTENSION}" \ | cut -d : -f 2,3 \ | tr -d \" \ | head -n 1) download ${URL} eval $__RESULT=\${FILE} } function installIIgs() { local RESULT= local O= local ORCA= local GGATE= local IIGS="${G_PARENT}/sdks/IIgs" G_IS_INSTALLED[$G_IIGS]=1 configWrite configRead if [[ -e "${IIGS}/unmountORCA.sh" ]]; then "${IIGS}/unmountORCA.sh" fi mkdir -p "${IIGS}/ORCA" chmod 777 "${IIGS}/ORCA" if [[ ! -e "${IIGS}/hfsDrive.img" ]]; then purple "Creating HFS Volume" O=${IIGS}/mountORCA.sh echo "#!/bin/bash" > "${O}" echo "IIGS=${IIGS}" >> "${O}" echo "if ! mount | grep \${IIGS}/ORCA | grep -q hfsplus; then" >> "${O}" echo -e "\tfsck.hfsplus \${IIGS}/hfsDrive.img" >> "${O}" echo -e "\tIIGSDISK=\$(sudo losetup --partscan --find --show \${IIGS}/hfsDrive.img)" >> "${O}" echo -e "\tsudo mount \${IIGSDISK} \${IIGS}/ORCA" >> "${O}" echo -e "\techo LOOP=\${IIGSDISK} > \${IIGS}/lastMount.cfg" >> "${O}" echo -e "\techo MOUNT=\${IIGS}/ORCA >> \${IIGS}/lastMount.cfg" >> "${O}" echo "fi" >> "${O}" chmod +x "${O}" O=${IIGS}/unmountORCA.sh echo "#!/bin/bash" > "${O}" echo "IIGS=${IIGS}" >> "${O}" echo "if [[ -e \${IIGS}/lastMount.cfg ]]; then" >> "${O}" echo -e "\tsource \${IIGS}/lastMount.cfg" >> "${O}" echo -e "\tsudo umount \${MOUNT}" >> "${O}" echo -e "\tsudo losetup -d \${LOOP}" >> "${O}" echo -e "\tsudo rm \${IIGS}/lastMount.cfg" >> "${O}" echo "fi" >> "${O}" chmod +x "${O}" fallocate -l 32M "${IIGS}/hfsDrive.img" mkfs.hfs -v IIgs "${IIGS}/hfsDrive.img" fi "${IIGS}/mountORCA.sh" doSudo chown ${G_UID}:${G_GID} "${IIGS}/ORCA/." if [[ ! -e "${IIGS}/ORCA/Languages/cc" ]]; then tFileBrowser ORCA "Please locate your 'OPUS ][ The Software' ISO" .iso .. if [[ -z ${ORCA} || "${ORCA}" == "" ]]; then return 0 fi fi if [[ ! -d GoldenGate ]]; then tFileBrowser GGATE "Please locate your 'Golden Gate' MSI" .msi .. if [[ -z ${GGATE} || "${GGATE}" == "" ]]; then return 0 fi purple "Building GoldenGate" git clone git@gitlab.com:GoldenGate/GoldenGate.git if [ ! -d GoldenGate ]; then tBoldBox tRED "Unable to clone the GoldenGate repository!" echo "Must be a paying member of the GoldenGate project!" echo "See: https://goldengate.gitlab.io/about/" exit 1 fi pushd GoldenGate &> /dev/null git submodule init git submodule update mkdir -p build cd build cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/installed .. make make install if [[ ! -e bin/iix ]]; then tBoldBox tRED "Failed to build GoldenGate." exit 1 fi cp -f bin/{iix,dumpobj,opus-extractor} "${IIGS}/." cd installed msiextract "${GGATE}" find -name ".*" -delete cp -rf GoldenGate/* "${IIGS}/ORCA/." popd &> /dev/null fi if [[ ! -e "${IIGS}/ORCA/Languages/cc" ]]; then purple "Installing ORCA/C" isoinfo -i "${ORCA}" -x /FOR_EMUL/BYTEWORK.S\;1 > BYTEWORKS "${IIGS}/opus-extractor" -v BYTEWORKS "${IIGS}/ORCA" purple "Upgrading ORCA/C" fetchGitHubRelease RESULT byteworksinc ORCA-C 2mg "${IIGS}/opus-extractor" -v -s / ${RESULT} "${IIGS}/ORCA" pushd ${GOLDEN_GATE} &> /dev/null #find . -type d -exec chmod 755 {} \; #find . -type f -exec chmod 644 {} \; for O in etc/* ; do iix chtyp -t txt "${O}" ; done for O in lib/* ; do if [ -f "${O}" ] ; then iix chtyp -t lib "${O}" ; fi ; done for O in usr/lib/lib* ; do iix chtyp -t lib "${O}" ; done for O in usr/lib/tmac/* ; do iix chtyp -t txt "${O}" ; done for O in bin/* ; do iix chtyp -t exe "${O}" ; done for O in usr/bin/* ; do iix chtyp -t exe "${O}" ; done for O in usr/local/bin/* ; do iix chtyp -t exe "${O}" ; done for O in Languages/* ; do if [ -f "${O}" ] ; then iix chtyp -t exe "${O}" ; fi ; done ; for O in Utilities/Help/* ; do if [ -f "${O}" ] ; then iix chtyp -t txt "${O}" ; fi ; done ; for O in Utilities/* ; do if [ -f "${O}" ] ; then iix chtyp -t exe "${O}" ; fi ; done ; for O in Libraries/* ; do if [ -f "${O}" ] ; then iix chtyp -t lib "${O}" ; fi ; done ; for O in Libraries/AInclude/* ; do if [ -f "${O}" ] ; then iix chtyp -t txt "${O}" ; fi ; done ; for O in Libraries/APWCInclude/* ; do if [ -f "${O}" ] ; then iix chtyp -t txt "${O}" ; fi ; done ; for O in Libraries/AppleUtil/* ; do if [ -f "${O}" ] ; then iix chtyp -t txt "${O}" ; fi ; done ; for O in Libraries/ORCACDefs/* ; do if [ -f "${O}" ] ; then iix chtyp -l cc "${O}" ; fi ; done ; for O in Libraries/ORCAInclude/* ; do if [ -f "${O}" ] ; then iix chtyp -l asm "${O}" ; fi ; done ; for O in Libraries/RInclude/* ; do if [ -f "${O}" ] ; then iix chtyp -l rez "${O}" ; fi ; done ; for O in Libraries/Tool.Interface/* ; do if [ -f "${O}" ] ; then iix chtyp -l pascal "${O}" ; fi ; done ; for O in Libraries/GSoftDefs/* ; do if [ -f "${O}" ] ; then iix chtyp -t 0x5e -a 0x8007 "${O}" ; fi ; done ; for O in Libraries/ORCAPascalDefs/* ; do if [ -f "${O}" ] ; then iix chtyp -t 0x5e -a 0x8009 "${O}" ; fi ; done ; for O in Libraries/m2defs/* ; do if [ -f "${O}" ] ; then iix chtyp -t 0x5e -a 0x8006 "${O}" ; fi ; done ; popd &> /dev/null fi if [[ ! -d gsplus ]]; then purple "Building GSplus" git clone https://github.com/digarok/gsplus.git mkdir gsplus/build pushd gsplus/build &> /dev/null cmake .. make if [[ ! -e bin/GSplus ]]; then tBoldBox tRED "Failed to build GSplus." exit 1 fi mkdir -p "${IIGS}/gsplus" cp -f bin/{GSplus,partls,to_pro} "${IIGS}/gsplus/." popd &> /dev/null echo -e "s7d1 = System601.po\n\ng_limit_speed = 0\n" > "${IIGS}/gsplus/config.txt" echo -e "s7d1 = System601.po\ns7d2 = /tmp/IIgs/import.po\n" > "${IIGS}/gsplus/IIgsTest.cfg" fi if [[ ! -f "${IIGS}/gsplus/ROM.03" ]]; then purple "Installing IIgs ROM" download http://www.whatisthe2gs.apple2.org.za/files/rom3.zip unzip rom3.zip mv -f APPLE2GS.ROM2 "${IIGS}/gsplus/ROM.03" fi if [[ ! -f "${IIGS}/gsplus/System601.po" ]]; then purple "Installing GS/OS" download http://www.whatisthe2gs.apple2.org.za/files/harddrive_image.zip unzip harddrive_image.zip mv -f "System 6 and Free Games.hdv" "${IIGS}/gsplus/System601.po" fi if [[ ! -d cadius ]]; then purple "Building Cadius" git clone https://github.com/mach-kernel/cadius.git pushd cadius &> /dev/null make if [[ ! -e bin/release/cadius ]]; then tBoldBox tRED "Failed to build Cadius." exit 1 fi mkdir -p "${IIGS}/cadius" cp -f bin/release/cadius "${IIGS}/cadius/." popd &> /dev/null fi if [[ ! -e "${IIGS}/ntconverter/ntconverter.php" ]]; then purple "Installing NinjaTracker Converter" download https://www.ninjaforce.com/downloads/ntconverter.zip unzip ntconverter.zip mkdir -p "${IIGS}/ntconverter" cp -f ntconverter.php "${IIGS}/ntconverter/." fi mkdir -p "${JOEY}/dist/IIgs" if [[ ! -e "${JOEY}/dist/IIgs/Tool221#ba0000" ]]; then purple "Installing Tool221" download https://www.brutaldeluxe.fr/products/apple2gs/tool221/ninjatracker_tool221_v2.1.2mg "${IIGS}/cadius/cadius" extractfile ninjatracker_tool221_v2.1.2mg NT.TOOL221.V2.1/SYSTEM/TOOLS/TOOL221 . cp -f TOOL221#BA0000 "${JOEY}/dist/IIgs/Tool221#ba0000" fi purple "Building JoeyLib" O=${IIGS}/ORCA/out/joey if [[ -d "${O}" ]]; then rm -rf "${O}" fi mkdir -p "${O}" pushd "${JOEY}/joeylib/joeylib/src" &> /dev/null iix assemble +L jIIgs.asm keep=31:/out/joey/jIIgsasm > jIIgs.asm.dis iix compile jIIgs.c keep=31:/out/joey/jIIgsc iix compile joey.c keep=31:/out/joey/joey iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.A iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.ROOT iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsc.a iix makelib 31:/out/joey/joeylib +31:/out/joey/joey.a popd &> /dev/null cp -f "${O}/joeylib" "${JOEY}/dist/IIgs/joeylib#b20000" cp -f "${JOEY}/joeylib/joeylib/src/joey.h" "${JOEY}/dist/." cp -f "${JOEY}/joeylib/scripts/build-IIgs.helper.sh" "${JOEY}/dist/." "${IIGS}/unmountORCA.sh" if [[ ! -e "${IIGS}/hfsDrive.img.backup.tar.bz2" ]]; then tar cjf "${IIGS}/hfsDrive.img.backup.tar.bz2" "${IIGS}/hfsDrive.img" fi } function installLinux32() { buildPCDeps \ "$(pwd)/../dist/linux/i386" \ "$(pwd)/deps/installed/linux/i386" \ "x86_64-linux-gnu" \ "x86_64-linux-gnu-gcc -m32" \ "x86_64-linux-gnu-g++ -m32" } function installLinux64() { buildPCDeps \ "$(pwd)/../dist/linux/x64" \ "$(pwd)/deps/installed/linux/x64" \ "x86_64-linux-gnu" \ "x86_64-linux-gnu-gcc" \ "x86_64-linux-gnu-g++" } function installmacOS32() { buildMacOSXSDK buildPCDeps \ "$(pwd)/../dist/macOS/i386" \ "$(pwd)/deps/installed/macOS/i386" \ "i386-apple-darwin18" \ "o32-clang" \ "" } function installmacOS64() { buildMacOSXSDK buildPCDeps \ "$(pwd)/../dist/macOS/x64" \ "$(pwd)/deps/installed/macOS/x64" \ "x86_64-apple-darwin18" \ "o64-clang" \ "" } function installWin32() { buildPCDeps \ "$(pwd)/../dist/windows/i386" \ "$(pwd)/deps/installed/windows/i386" \ "i686-w64-mingw32" \ "i686-w64-mingw32-gcc -static-libgcc" \ "" } function installWin64() { buildPCDeps \ "$(pwd)/../dist/windows/x64" \ "$(pwd)/deps/installed/windows/x64" \ "x86_64-w64-mingw32" \ "x86_64-w64-mingw32-gcc -static-libgcc" \ "x86_64-w64-mingw32-g++ -static-libstdc++" } function installST() { local ST="${G_PARENT}/sdks/st" G_IS_INSTALLED[$G_ATARIST]=1 configWrite configRead mkdir -p "${ST}" if [[ ! -e "${ST}/tos104us.img" ]]; then purple "Installing TOS & Language Disk" download http://www.avtandil.narod.ru/tos/tos104us.zip unzip tos104us.zip mv tos104us.img "${ST}/." fi if [[ ! -e "${ST}/ST_language_disk_ca026062-004.ST" ]]; then purple "Installing Language Disk" download http://www.atarimania.com/pgedump.awp?id=28777 1040languagedisk.zip unzip 1040languagedisk.zip mv ST_language_disk_ca026062-004.ST "${ST}/." fi if [[ ! -e "${ST}/hatari.cfg" ]]; then purple "Configuring Hatari" cat <<-CONFIG > "${ST}/hatari.cfg" [Screen] bResizable = TRUE [Joystick1] nJoystickMode = 1 nJoyId = 0 [Sound] szYMCaptureFileName = "${ST}/hatari.wav" [Memory] szMemoryCaptureFileName = "${ST}/hatari.sav" szAutoSaveFileName = "${ST}/auto.sav" [Floppy] szDiskAFileName = "${ST}/ST_language_disk_ca026062-004.ST" szDiskImageDirectory = "${ST}" [HardDisk] szHardDiskDirectory = "${ST}" szHardDiskImage = "${ST}" szIdeMasterHardDiskImage = "${ST}" szIdeSlaveHardDiskImage = "${ST}" [ROM] szTosImageFileName = "${ST}/tos104us.img" bPatchTos = TRUE [Printer] szPrintToFileName = "${ST}/hatari.prn" [System] bPatchTimerD = TRUE bFastBoot = TRUE [Video] AviRecordFile = "${ST}/hatari.avi" CONFIG fi installVbcc if [[ ! -e "${G_PARENT}/sdks/vbcc/targets/m68k-atari" ]]; then purple "Configuring VBCC" download http://server.owl.de/~frank/vbcc/${G_VBCC_CURRENT}/vbcc_target_m68k-atari.lha lha xf vbcc_target_m68k-atari.lha mkdir -p "${G_PARENT}/sdks/vbcc/targets" cp -rf vbcc_target_m68k-atari/targets/m68k-atari "${G_PARENT}/sdks/vbcc/targets/." fi #hatari -c ${JOEY}/sdks/st/hatari.cfg } function installVbcc() { local VBCC="${G_PARENT}/sdks/vbcc" if [[ ! -e "${VBCC}/config" ]]; then purple "Installing VBCC" download http://sun.hasenbraten.de/vasm/release/vasm.tar.gz download http://sun.hasenbraten.de/vlink/release/vlink.tar.gz download http://www.ibaug.de/vbcc/vbcc.tar.gz download http://server.owl.de/~frank/vbcc/${G_VBCC_CURRENT}/vbcc_unix_config.tar tar xzf vasm.tar.gz tar xzf vlink.tar.gz tar xzf vbcc.tar.gz tar xf vbcc_unix_config.tar pushd vasm &> /dev/null make CPU=m68k SYNTAX=mot popd &> /dev/null pushd vlink &> /dev/null mkdir -p objects make popd &> /dev/null pushd vbcc &> /dev/null mkdir -p bin yes "" | make TARGET=m68k yes "" | make TARGET=m68ks popd &> /dev/null mkdir -p "${VBCC}/bin" cp vasm/{vasmm68k_mot,vobjdump} "${VBCC}/bin/." cp vlink/vlink "${VBCC}/bin/." cp vbcc/bin/* "${VBCC}/bin/." mv config "${VBCC}/." fi } function mainMenu() { local ITEMS=( "IIgs" # "Amiga" "ST" "Linux32" "Linux64" "Win32" "Win64" "macOS32" "macOS64" # "Android" # "iOS" ) local DESC=( "Apple IIgs 16" # "Commodore Amiga 16" "Atari ST 16" "Linux 32" "Linux 64" "Windows 32" "Windows 64" "macOS 32" "macOS 64" # "Android 32" # "iOS 64" ) local CHECK=( "IIgs/joeylib#b20000" # "Amiga" "ST/libjoeylib.a" "linux/i386/libjoeylib.a" "linux/x64/libjoeylib.a" "windows/i386/libjoeylib.a" "windows/x64/libjoeylib.a" "macOS/i386/libjoeylib.a" "macOS/x64/libjoeylib.a" # "Android" # "iOS" ) local TOTAL=${#ITEMS[*]} local MENU=() local X= local WHAT= local CHOICE="x" G_IS_INSTALLED=( 0 # 0 0 0 0 0 0 0 0 # 0 # 0 ) while [[ "${CHOICE}" != "" ]]; do MENU=() for (( X=0; X<=$(( ${TOTAL}-1 )); X++ )); do MENU+=( "${ITEMS[$X]}" ) if [[ -e "${G_PARENT}/dist/${CHECK[$X]}" ]]; then WHAT="Rebuild" G_IS_INSTALLED[$X]=1 else WHAT="Install" G_IS_INSTALLED[$X]=0 fi MENU+=( "${WHAT} ${DESC[$X]} Bit JoeyLib Library" ) done CHOICE=$( set e+ whiptail --title "${G_TITLE}" --cancel-button "Exit" --menu "" $(( ${TOTAL}+7 )) 65 ${TOTAL} "${MENU[@]}" 3>&2 2>&1 1>&3 set e- ) if [[ "${CHOICE}" != "" ]]; then doSudo CHOICE="install${CHOICE}" echo "" tBoldBox tCYAN "NOTE: If an error is encountered, installer will exit!" ${CHOICE} fi done } function purple() { local TEXT=$1 echo "" tBoldBox tPURPLE "${TEXT}" echo "" } # --- START function start() { # This has to exist before doSudo is called mkdir -p "${G_WORK}" doSudo # Do we have Towel yet? if [[ ! -f "${G_WORK}/towel/towel.sh" ]]; then # Do we have GIT? if [[ "$(which git || true)" == "" ]]; then echo "Installing git..." doSudo apt-get -y install git &> /dev/null fi echo "Downloading towel.sh support library..." git clone https://skunkworks.kangaroopunch.com/skunkworks/towel.git "${G_WORK}/towel" &> /dev/null fi # Load Towel source "${G_WORK}/towel/towel.sh" # Don't change directories until Towel is loaded. pushd "${G_WORK}" &> /dev/null # See if all the packages we need are installed echo "" tBoldBox tBLUE "Examining system..." tCheckPackages MISSING cmake ragel hfsplus hfsutils hfsprogs libreadline-dev libedit-dev \ build-essential git mercurial texinfo libtool autoconf automake re2c \ gcc-multilib g++-multilib mingw-w64 gdb-mingw-w64 clang llvm-dev libxml2-dev \ uuid-dev libssl-dev bash patch make tar xz-utils bzip2 gzip sed cpio \ libpulse-dev{,:i386} libasound2-dev{,:i386} genisoimage \ libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev libpcap0.8-dev \ php-cli msitools hatari lhasa bison xcftools libfuse-dev liblzma-dev libbz2-dev if [[ "${MISSING}" != "" ]]; then if (whiptail --title "${G_TITLE}" --yesno "Some required packages are missing.\n\nInstall them now?" 9 40); then TEMP=" ${MISSING//[^ ]}" TOTAL=${#TEMP} COUNT=0 { for PACKAGE in ${MISSING}; do PERCENT=$(( 100*(++COUNT)/TOTAL )) echo ${PERCENT} doSudo apt-get -y install ${PACKAGE} &> /dev/null done } | whiptail --title "${G_TITLE}" --gauge "\nInstalling packages..." 7 50 0 else tBoldBox tRED "Canceled!" echo "" echo "Installation cannot continue without the following pacakges:" echo "" echo ${MISSING} echo "" exit 1 fi fi # Do we have JoeyLib yet? if [[ ! -f ${G_PARENT}/joeylib/LICENSE ]]; then echo "" tBoldBox tBLUE "Downloading JoeyLib source..." git clone https://skunkworks.kangaroopunch.com/skunkworks/joeylib.git ${G_PARENT}/joeylib &> /dev/null fi mainMenu configWrite clear tBoldBox tBLUE "Goodbye!" echo "" # --- EXIT popd &> /dev/null } # Remember where we live. G_PARENT=$(pwd) G_SCRIPT=$(basename -- "$0") # Is SUDO after us? if [[ "$1" == "ASKPASS" ]]; then doSudoAskPass fi # At the very end so we can stream this script from a web server. start