From d588561b0c1d71697ea747be8d3205692d6a2382 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Tue, 23 Jul 2019 21:17:22 -0500 Subject: [PATCH] Atari ST toolchain installer theoretically working. --- joeylib/joey.pri | 4 +- joeylib/joeylib.pro | 3 + joeylib/src/joey.h | 34 +++-- joeylib/src/test.c | 2 - scripts/installer.sh | 347 +++++++++++++++++++++++++++++++------------ 5 files changed, 275 insertions(+), 115 deletions(-) diff --git a/joeylib/joey.pri b/joeylib/joey.pri index 5c971f6..b7f48d4 100644 --- a/joeylib/joey.pri +++ b/joeylib/joey.pri @@ -1,10 +1,10 @@ +TEMPLATE = app + CONFIG += console CONFIG -= \ app_bundle \ qt -JOEY = /home/scott/joey - JOEY_INCLUDES = \ $$JOEY/dist diff --git a/joeylib/joeylib.pro b/joeylib/joeylib.pro index a1c3b10..992ba53 100644 --- a/joeylib/joeylib.pro +++ b/joeylib/joeylib.pro @@ -41,3 +41,6 @@ SDL_LIBS = \ LIBS += \ $$SDL_LIBS + +DISTFILES += \ + joey.pri diff --git a/joeylib/src/joey.h b/joeylib/src/joey.h index 5d61b3d..b7b8220 100644 --- a/joeylib/src/joey.h +++ b/joeylib/src/joey.h @@ -39,8 +39,10 @@ #define JOEY_LITLE_ENDIAN #define JOEY_PATH_SEPARATOR '/' #define segment(x) -typedef short jint16; +typedef short jint16; typedef unsigned short juint16; +typedef int jint32; +typedef unsigned int juint32; #elif _WIN32 @@ -48,9 +50,10 @@ typedef unsigned short juint16; #define JOEY_PC #define JOEY_LITLE_ENDIAN #define JOEY_PATH_SEPARATOR '\\' -#define segment(x) -typedef short jint16; +typedef short jint16; typedef unsigned short juint16; +typedef int jint32; +typedef unsigned int juint32; #elif __APPLE__ @@ -58,9 +61,10 @@ typedef unsigned short juint16; #define JOEY_PC #define JOEY_LITLE_ENDIAN #define JOEY_PATH_SEPARATOR '/' -#define segment(x) -typedef short jint16; +typedef short jint16; typedef unsigned short juint16; +typedef int jint32; +typedef unsigned int juint32; #elif __ORCAC__ @@ -68,8 +72,10 @@ typedef unsigned short juint16; #define JOEY_LITLE_ENDIAN #define JOEY_PATH_SEPARATOR '/' #define __attribute__(x) -typedef int jint16; -typedef unsigned int juint16; +typedef int jint16; +typedef unsigned int juint16; +typedef long jint32; +typedef unsigned long juint32; #ifndef JOEY_MAIN #pragma noroot #endif @@ -84,9 +90,10 @@ typedef unsigned int juint16; #define JOEY_BIG_ENDIAN #define JOEY_PATH_SEPARATOR '/' #define __attribute__(x) -#define segment(x) -typedef int jint16; -typedef unsigned int juint16; +typedef int jint16; +typedef unsigned int juint16; +typedef long jint32; +typedef unsigned long juint32; #else @@ -94,9 +101,10 @@ typedef unsigned int juint16; #define JOEY_BIG_ENDIAN #define JOEY_PATH_SEPARATOR '/' #define __attribute__(x) -#define segment(x) -typedef int jint16; -typedef unsigned int juint16; +typedef int jint16; +typedef unsigned int juint16; +typedef long jint32; +typedef unsigned long juint32; #endif diff --git a/joeylib/src/test.c b/joeylib/src/test.c index 6590266..0347526 100644 --- a/joeylib/src/test.c +++ b/joeylib/src/test.c @@ -27,8 +27,6 @@ #define JOEY_MAIN #include "joey.h" - - #ifdef JOEY_IIGS segment "testapp"; #endif diff --git a/scripts/installer.sh b/scripts/installer.sh index 57f7fd6..db575c8 100755 --- a/scripts/installer.sh +++ b/scripts/installer.sh @@ -26,17 +26,20 @@ # 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_IIGS=0 #G_AMIGA=1 -#G_ATARIST=2 -G_LINUX32=1 -G_LINUX64=2 -G_WIN32=3 -G_WIN64=4 +G_ATARIST=1 +G_LINUX32=2 +G_LINUX64=3 +G_WIN32=4 +G_WIN64=5 #G_MAC32=7 #G_MAC64=8 #G_ANDROID=9 @@ -56,9 +59,6 @@ function buildPCDeps() { local SRC="${G_PARENT}/joeylib/joeylib/src" local G_CFLAGS="-Wall -D_REENTRANT_ -I${SRC} -I${PREFIX}/include -c" - echo "" - tBoldBox tCYAN "NOTE: If an error is encountered, installer will exit!" - mkdir -p ${PREFIX} pushd deps &> /dev/null @@ -67,9 +67,7 @@ function buildPCDeps() { export CXX="${CXX_EXPORT}" # SDL2 - echo "" - tBoldBox tPURPLE "Building SDL2" - echo "" + purple "Building SDL2" if [[ ! -d SDL ]]; then hg clone http://hg.libsdl.org/SDL fi @@ -89,9 +87,7 @@ function buildPCDeps() { fi # libModPlug - echo "" - tBoldBox tPURPLE "Building libModPlug" - echo "" + purple "Building libModPlug" if [[ ! -d libmodplug ]]; then git clone https://github.com/Konstanty/libmodplug.git pushd libmodplug &> /dev/null @@ -118,9 +114,7 @@ function buildPCDeps() { fi # SDL_mixer - echo "" - tBoldBox tPURPLE "Building SDL_mixer" - echo "" + purple "Building SDL_mixer" if [[ ! -d SDL_mixer ]]; then hg clone http://hg.libsdl.org/SDL_mixer fi @@ -157,9 +151,7 @@ function buildPCDeps() { export CXX="${CXX_OLD}" # JoeyLib - echo "" - tBoldBox tPURPLE "Building JoeyLib" - echo "" + purple "Building JoeyLib" if [[ -d "${DIST}" ]]; then rm -rf "${DIST}" fi @@ -198,22 +190,84 @@ function configRead() { 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 PATH=\"\${JOEYPATH}\"" >> "${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 "export PATH=\"\${JOEY}/sdks/IIgs:\${PATH}\"" >> "${O}" echo "mountORCA.sh" >> "${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 + 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 @@ -224,11 +278,7 @@ function fetchGitHubRelease() { | cut -d : -f 2,3 \ | tr -d \" \ | head -n 1) - local FILE=${URL##*/} - if [[ -e "${FILE}" ]]; then - rm "${FILE}" - fi - wget ${URL} + download ${URL} eval $__RESULT=\${FILE} } @@ -240,7 +290,7 @@ function installIIgs() { local GGATE= local IIGS="${G_PARENT}/sdks/IIgs" - G_IS_INSTALLED[$G_IIGS] = 1 + G_IS_INSTALLED[$G_IIGS]=1 configWrite configRead @@ -251,9 +301,7 @@ function installIIgs() { chmod 777 "${IIGS}/ORCA" if [[ ! -e "${IIGS}/hfsDrive.img" ]]; then - echo "" - tBoldBox tPURPLE "Creating HFS Volume" - echo "" + purple "Creating HFS Volume" O=${IIGS}/mountORCA.sh echo "#!/bin/bash" > "${O}" echo "IIGS=${IIGS}" >> "${O}" @@ -280,7 +328,7 @@ function installIIgs() { fi "${IIGS}/mountORCA.sh" - sudo chown ${G_UID}:${G_GID} "${IIGS}/ORCA/." + 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 .. @@ -289,17 +337,12 @@ function installIIgs() { fi fi - echo "" - tBoldBox tCYAN "NOTE: If an error is encountered, installer will exit!" - if [[ ! -d GoldenGate ]]; then tFileBrowser GGATE "Please locate your 'Golden Gate' MSI" .msi .. if [[ -z ${GGATE} || "${GGATE}" == "" ]]; then return 0 fi - echo "" - tBoldBox tPURPLE "Building GoldenGate" - echo "" + purple "Building GoldenGate" git clone git@gitlab.com:GoldenGate/GoldenGate.git if [ ! -d GoldenGate ]; then tBoldBox tRED "Unable to clone the GoldenGate repository!" @@ -328,15 +371,11 @@ function installIIgs() { fi if [[ ! -e "${IIGS}/ORCA/Languages/cc" ]]; then - echo "" - tBoldBox tPURPLE "Installing ORCA/C" - echo "" + purple "Installing ORCA/C" isoinfo -i "${ORCA}" -x /FOR_EMUL/BYTEWORK.S\;1 > BYTEWORKS "${IIGS}/opus-extractor" -v BYTEWORKS "${IIGS}/ORCA" - echo "" - tBoldBox tPURPLE "Upgrading ORCA/C" - echo "" + purple "Upgrading ORCA/C" fetchGitHubRelease RESULT byteworksinc ORCA-C 2mg "${IIGS}/opus-extractor" -v -s / ${RESULT} "${IIGS}/ORCA" @@ -369,9 +408,7 @@ function installIIgs() { fi if [[ ! -d gsplus ]]; then - echo "" - tBoldBox tPURPLE "Building GSplus" - echo "" + purple "Building GSplus" git clone https://github.com/digarok/gsplus.git mkdir gsplus/build pushd gsplus/build &> /dev/null @@ -389,33 +426,21 @@ function installIIgs() { fi if [[ ! -f "${IIGS}/gsplus/ROM.03" ]]; then - echo "" - tBoldBox tPURPLE "Installing IIgs ROM" - echo "" - if [[ -e rom3.zip ]]; then - rm -f rom3.zip - fi - wget http://www.whatisthe2gs.apple2.org.za/files/rom3.zip + 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 - echo "" - tBoldBox tPURPLE "Installing GS/OS" - echo "" - if [[ -e harddrive_image.zip ]]; then - rm -f harddrive_image.zip - fi - wget http://www.whatisthe2gs.apple2.org.za/files/harddrive_image.zip + 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 - echo "" - tBoldBox tPURPLE "Building Cadius" - echo "" + purple "Building Cadius" git clone https://github.com/mach-kernel/cadius.git pushd cadius &> /dev/null make @@ -429,13 +454,8 @@ function installIIgs() { fi if [[ ! -e "${IIGS}/ntconverter/ntconverter.php" ]]; then - echo "" - tBoldBox tPURPLE "Installing NinjaTracker Converter" - echo "" - if [[ -e ntconverter.zip ]]; then - rm -f ntconverter.zip - fi - wget https://www.ninjaforce.com/downloads/ntconverter.zip + 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/." @@ -444,20 +464,13 @@ function installIIgs() { mkdir -p "${JOEY}/dist/IIgs" if [[ ! -e "${JOEY}/dist/IIgs/Tool221#ba0000" ]]; then - echo "" - tBoldBox tPURPLE "Installing Tool221" - echo "" - if [[ -e ninjatracker_tool221_v2.1.2mg ]]; then - rm -f ninjatracker_tool221_v2.1.2mg - fi - wget https://www.brutaldeluxe.fr/products/apple2gs/tool221/ninjatracker_tool221_v2.1.2mg + 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 - echo "" - tBoldBox tPURPLE "Building JoeyLib" - echo "" + purple "Building JoeyLib" O=${IIGS}/ORCA/out/joey if [[ -d "${O}" ]]; then rm -rf "${O}" @@ -524,11 +537,130 @@ function installWin64() { } +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" + "ST" "Linux32" "Linux64" "Win32" @@ -541,7 +673,7 @@ function mainMenu() { local DESC=( "Apple IIgs 16" # "Commodore Amiga 16" -# "Atari ST 16" + "Atari ST 16" "Linux 32" "Linux 64" "Windows 32" @@ -554,7 +686,7 @@ function mainMenu() { local CHECK=( "IIgs/joeylib#b20000" # "Amiga" -# "ST" + "ST/libjoeylib.a" "linux/i386/libjoeylib.a" "linux/x64/libjoeylib.a" "windows/i386/libjoeylib.a" @@ -573,7 +705,7 @@ function mainMenu() { G_IS_INSTALLED=( 0 # 0 -# 0 + 0 0 0 0 @@ -603,39 +735,48 @@ function mainMenu() { set e- ) if [[ "${CHOICE}" != "" ]]; then - sudo -v + 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() { - sudo -v - mkdir -p installerWork + # This has to exist before doSudo is called + mkdir -p "${G_WORK}" + + doSudo # Do we have Towel yet? - if [[ ! -f installerWork/towel/towel.sh ]]; then + if [[ ! -f "${G_WORK}/towel/towel.sh" ]]; then # Do we have GIT? if [[ "$(which git || true)" == "" ]]; then echo "Installing git..." - sudo apt-get -y install git &> /dev/null + doSudo apt-get -y install git &> /dev/null fi echo "Downloading towel.sh support library..." - git clone https://skunkworks.kangaroopunch.com/skunkworks/towel.git installerWork/towel &> /dev/null + git clone https://skunkworks.kangaroopunch.com/skunkworks/towel.git "${G_WORK}/towel" &> /dev/null fi # Load Towel - source installerWork/towel/towel.sh - - # Remember where we live. - G_PARENT=$(pwd) + source "${G_WORK}/towel/towel.sh" # Don't change directories until Towel is loaded. - pushd installerWork &> /dev/null + pushd "${G_WORK}" &> /dev/null # See if all the packages we need are installed echo "" @@ -646,7 +787,7 @@ function start() { uuid-dev libssl-dev bash patch make tar xz-utils bzip2 gzip sed cpio \ libpulse-dev{,:i386} libasound2-dev{,:i386} \ libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev libpcap0.8-dev \ - php-cli msitools + php-cli msitools hatari lhasa bison if [[ "${MISSING}" != "" ]]; then if (whiptail --title "${G_TITLE}" --yesno "Some required packages are missing.\n\nInstall them now?" 9 40); then @@ -657,7 +798,7 @@ function start() { for PACKAGE in ${MISSING}; do PERCENT=$(( 100*(++COUNT)/TOTAL )) echo ${PERCENT} - sudo apt-get -y install ${PACKAGE} &> /dev/null + doSudo apt-get -y install ${PACKAGE} &> /dev/null done } | whiptail --title "${G_TITLE}" --gauge "\nInstalling packages..." 7 50 0 else @@ -689,5 +830,15 @@ function start() { 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