This is a step by step instruction how to get, compile and run FreeOberon.
Make sure you have the following packages installed.
% brew install allegro
(If you do not have brew, install it, see https://brew.sh )
For more details about Allegro5, see https://github.com/liballeg/allegro5
If you are not sure if you have Allegro alredy installed.
% brew info allegro
==> allegro: stable 5.2.10.1 (bottled), HEAD
C/C++ multimedia library for cross-platform game development
https://liballeg.org/
Installed
...
Open Terminal and create a working folder.
For example:
% mkdir FreeOberon
% cd FreeOberon
Choose Button Code, then Download ZIP.
Place all zip files into your working folder.
Now you should have the follwing folder structure:
FreeOberon-main/
OfrontPlus-master/
OfrontPlus-bootstrap-master/
FreeOberon-main.zip
OfrontPlus-bootstrap-master.zip
OfrontPlus-master.zip
% cp ./OfrontPlus-bootstrap-master/unix-88/* ./OfrontPlus-master/Target/macOS/Obj
% cp ./OfrontPlus-bootstrap-master/unix-88/* ./OfrontPlus-master/Target/macOS/Lib/Obj
% cd ./OfrontPlus-master/Target/macOS/Lib/Bin
% ./cc
This creates
OfrontPlus-master/Target/macOS/Lib/libOfront.a
Go back to your WORKING folder:
cd ../../../../..
% cd ./OfrontPlus-master/Target/macOS/Bin
% ./cc
This will create:
./Target/macOS/graphviz
./Target/macOS/ocat
./Target/macOS/odc2txt
./Target/macOS/oef
./Target/macOS/ofront+
./Target/macOS/omake
./Target/macOS/showdef
Go back to your WORKING folder:
cd ../../../..
Check if the new ofront+ is working with
% ./OfrontPlus-master/Target/macOS/ofront+
It should display something like this:
Ofront+ (TM) - Oberon family of languages to C Translator v1.0
Copyright (c) Software Templ OG, 1995-2020 & VEDAsoft Oberon Club, 2013-2025
command = "ofront+" options {file options}.
options = ["-" {option} ].
option = "m" | "s" | "e" | "i" | "r" | "x" | "a" | "p" | "t" | "f" | "d"
[ "1" | "2" | "C" | "7" | "3" ] [ "21" |"44" |"48" | "88" ].
"m": generate a main module (off)
"s": allow changing the symbol file (off)
"e": allow extending the module interface (off)
"i": include header and body prefix files (Module.h0/.c0) (off)
"r": check value ranges (off)
"x": check array indices (on)
"a": check assertions (on)
"p": pointer initialization (on)
"t": check type guards (on)
"f": allow "proper FOR" (concept by Oleg Komlev) (off)
"d": translate a module into dynamic library (.dll/.so) (off)
"w": UTF-8 to UCS-2 wide character transcoding enabled (off)
"1": Oberon "2": Oberon-2 "C": Component Pascal "7": Oberon-07 "3": Oberon-3
"21": 16-bit addresses, SIZE(SET) = 1 byte (e.g. Zilog Z80 CPU)
"44": 32-bit addresses, 32-bit alignment (32-bit UNIX/Linux on x86)
"48": 32-bit addresses, 64-bit alignment (32-bit Windows, 32-bit Linux/ARMv7)
"88": 64-bit addresses, 64-bit alignment (64-bit platforms)
Rename old folder for backup:
% mv FreeOberon-main/Data/bin/OfrontPlus FreeOberon-main/Data/bin/OfrontPlus-NOT-USED
Copy the wohle OfrontPlus-master to your FreeOberbon OfrontPlus folder:
% cp -R ./OfrontPlus-master/ ./FreeOberon-main/Data/bin/OfrontPlus
% cd ./FreeOberon-main/Data/bin/OfrontPlus/Target/macOS/Lib/Bin
% ./build
Output:
Heap.cp translating Heap new symbol file 20010
Platform.Unix.cp translating Platform new symbol file 23040
Console.cp translating Console new symbol file 4907
Kernel.cp translating Kernel new symbol file 4968
CmdArgs.Unix.cp translating CmdArgs new symbol file 4060
Math.cp translating Math new symbol file 21309
MathL.cp translating MathL new symbol file 21743
Reals.cp translating Reals new symbol file 10584
Strings.cp translating Strings new symbol file 11155
Files.cp translating Files new symbol file 35070
Modules.cp translating Modules new symbol file 3365
Texts.cp translating Texts new symbol file 56426
Oberon.cp translating Oberon new symbol file 3062
ecoBigSets.cp translating ecoBigSets new symbol file 6307
ecoBuffer.cp translating ecoBuffer new symbol file 1303
ecoListen.cp translating ecoListen new symbol file 3277
ecoLists.cp translating ecoLists new symbol file 12453
ecoParser.cp translating ecoParser new symbol file 21057
ecoVector.cp translating ecoVector new symbol file 8679
Zlib.ob2 translating Zlib new symbol file 2463
ZlibBuffers.ob2 translating ZlibBuffers new symbol file 6540
ZlibDeflate.ob2 translating ZlibDeflate new symbol file 69756
ZlibInflate.ob2 translating ZlibInflate new symbol file 54967
ZlibReaders.ob2 translating ZlibReaders new symbol file 4659
ZlibWriters.ob2 translating ZlibWriters new symbol file 6290
Zip.ob2 translating Zip new symbol file 25496
oo2cAscii.cp translating oo2cAscii new symbol file 240
oo2cConvTypes.cp translating oo2cConvTypes new symbol file 629
oo2cLongStrings.cp translating oo2cLongStrings new symbol file 18119
oo2cRandomNumbers.cp translating oo2cRandomNumbers new symbol file 1753
oo2cStrings.cp translating oo2cStrings new symbol file 16056
powStrings.cp translating powStrings new symbol file 20381
SDL2.cp translating SDL2 new symbol file 7748
SDL2mixer.cp translating SDL2mixer new symbol file 3963
SQLite.cp translating SQLite new symbol file 1035
Out.cp translating Out new symbol file 11490
In.cp translating In new symbol file 5689
Graph.cp translating Graph new symbol file 56349
Sound.cp translating Sound new symbol file 1585
Turtle.cp translating Turtle new symbol file 5127
libCurl.cp translating libCurl new symbol file 662
NetHttp.cp translating NetHttp new symbol file 3921
arArgs.ob2 translating arArgs new symbol file 810
arC.ob2 translating arC new symbol file 41
arCFormat.ob2 translating arCFormat new symbol file 664
arChar.ob2 translating arChar new symbol file 1104
arCString.ob2 translating arCString new symbol file 1281
arDir.ob2 translating arDir new symbol file 2419
arMath.ob2 translating arMath new symbol file 1518
arSize.ob2 translating arSize new symbol file 1884
arStrings.ob2 translating arStrings new symbol file 7951
arStringList.ob2 translating arStringList new symbol file 4611
arStringAssoc.ob2 translating arStringAssoc new symbol file 4719
arText.ob2 translating arText new symbol file 15330
arStream.ob2 translating arStream new symbol file 4777
arFile.ob2 translating arFile new symbol file 8089
arOut.ob2 translating arOut new symbol file 2562
arPath.ob2 translating arPath new symbol file 1887
arPattern.ob2 translating arPattern new symbol file 11486
arErr.ob2 translating arErr new symbol file 2562
arConfiguration.ob2 translating arConfiguration new symbol file 28120
arValue.ob2 translating arValue new symbol file 57887
arFormat.ob2 translating arFormat new symbol file 11379
arJSON.ob2 translating arJSON new symbol file 11239
bbLinLibc.cp translating bbLinLibc new symbol file 6323
bbLinLibW.cp translating bbLinLibW new symbol file 2200
bbKernel.Unix.cp translating bbKernel new symbol file 10413
bbMath.cp translating bbMath new symbol file 16473
bbStrings.cp translating bbStrings new symbol file 41850
Back to working folder:
% cd ../../../../../../../..
Build OfrontPlus bin:
% cd ./FreeOberon-main/Data/bin/OfrontPlus/Target/macOS/Bin
% ./build
Output:
OfrontErrors.cp translating OfrontErrors new symbol file 19678
OfrontOPM.cmdln.cp translating OfrontOPM new symbol file 42996
OfrontOPS.cp translating OfrontOPS new symbol file 28147
OfrontOPT.cp translating OfrontOPT new symbol file 107556
OfrontOPB.cp translating OfrontOPB new symbol file 126989
OfrontOPP.cp translating OfrontOPP new symbol file 122247
OfrontOPC.cp translating OfrontOPC new symbol file 95485
OfrontOPV.cp translating OfrontOPV new symbol file 77696
BrowserCmd.cp translating BrowserCmd main program 30742
ImportGraph.cp translating ImportGraph main program 19081
OCatCmd.cp translating OCatCmd main program 1777
OfrontCmd.cp translating OfrontCmd main program 3229
OdcToText.ob3 translating OdcToText main program 14612
OEF.ob2 translating OEF main program 10709
OMake.ob2 translating OMake main program 26579
This creates updates also a new libOftront.a
./macOS/Lib/libOfront.a
Back to working folder:
cd ../../../../../../..
% cd FreeOberon-main
% bash ./install.sh
This script will install Free Oberon.
Free Oberon dependencies are:
* Allegro5 - for the module Graph and the graphical IDE
* Git - to download Ofront+
* GCC - to compile the generated C-code
You can find the information on how to install the dependencies
in the README.md file.
Debian / Ubuntu / Linux Mint etc.:
sudo apt-get update
sudo apt-get install -y git gcc libc-dev liballegro5-dev liballegro-image5-dev liballegro-audio5-dev liballegro-acodec5-dev
or, if sudo is not installed (on Debian):
su
apt-get update
apt-get install -y git gcc libc-dev liballegro5-dev liballegro-image5-dev liballegro-audio5-dev liballegro-acodec5-dev
Fedora:
sudo dnf install -y git gcc glibc-devel allegro5-devel allegro5-addon-image allegro5-addon-audio allegro5-addon-acodec allegro5-devel allegro5-addon-image-devel allegro5-addon-audio-devel allegro5-addon-acodec-devel
Arch Linux:
sudo pacman -Sy git gcc pkgconf glibc allegro
openSUSE:
sudo zypper install -y git gcc glibc-devel liballegro5_2-devel liballegro_audio5_2-devel liballegro_image5_2-devel liballegro_primitives5_2-devel liballegro_dialog5_2-devel liballegro_acodec5_2-devel liballegro_acodec5_2-devel liballegro_font5_2-devel
Are the dependencies installed? [y/n] y
Downloading Ofront+...
~~~~~~~~~~~~~~~~~~~~~~
Ofront+ already present.
If there are errors in installation process, delete Data/bin/OfrontPlus
Building Ofront+...
~~~~~~~~~~~~~~~~~~~
OfrontErrors.cp translating OfrontErrors 19678
OfrontOPM.cmdln.cp translating OfrontOPM 42996
OfrontOPS.cp translating OfrontOPS 28147
OfrontOPT.cp translating OfrontOPT 107556
OfrontOPB.cp translating OfrontOPB 126989
OfrontOPP.cp translating OfrontOPP 122247
OfrontOPC.cp translating OfrontOPC 95485
OfrontOPV.cp translating OfrontOPV 77696
BrowserCmd.cp translating BrowserCmd main program 30742
ImportGraph.cp translating ImportGraph main program 19081
OCatCmd.cp translating OCatCmd main program 1777
OfrontCmd.cp translating OfrontCmd main program 3229
OdcToText.ob3 translating OdcToText main program 14612
OEF.ob2 translating OEF main program 10709
OMake.ob2 translating OMake main program 26579
Building Free Oberon...
~~~~~~~~~~~~~~~~~~~~~~~
Config.Mod translating Config new symbol file 521
Func.Mod translating Func new symbol file 483
Utf8.Mod translating Utf8 new symbol file 5825
Strings.Mod translating Strings new symbol file 7897
Reals.Mod translating Reals new symbol file 15180
Int.Mod translating Int new symbol file 3052
Time.Mod translating Time new symbol file 2640
In.Mod translating In new symbol file 8553
Out.Mod translating Out new symbol file 5624
Debug.Mod translating Debug new symbol file 1735
Args.Mod translating Args new symbol file 1250
Env.Mod translating Env new symbol file 7266
Files.Mod translating Files new symbol file 40029
Texts.Mod translating Texts new symbol file 23418
Random.Mod translating Random new symbol file 1708
StrList.Mod translating StrList new symbol file 4534
Dir.Mod translating Dir new symbol file 5624
Allegro5.Mod translating Allegro5 new symbol file 15576
Graph.Mod translating Graph new symbol file 77947
Sound.Mod translating Sound new symbol file 2750
TermBox.Mod translating TermBox new symbol file 32464
Term.Mod translating Term new symbol file 1074
OV.Mod translating OV new symbol file 90505
FoStrings.Mod translating FoStrings new symbol file 6937
EditorText.Mod translating EditorText new symbol file 28820
Editor.Mod translating Editor new symbol file 66519
Builder.Mod translating Builder new symbol file 36655
FreeOberon.Mod translating FreeOberon main program 62964
Fob.Mod translating Fob main program 4846
FreeOberon.c:454:9: warning: passing arguments to 'ProcessFinished' without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
454 | if (Term_ProcessFinished(&err)) {
| ^
./Term.oh:14:51: note: expanded from macro 'Term_ProcessFinished'
14 | #define Term_ProcessFinished(err) ProcessFinished(err)
| ^
FreeOberon.c:492:23: warning: passing 'CHAR[2048]' (aka 'unsigned char[2048]') to parameter of type 'char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
492 | Term_WriteToProcess(buf, 2048, bufLen);
| ^~~
./Term.oh:21:65: note: expanded from macro 'Term_WriteToProcess'
21 | #define Term_WriteToProcess(buf, buf__len, len) WriteToProcess(buf, len)
| ^~~
./term/term.h:6:26: note: passing argument to parameter 'buf' here
6 | int WriteToProcess(char *buf, int len);
| ^
FreeOberon.c:523:29: warning: passing 'CHAR[2]' (aka 'unsigned char[2]') to parameter of type 'char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
523 | Term_WriteToProcess(buf, 2, 1);
| ^~~
./Term.oh:21:65: note: expanded from macro 'Term_WriteToProcess'
21 | #define Term_WriteToProcess(buf, buf__len, len) WriteToProcess(buf, len)
| ^~~
./term/term.h:6:26: note: passing argument to parameter 'buf' here
6 | int WriteToProcess(char *buf, int len);
| ^
FreeOberon.c:603:27: warning: passing 'CHAR[2048]' (aka 'unsigned char[2048]') to parameter of type 'char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
603 | if (Term_StartProcessIn(s, 2048, d, 2048)) {
| ^
./Term.oh:20:75: note: expanded from macro 'Term_StartProcessIn'
20 | #define Term_StartProcessIn(cmd, cmd__len, dir, dir__len) StartProcessIn(cmd, dir)
| ^~~
./term/term.h:4:26: note: passing argument to parameter 'process' here
4 | int StartProcessIn(char *process, char *dir);
| ^
FreeOberon.c:603:36: warning: passing 'CHAR[2048]' (aka 'unsigned char[2048]') to parameter of type 'char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
603 | if (Term_StartProcessIn(s, 2048, d, 2048)) {
| ^
./Term.oh:20:80: note: expanded from macro 'Term_StartProcessIn'
20 | #define Term_StartProcessIn(cmd, cmd__len, dir, dir__len) StartProcessIn(cmd, dir)
| ^~~
./term/term.h:4:41: note: passing argument to parameter 'dir' here
4 | int StartProcessIn(char *process, char *dir);
| ^
5 warnings generated.
Done building Free Oberon
~~~~~~~~~~~~~~~~~~~~~~~~~
Free Oberon is installed. You can now run: ./FreeOberon
Add the following line to ~/.bashrc to use the command fob:
export PATH=/Volumes/Apps/Emulators/FreeOberon--2025-04apr-29/FreeOberon-main:$PATH
To run Free Oberon IDE in a specific language, type ./FreeOberon --lang ru
To run Free Oberon IDE in a a window, type ./FreeOberon --window
Add the following line to ~/.bashrc to use the command fob:
export PATH=/Volumes/Apps/Emulators/FreeOberon--2025-04apr-29/FreeOberon-main:$PATH
% export PATH=/Volumes/Apps/Emulators/FreeOberon/FreeOberon--2025-05may-19-3--manually/FreeOberon-main:$PATH
% ./fob
Free Oberon Compiler version 1.1.0-alpha.8
Copyright (c) 2017-2025 by Arthur Yefimov and others.
Fob uses Ofront+ and GCC (MinGW).
Usage:
fob sourceFile
fob --lang ru sourceFile
Please specify a single file name - the main module source
% ./fob ./Programs/Examples/DirTest.Mod
% ./DirTest
[.]
[..]
[Programs]
[_Build]
[Data]
...
./fob ./Programs/Examples/FlyingDot.Mod
./FlyingDot
Run FreeOberon IDE
./FreeOberon
Menu File, Load ./Examples/Mandelbrot.Mod Menu Compile, Compile Be patient, it will calculate Mandelbrot set afer a few seconds and shows:
Depending on your graphics you need to adjust it.
Change:
BEGIN G.Settings(320, 200, {G.exact});
To 2048, 1152 for example.
Or use fullscreen:
G.Settings(0, 0, {G.fullscreen});
Or use windowing monde:
G.Settings(640, 480, {G.exact, G.window});