From ee047c1e99c57d9f59f421a649244ca0f0557187 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 29 Mar 2018 09:57:03 +0200 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ Dockerfile | 49 ++++++++++++++++++++++++++++++ README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ build.xml | 60 +++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 15920 bytes 5 files changed, 191 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 build.xml create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50f9751 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/test + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..15d6a7e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,49 @@ +FROM ubuntu:18.04 + +RUN apt-get update && apt-get install -y \ + autoconf \ + flex \ + g++ \ + gcc \ + gettext \ + git \ + lhasa \ + libgmpxx4ldbl \ + libgmp-dev \ + libmpfr6 \ + libmpfr-dev \ + libmpc3 \ + libmpc-dev \ + make \ + rsync \ + texinfo\ + wget \ + && rm -rf /var/lib/apt/lists/* && \ + cd /root && \ + git clone https://github.com/bebbo/amiga-gcc.git && \ + cd /root/amiga-gcc && \ + git checkout -qf 15aa4f3ab3054ba9dad32dd362ecaf7ff11410d3 && \ + mkdir -p /opt/amiga && \ + make update && \ + make all && \ + cd / && \ + rm -rf /root/amiga-gcc && \ + apt-get purge -y \ + autoconf \ + flex \ + g++ \ + gcc \ + gettext \ + git \ + lhasa \ + libgmp-dev \ + libmpfr-dev \ + libmpc-dev \ + make \ + rsync \ + texinfo\ + wget \ + && apt-get -y autoremove + +ENV PATH /opt/amiga/bin:$PATH + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e6041b0 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# Dockerfile for AmigaOS Cross-Compiler Toolchain + +`Dockerfile` for [Stefan "Bebbo" Franke](https://github.com/bebbo)'s [amiga-gcc](https://github.com/bebbo/amiga-gcc) toolchain for Linux/AmigaOS cross-development. + +A ready-to-use image built from this Dockerfile is available on [Docker Hub](https://hub.docker.com/r/sebastianbergmann/amiga-gcc/). + + +## "Hello world!" Example + +### AmigaOS C API + +`hello.c` from [Radosław Kujawa](https://github.com/Sakura-IT/Amiga-programming-examples/tree/master/C/hello-world-amiga): + +```c +#include +#include + +int main(int argc, void *argv[]) +{ + struct Library *SysBase; + struct Library *DOSBase; + + SysBase = *((struct Library **)4UL); + DOSBase = OpenLibrary("dos.library", 0); + + if (DOSBase) { + Write(Output(), "Hello world!\n", 13); + CloseLibrary(DOSBase); + } + + return(0); +} +``` + + +### Standard C Library + +`hello.c` from [Radosław Kujawa](https://github.com/Sakura-IT/Amiga-programming-examples/tree/master/C/hello-world): + +```c +#include + +int main() +{ + printf("Hello world!\n"); + + return(0); +} +``` + + +### Compilation + +``` +$ docker run -v $HOME:/host -it sebastianbergmann/amiga-gcc \ + m68k-amigaos-gcc /host/hello.c -o /host/hello -noixemul +``` + + +### Execution + +#### Docker-ized Emulation using FS-UAE + +The `docker-execute-amiga` script used below can be downloaded from [here](https://raw.githubusercontent.com/sebastianbergmann/docker-execute-amiga/master/docker-execute-amiga.sh). + +``` +$ docker-execute-amiga helloworld +``` + +![Screenshot](screenshot.png) + + +#### Docker-ized Emulation using Virtual AmigaOS (vamos) + +``` +$ docker run -v $HOME:/host sebastianbergmann/amitools:latest \ + vamos -C 68020 /host/hello +Hello world! +``` + diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..2475644 --- /dev/null +++ b/build.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fb0cf517728b5d78b68b743aab744c781ece90 GIT binary patch literal 15920 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