README_build_eng_macOS_manually.md 20 KB

How to download, compile and install FreeOberon on macOS

This is a step by step instruction how to get, compile and run FreeOberon.

Screenshot 2025-05-19 at 14 53 04

Screenshot 2025-05-19 at 15 15 37

  • FreeOberon (FreeOberon) is a frontend with a text editor like Turbo Pascal for DOS
  • ofront+ (OfrontPlus) is a Oberon to C source code translator
  • OfrontPlus bootstrap (OfrontPlus-bootstrap) - some lowlevel bootstrap code differs for every target machine

Step 1 - Requirements

Make sure you have the following packages installed.

Install Allegro5

% 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
...

Step 2 - Create a working folder

Open Terminal and create a working folder.

For example:

% mkdir FreeOberon
% cd FreeOberon

Step 3 - Download FreeOberon, ofront+ and OfrontPlus-bootstrap

Choose Button Code, then Download ZIP.

Place all zip files into your working folder.

Step 4 - Unpack

  • macOS, open Finder, double click zip for every zip you downloaded before.

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

Step 5 - Copy bootstrap unix-88 to FreeOberon

% cp ./OfrontPlus-bootstrap-master/unix-88/*  ./OfrontPlus-master/Target/macOS/Obj
% cp ./OfrontPlus-bootstrap-master/unix-88/*  ./OfrontPlus-master/Target/macOS/Lib/Obj

Step 6 - compile libOfront

% cd ./OfrontPlus-master/Target/macOS/Lib/Bin
% ./cc

This creates

OfrontPlus-master/Target/macOS/Lib/libOfront.a

Go back to your WORKING folder:

cd ../../../../..

Step 7 - compile ofront+ and tools

% 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 ../../../..

Step 8 - check if ofront+ is working

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)

Step 9 - Put OfontPlus in place to FreeOberon

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

Step 10 - compile if ofront+ Lib/Bin

% 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 ../../../../../../..

Step 11 - compile FreeOberon

% 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

run examples and FreeOberon IDE

% ./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});

Screenshot 2025-05-19 at 14 53 04

Screenshot 2025-05-19 at 14 58 39

Screenshot 2025-05-19 at 14 58 52