Byblos: Difference between revisions

From XionKB
Jump to navigationJump to search
m (explain devkitPro installation more concisely)
(wip)
 
(3 intermediate revisions by the same user not shown)
Line 12: Line 12:


==Byblos 1==
==Byblos 1==
Byblos 1 is the provisional Byblos SDK, architected around Intel and Apple Silicon macOS as well as x86-64 GNU/Linux. Fortunately, all of our compiler toolchains (with the exception of OpenWatcom detailed later) have a relatively straightforward installation process on all of the supported host operating systems.
Byblos 1 is the provisional Byblos SDK, running on GNU/Linux with <tt>glibc</tt>, either on x86-64 or AArch64. These two platforms are the only supported hosts, and on them Byblos can target the following platforms:
* GNU/Linux with <tt>glibc</tt> on x86-64
* GNU/Linux with <tt>glibc</tt> on AArch64
* GNU/Linux with <tt>glibc</tt> on ARMv7HF
* GNU/Linux with <tt>musl</tt> on x86-64
* GNU/Linux with <tt>musl</tt> on AArch64
* GNU/Linux with <tt>musl</tt> on ARMv7HF
* Microsoft Windows 95, 98 and Me on i386
* Microsoft Windows NT 4.0+ on i386
* Microsoft Windows NT 5.1+ on x64
* Apple macOS 10.4+ on Intel 64
* Apple macOS 11.0+ on AArch64


Byblos 1 should support compiling assembly, ANSI C and <tt>bin</tt>packed assets on all target platforms. Additionally, it supports host-only just-in-time compilation and running of Vala programs, enabling the creation of developer utilities with graphical interfaces. Vala only depends on the system toolchain and the Vala package of the native package manager.
All GNU/Linux targets use GCC cross-compilers, while all Windows targets use a single MinGW-W64 cross-compiler and all Apple targets use two clang compilers to generate fat binaries with <code>lipo</code>. Even though Clang is inherently a cross-compiler, two versions of it must be provided since maximal compatibility necessitates using different versions of the proprietary Apple SDK for each microarchitecture: 10.4 provides the earliest x86-64 SDK while 11.0 provides the earliest AArch64 SDK.


===Platform support===
Later, support ''may'' be added for the following platforms, pending integration of devkitARM and OpenWatcom 2:
Byblos 1 is multi-platform. While it endeavours to target all systems of relevance to Xion Megatrends, only three host platforms are supported: GNU/Linux on Intel 64, Darwin/XNU on Intel 64 and Darwin/XNU on Apple silicon. Since Byblos 1 is a provisional SDK that leans on existing platform provisions for brevity, it additionally supports Vala for easily developing performant and optionally GUI-enabled applications for helping development.
* Nintendo Game Boy Advance on ARMv4T
* Microsoft Windows 3.1 on i286
* MS-DOS 5.0+ on i286


====Supported targets====
All target platforms support console-type applications as well as graphical ones with OpenGL hardware acceleration. Supported languages include ANSI C, C++14, and GNU assembler. Platforms that use OpenWatcom 2 lose C++ support, and both OpenWatcom 2 and devkitARM dependent platforms lack OpenGL support.
 
===Supported targets===
{| class="wikitable" width="900px"
{| class="wikitable" width="900px"
|-
|-
Line 29: Line 44:
! style="text-wrap:nowrap;width:30px" | <tt>ASM</tt>
! style="text-wrap:nowrap;width:30px" | <tt>ASM</tt>
! style="text-wrap:nowrap;width:30px" | C
! style="text-wrap:nowrap;width:30px" | C
! style="text-wrap:nowrap;width:30px" | C++
! style="text-wrap:nowrap;width:30px" | <tt>bin</tt>
! style="text-wrap:nowrap;width:30px" | <tt>bin</tt>
! style="text-align:left" | Notes
! style="text-align:left" | Notes
Line 37: Line 53:
| style="text-align:center" | ARMv4T
| style="text-align:center" | ARMv4T
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 44: Line 61:
| style="text-align:center" | [[File:agbsp.svg|28px]]
| style="text-align:center" | [[File:agbsp.svg|28px]]
| style="text-align:center" | <tt>agbsp</tt>
| style="text-align:center" | <tt>agbsp</tt>
| style="text-align:center" | GBA sourcepage
| style="text-align:center" | GBA sourcepatch
| style="text-align:center" | ARMv4T
| style="text-align:center" | ARMv4T
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 56: Line 74:
| style="text-align:center" | [[A*|Anodyne A*]]
| style="text-align:center" | [[A*|Anodyne A*]]
| style="text-align:center" | ''unknown''
| style="text-align:center" | ''unknown''
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
Line 62: Line 81:
| Too early to specify.
| Too early to specify.
|-
|-
| style="text-align:center" | [[File:darwin86.svg|28px]]
| style="text-align:center" | [[File:darwin.svg|28px]]
| style="text-align:center" | <tt>darwin86</tt>
| style="text-align:center" | <tt>darwin</tt>
| style="text-align:center" | Intel Mac
| style="text-align:center" | macOS
| style="text-align:center" | x86-64 v1
| style="text-align:center" | x86-64 v1 and ARMv8
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
| &nbsp;
|-
|-
| style="text-align:center" | [[File:darwinm1.svg|28px]]
| style="text-align:center" | [[File:glinuxa64.svg|28px]]
| style="text-align:center" | <tt>darwinm1</tt>
| style="text-align:center" | <tt>glinuxa64</tt>
| style="text-align:center" | Apple Silicon Mac
| style="text-align:center" | GNU/Linux + <tt>glibc</tt>
| style="text-align:center" | ARMv8
| style="text-align:center" | ARMv8.0
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-yellow" | &ndash;
| Only host that can target everything.
| Assumes VFPv2 hard float support.
|-
|-
| style="text-align:center" | [[File:freebsd.svg|28px]]
| style="text-align:center" | [[File:glinuxx64.svg|28px]]
| style="text-align:center" | <tt>freebsd</tt>
| style="text-align:center" | <tt>glinuxx64</tt>
| style="text-align:center" | FreeBSD
| style="text-align:center" | GNU/Linux + <tt>glibc</tt>
| style="text-align:center" | x86-64 v1
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 92: Line 114:
| &nbsp;
| &nbsp;
|-
|-
| style="text-align:center" | [[File:ibmpc.svg|28px]]
| style="text-align:center" | [[File:mlinuxa64.svg|28px]]
| style="text-align:center" | <tt>ibmpc</tt>
| style="text-align:center" | <tt>mlinuxa64</tt>
| style="text-align:center" | Real mode IBM-PC
| style="text-align:center" | GNU/Linux + <tt>musl</tt>
| style="text-align:center" | Intel i286
| style="text-align:center" | ARMv8.0
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| Not specific to any DOS conventions.
|-
| style="text-align:center" | [[File:illumos.svg|28px]]
| style="text-align:center" | <tt>illumos</tt>
| style="text-align:center" | illumos/OpenIndiana
| style="text-align:center" | SPARC64 V9
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
| Assumes VFPv2 hard float support.
|-
|-
| style="text-align:center" | [[File:linux32.svg|28px]]
| style="text-align:center" | [[File:mlinuxx64.svg|28px]]
| style="text-align:center" | <tt>linux32</tt>
| style="text-align:center" | <tt>mlinuxx64</tt>
| style="text-align:center" | GNU/Linux 32-bit
| style="text-align:center" | GNU/Linux + <tt>musl</tt>
| style="text-align:center" | Intel i686
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
| style="text-align:center" | [[File:linux64.svg|28px]]
| style="text-align:center" | <tt>linux64</tt>
| style="text-align:center" | GNU/Linux 64-bit
| style="text-align:center" | x86-64 v1
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
| style="text-align:center" | [[File:milotix.svg|28px]]
| style="text-align:center" | <tt>milotix</tt>
| style="text-align:center" | [[MILOTIX]]
| style="text-align:center" | x86-64 v3
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
| style="text-align:center" | [[File:openbsd.svg|28px]]
| style="text-align:center" | <tt>openbsd</tt>
| style="text-align:center" | OpenBSD
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 154: Line 138:
| style="text-align:center" | [[File:pcdos.svg|28px]]
| style="text-align:center" | [[File:pcdos.svg|28px]]
| style="text-align:center" | <tt>pcdos</tt>
| style="text-align:center" | <tt>pcdos</tt>
| style="text-align:center" | Real mode PC-DOS
| style="text-align:center" | MS-DOS 5.0+
| style="text-align:center" | Intel i286
| style="text-align:center" | Intel i286
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| &nbsp;
| &nbsp;
Line 169: Line 154:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| &nbsp;
| &nbsp;
Line 177: Line 163:
| style="text-align:center" | Intel i386
| style="text-align:center" | Intel i386
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 187: Line 174:
| style="text-align:center" | Intel i386
| style="text-align:center" | Intel i386
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 197: Line 185:
| style="text-align:center" | x86-64 v1
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 203: Line 192:
|}
|}


=====Notes=====
====Notes====
* '''<tt>bin</tt>packing''' is a highly portable method of compiling assets statically into binaries
* '''<tt>bin</tt>packing''' is a highly portable method of compiling assets statically into binaries
* For assembly, uncertainty exists about toolchain support on macOS
* For assembly, uncertainty exists about toolchain support on macOS
* For <tt>bin</tt>packing, it may eventually work but needs further research
* For <tt>bin</tt>packing, it may eventually work but needs further research


====Compile time support matrix====
===Programs list===
{| class="wikitable" width="900px" style="text-align:center"
{| class="wikitable" width="600px"
|-
! rowspan="2" width="132px" | Host
! colspan="6" width="768px" | Target
|-
| width="128px" | <tt>agbhb</tt>
| width="128px" | <tt>agbsp</tt>
| width="128px" | <tt>astar</tt>
| width="128px" | <tt>darwin86</tt>
| width="128px" | <tt>darwinm1</tt>
| width="128px" | <tt>freebsd</tt>
|-
| <tt>linux64</tt>
| devkitARM
| devkitARM
| ''unknown''
| ''none''
| ''none''
| LLVM
|-
| <tt>darwin86</tt>
| devkitARM
| devkitARM
| ''unknown''
| hb:LLVM
| hb:LLVM
| hb:LLVM
|-
| <tt>darwinm1</tt>
| devkitARM
| devkitARM
| ''unknown''
| hb:LLVM
| hb:LLVM
| hb:LLVM
|-
! rowspan="2" | Host
! colspan="6" | Target
|-
| <tt>ibmpc</tt>
| <tt>illumos</tt>
| <tt>linux32</tt>
| <tt>linux64</tt>
| <tt>milotix</tt>
| <tt>openbsd</tt>
|-
| <tt>linux64</tt>
| OpenWatcom
| LLVM
| LLVM
| LLVM
| ''unknown''
| LLVM
|-
| <tt>darwin86</tt>
| OpenWatcom
| hb:LLVM
| hb:LLVM
| hb:LLVM
| ''unknown''
| hb:LLVM
|-
| <tt>darwinm1</tt>
| OpenWatcom
| hb:LLVM
| hb:LLVM
| hb:LLVM
| ''unknown''
| hb:LLVM
|-
! rowspan="2" | Host
! colspan="6" | Target
|-
| <tt>pcdos</tt>
| <tt>win311</tt>
| <tt>win95</tt>
| <tt>winnt32</tt>
| <tt>winnt64</tt>
| &nbsp;
|-
| <tt>linux64</tt>
| OpenWatcom
| OpenWatcom
| MinGW
| MinGW
| MinGW
| &nbsp;
|-
| <tt>darwin86</tt>
| OpenWatcom
| OpenWatcom
| MinGW
| MinGW
| MinGW
| &nbsp;
|-
| <tt>darwinm1</tt>
| OpenWatcom
| OpenWatcom
| MinGW
| MinGW
| MinGW
| &nbsp;
|}
 
====Runtime support matrix====
{| class="wikitable" width="900px" style="text-align:center"
|-
! rowspan="2" width="132px" | Host
! colspan="6" width="768px" | Target
|-
| width="128px" | <tt>agbhb</tt>
| width="128px" | <tt>agbsp</tt>
| width="128px" | <tt>astar</tt>
| width="128px" | <tt>darwin86</tt>
| width="128px" | <tt>darwinm1</tt>
| width="128px" | <tt>freebsd</tt>
|-
| <tt>linux64</tt>
| mGBA
| mGBA
| ''unknown''
| ''none''
| ''none''
| QEMU/u
|-
| <tt>darwin86</tt>
| mGBA
| mGBA
| ''unknown''
| ''native''
| ''none''
| QEMU/u
|-
| <tt>darwinm1</tt>
| mGBA
| mGBA
| ''unknown''
| Rosetta 2
| ''native''
| QEMU/u
|-
! rowspan="2" | Host
! colspan="6" | Target
|-
| <tt>ibmpc</tt>
| <tt>illumos</tt>
| <tt>linux32</tt>
| <tt>linux64</tt>
| <tt>milotix</tt>
| <tt>openbsd</tt>
|-
| <tt>linux64</tt>
| Bochs
| QEMU/h
| ''native-ish''
| ''native''
| ''unknown''
| QEMU/u
|-
| <tt>darwin86</tt>
| Bochs
| QEMU/h
| QEMU/u
| QEMU/u
| ''unknown''
| QEMU/u
|-
| <tt>darwinm1</tt>
| Bochs
| QEMU/h
| QEMU/u
| QEMU/u
| ''unknown''
| QEMU/u
|-
! rowspan="2" | Host
! colspan="6" | Target
|-
| <tt>pcdos</tt>
| <tt>win311</tt>
| <tt>win95</tt>
| <tt>winnt32</tt>
| <tt>winnt64</tt>
| &nbsp;
|-
| <tt>linux64</tt>
| DOSBox
| DOSBox
| Wine
| Wine
| Wine
| &nbsp;
|-
| <tt>darwin86</tt>
| DOSBox
| DOSBox
| Wine
| Wine
| Wine
| &nbsp;
|-
| <tt>darwinm1</tt>
| DOSBox
| DOSBox
| Wine
| Wine
| Wine
| &nbsp;
|}
 
====Tool list====
{| class="wikitable" width="900px"
|-
! Tool name
! width="100%" | Description
|-
| devkitARM
| devkitPro's 32-bit ARM GCC toolchain.
|-
| hb:LLVM
| LLVM installed via Homebrew on macOS.
|-
| LLVM
| LLVM installed on a Unix-like.
|-
| OpenWatcom
| Open source continuation of the Watcom C compiler for 16-bit DOS systems.
|-
| MinGW
| Modified GCC for targeting Microsoft Windows.
|-
| mGBA
| Accurate GBA emulator.
|-
| QEMU/u
| QEMU virtualisation framework, in the low-friction userland virtualisation mode.
|-
| QEMU/h
| QEMU virtualisation framework, using a full-fat VM.
|-
| Bochs
| Accurate IBM-PC emulator.
|-
| Wine
| Translation layer for Windows programs to run on other operating systems.
|-
| Rosetta 2
| Apple's transition system for running Intel Mac programs on Apple Silicon.
|-
| DOSBox
| Accurate MS-DOS emulator with a focus on gaming.
|}
 
====Programs list====
{| class="wikitable" width="900px"
|-
|-
! style="text-wrap:nowrap;width:30px" | <tt>i</tt>
! style="text-wrap:nowrap;width:30px" | <tt>i</tt>
Line 470: Line 204:
! style="text-wrap:nowrap;width:30px" | <span title="agbhb">[[File:agbhb.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="agbhb">[[File:agbhb.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="agbsp">[[File:agbsp.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="agbsp">[[File:agbsp.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="astar">[[File:astar.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="darwin">[[File:darwin.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="darwin86">[[File:darwin86.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="glinuxa64">[[File:glinuxa64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="darwinm1">[[File:darwinm1.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="glinuxx64">[[File:glinuxx64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="freebsd">[[File:freebsd.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="mlinuxa64">[[File:mlinuxa64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="ibmpc">[[File:ibmpc.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="mlinuxx64">[[File:mlinuxx64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="illumos">[[File:illumos.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="linux32">[[File:linux32.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="linux64">[[File:linux64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="milotix">[[File:milotix.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="openbsd">[[File:openbsd.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="pcdos">[[File:pcdos.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="pcdos">[[File:pcdos.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="win311">[[File:win311.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="win311">[[File:win311.svg|28px]]</span>
Line 490: Line 219:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 510: Line 234:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 520: Line 242:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:outbound.svg|28px]]
| style="text-align:center" | [[File:outbound.svg|28px]]
Line 531: Line 250:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 548: Line 262:
| style="text-align:center" | [[File:rebound.svg|28px]]
| style="text-align:center" | [[File:rebound.svg|28px]]
| style="text-align:center" | [[Rebound]]
| style="text-align:center" | [[Rebound]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 570: Line 279:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 580: Line 285:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 588: Line 292:
| style="text-align:center" | [[File:forerunner.svg|28px]]
| style="text-align:center" | [[File:forerunner.svg|28px]]
| style="text-align:center" | [[Forerunner]]
| style="text-align:center" | [[Forerunner]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 610: Line 309:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 620: Line 317:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:simbel.svg|28px]]
| style="text-align:center" | [[File:simbel.svg|28px]]
Line 631: Line 325:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 648: Line 337:
| style="text-align:center" | [[File:oracion.svg|28px]]
| style="text-align:center" | [[File:oracion.svg|28px]]
| style="text-align:center" | [[Oración]]
| style="text-align:center" | [[Oración]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
Line 661: Line 349:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:fcc.svg|28px]]
| style="text-align:center" | [[File:fcc.svg|28px]]
| style="text-align:center" | [[Feeble C compiler|FCC]]
| style="text-align:center" | [[Feeble C compiler|FCC]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
Line 681: Line 364:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:quindle.svg|28px]]
| style="text-align:center" | [[File:quindle.svg|28px]]
Line 691: Line 370:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
|-
|-
| style="text-align:center" | [[File:gauntlet.svg|28px]]
| style="text-align:center" | [[File:gauntlet.svg|28px]]
| style="text-align:center" | [[Gauntlet]]
| style="text-align:center" | [[Gauntlet]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
Line 721: Line 394:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:senusrets.svg|28px]]
| style="text-align:center" | [[File:senusrets.svg|28px]]
Line 731: Line 400:
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
| style="text-align:center" | [[File:sirius.svg|28px]]
| style="text-align:center" | [[Sirius C*]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 760: Line 409:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
|-
| style="text-align:center" | [[File:natpython.svg|28px]]
| style="text-align:center" | [[File:sirius.svg|28px]]
| style="text-align:center" | [[NatPython]]
| style="text-align:center" | [[Sirius C*]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
Line 774: Line 417:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
Line 780: Line 422:
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
| style="text-align:center" | [[File:blank.png|28px]]
| style="text-align:center" | [[SablMap]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" |
|-
| style="text-align:center" class="cell-red" |
| style="text-align:center" | [[File:natpython.svg|28px]]
| style="text-align:center" | [[NatPython]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
| style="text-align:center" | [[File:blank.png|28px]]
| style="text-align:center" | [[CheckASCII]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
| style="text-align:center" | [[File:blank.png|28px]]
| style="text-align:center" | [[Checkline]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|-
| style="text-align:center" | [[File:blank.png|28px]]
| style="text-align:center" | [[Flow72]]
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
|}
|}


===Getting the toolchains===
===Installing the SDK===
Byblos 1 depends on devkitARM, MinGW, LLVM and OpenWatcom to compile code for the various targets it supports. All but OpenWatcom can be installed in binary form using package managers.
Byblos 1 can only be run on a <tt>musl</tt> based installation of GNU/Linux, either on the x86-64 or AArch64 microarchitectures. Use of a VM is recommended when this is not directly available on a machine.
 
The <code>/opt/byblos</code> root has the following hierarchy:
 
: <tt>/opt/byblos/</tt> &ndash; SDK root
:: <tt>/opt/byblos/conf/</tt> &ndash; configuration settings
:: <tt>/opt/byblos/include/</tt> &ndash; header files (<tt>.h</tt>) and assembly headers (<tt>.inc</tt>)
:: <tt>/opt/byblos/man/</tt> &ndash; manuals
:: <tt>/opt/byblos/sbin/</tt> &ndash; script binaries (architecture independent)
:: <tt>/opt/byblos/share/</tt> &ndash; shared resources and miscellanea
:: <tt>/opt/byblos/slib/</tt> &ndash; script dependencies/libraries (architecture independent)
:: <tt>/opt/byblos/system/</tt> &ndash; private folder for internal SDK business
:: <tt>/opt/byblos/target/<u>$t</u>/</tt> &ndash; parent folder for target-specific sub-hierarchies (<tt><u>$t</u></tt> is the target ident)
::: <tt>/opt/byblos/target/<u>$t</u>/bin/</tt> &ndash; runnable binaries
::: <tt>/opt/byblos/target/<u>$t</u>/lib/</tt> &ndash; static libraries
::: <tt>/opt/byblos/target/<u>$t</u>/share/</tt> &ndash; target-specific miscellanea (e.g. associated production materials, emulator settings, etc.)
:: <tt>/opt/byblos/tc/<u>$tc</u>/</tt> &ndash; toolchain sysroots
 
Byblos 1 entirely avoids pre-compiling native programs, instead leaning on the externally-provided toolchains to run C code and Vala code in utilities as necessary. So, it lacks a host <code>bin/</code> folder or associated <code>lib/</code> folder, which are replaced by <code>sbin/</code> and <code>slib/</code> respectively. Hashbangs are used to achieve program invocation.


Follow [//devkitpro.org/wiki/devkitPro_pacman devkitPro's wiki page] to install devkitARM on macOS or GNU/Linux with respect to your distro. Once you have <code>{dkp-,}pacman</code>, run <code>{dkp-,}pacman -S devkit-env devkitARM devkitARM-gdb gba-tools general-tools grit</code> to obtain all necessary tools and scripts for Byblos' <code>agbhb</code> and <code>agbsp</code> platforms.
Xion Megatrends offers an installation shell script that initialises the above directories, downloads the toolchains and downloads additional SDK files as necessary.


MinGW and LLVM can be installed in the typical way with your package manager. '''Do not confuse LLVM with Xcode's clang on macOS!''' Byblos on macOS uses LLVM as installed with Homebrew. The system toolchain is '''only''' used to bootstrap OpenWatcom and compile Vala code for developers.
====About the toolchains====
Byblos 1 depends on specially compiled versions of GCC to compile code for the various targets it supports. In total, there are 9 compilers for each host, for a total of 18:
* GCC <tt>aarch64-linux-musl</tt>
* GCC <tt>arm-linux-musl</tt>
* GCC <tt>x86_64-linux-musl</tt>
* GCC <tt>aarch64-linux-gnu</tt>
* GCC <tt>arm-linux-gnu</tt>
* GCC <tt>x86_64-linux-gnu</tt>
* Clang for macOS SDK 10.4
* Clang for macOS SDK 11.0
* MinGW-W64


Xion Megatrends offers pre-built binaries of all of these, compiled to run from <code>/opt/byblos/tc/&lt;ident&gt;</code>, where <code>&lt;ident&gt;</code> is the Byblos target platform identifier, <code>$TP</code>. An exception to this naming rule is for <code>darwin</code>, where instead <code>darwinx64</code> is used for x86-64 code and the 10.4 SDK and <code>darwina64</code> is used for AArch64 code and the 11.0 SDK. Another exception is for <code>win95</code>, <code>winnt32</code> and <code>winnt64</code>, which all use a single MinGW install available at <code>/opt/byblos/tc/mingw64</code>. <!--
XXX: OpenWatcom 2 and devkitARM not available
====Getting OpenWatcom====
====Getting OpenWatcom====
Unfortunately the OpenWatcom 2 project does not provide distro packages or macOS binaries, so it must be built from source. Arch Linux users have the benefit of [//aur.archlinux.org/packages/openwatcom-v2 an AUR package] that mostly automates this, and the pathing dictated by our step-by-step process here should be consistent with that script so there are no quirks in usage.
Unfortunately the OpenWatcom 2 project does not provide distro packages or macOS binaries, so it must be built from source. Arch Linux users have the benefit of [//aur.archlinux.org/packages/openwatcom-v2 an AUR package] that mostly automates this, and the pathing dictated by our step-by-step process here should be consistent with that script so there are no quirks in usage.
Line 879: Line 484:
# Run <code>xcode-select --install</code>
# Run <code>xcode-select --install</code>
# Follow [//brew.sh/#install brew.sh#install]
# Follow [//brew.sh/#install brew.sh#install]
# Run <code>brew install dosbox</code>
# Run <code>brew install dosbox-x</code>
# Manually choose the latest release from [//github.com/open-watcom/open-watcom-v2/releases the repository]
# Manually choose the latest release from [//github.com/open-watcom/open-watcom-v2/releases the repository]
#* Select the source code <tt>.tar.gz</tt> in particular
#* Select the source code <tt>.tar.gz</tt> in particular
# <tt>un</tt><code>tar</code> the source into a <code>$dir</code> of your choice
# <tt>un</tt><code>tar</code> the source into a <code>$dir</code> of your choice
# Set environment variable <code>OWTOOLS=CLANG</code>
# Set environment variable <code>OWTOOLS=CLANG</code>
# Set environment variable <code>OWDOSBOX=dosbox</code>
# Set environment variable <code>OWDOSBOX=dosbox-x</code>
# Run <code>export OWTOOLS OWDOSBOX</code>
# Run <code>export OWTOOLS OWDOSBOX</code>
# Run <code>cd $dir</code>
# Run <code>cd $dir</code>
# Run <code>./build.sh</code>
# Run <code>./build.sh</code>
# Run <code>./build.sh rel</code>
# Run <code>sudo mkdir /opt/watcom</code>
# Run <code>sudo mkdir /opt/watcom</code>
# Run <code>sudo ./build.sh /opt/watcom</code>
# Run <code>sudo cp -a rel/. /opt/watcom/</code>
# Append the following lines to your <tt>.profile</tt> (or your equivalent to <tt>.profile</tt>):
# Append the following lines to your <tt>.profile</tt> (or your equivalent to <tt>.profile</tt>):
#* <code>WATCOM=/opt/watcom</code>
#* <code>WATCOM=/opt/watcom</code>
Line 896: Line 502:
#* <code>export WATCOM EDDAT PATH</code>
#* <code>export WATCOM EDDAT PATH</code>
# Run <code>source .profile</code> (or your equivalent to <tt>.profile</tt>)
# Run <code>source .profile</code> (or your equivalent to <tt>.profile</tt>)
# Verify this all worked by running <code>wcl386 -h</code>
# Verify this all worked by running <code>wcl386 -h</code> --><!--
 
===Installing the SDK===
With the toolchains installed, setting up the rest of the Byblos SDK is a relatively ''anodyne'' affair. In general, all utilities honour the value of <code>$BYBLOS</code> as provenance of the SDK root. If it is empty or undefined, the value defaults to <code>/opt/byblos</code>. In any case, the <code>$BYBLOS</code> root has the following hierarchy:
 
: <tt><u>$BYBLOS</u>/</tt> &ndash; SDK root
:: <tt><u>$BYBLOS</u>/conf/</tt> &ndash; configuration settings
:: <tt><u>$BYBLOS</u>/include/</tt> &ndash; header files (<tt>.h</tt>) and assembly headers (<tt>.inc</tt>)
:: <tt><u>$BYBLOS</u>/man/</tt> &ndash; manuals
:: <tt><u>$BYBLOS</u>/sbin/</tt> &ndash; script binaries (architecture independent)
:: <tt><u>$BYBLOS</u>/share/</tt> &ndash; shared resources and miscellanea
:: <tt><u>$BYBLOS</u>/slib/</tt> &ndash; script dependencies/libraries (architecture independent)
:: <tt><u>$BYBLOS</u>/system/</tt> &ndash; private folder for internal SDK business
:: <tt><u>$BYBLOS</u>/target/<u>$t</u>/</tt> &ndash; parent folder for target-specific sub-hierarchies (<tt><u>$t</u></tt> is the target ident)
::: <tt><u>$BYBLOS</u>/target/<u>$t</u>/bin/</tt> &ndash; runnable binaries
::: <tt><u>$BYBLOS</u>/target/<u>$t</u>/lib/</tt> &ndash; static libraries
::: <tt><u>$BYBLOS</u>/target/<u>$t</u>/share/</tt> &ndash; target-specific miscellanea (e.g. associated production materials, emulator settings, etc.)
 
Byblos 1 entirely avoids pre-compiling native programs, instead leaning on the externally-provided toolchains to run C code and Vala code in utilities as necessary. So, it lacks a host <code>bin/</code> folder or associated <code>lib/</code> folder, which are replaced by <code>sbin/</code> and <code>slib/</code> respectively. Hashbangs are used to achieve program invocation.
 
The SDK operates on the premise that the working development directory can be anywhere. SDK-specific helper scripts have provenance in <code>$BYBLOS</code> and those helper scripts should be written to correctly guess the necessary host toolchains and their locations or error out quickly on failure to find them. <!--


XXX: pending rewrite about Byblos 2
XXX: pending rewrite about Byblos 2
Line 950: Line 536:
* [[Quindle]], a graphical editor program for authoring code
* [[Quindle]], a graphical editor program for authoring code
* [[Cigarbochs]], an emulator for debugging and testing code
* [[Cigarbochs]], an emulator for debugging and testing code
** Simulates x86, ARM, 68000, 65(02/816) and any bespoke A* ISAs
* Various helper utilities for sanitising and analysing code
* Various helper utilities for sanitising and analysing code


Additionally, Byblos 2 integrates support for Vala using the default system compiler toolchain and libraries. This makes for an accessible and painless path to quickly writing GUI and CLI programs alike for use by developers to help author large, complex programs.
===Language classes===
The Byblos compiler suite has a rigidly-dictated list of "first-class programming languages", chosen holistically for their combination of ubiquity, expressive power and heritage. Currently, they are as follows:
* ANSI C
* [[C*]]
* FORTRAN, revision 1977 (F77)
* Verilog, revision 2005 (V05)


[[Category:Applications of mechanicalism]][[Category:Unix developments]]
[[Category:Applications of mechanicalism]][[Category:Unix developments]]

Latest revision as of 14:32, 11 December 2024

Byblos SDK
Created by Alexander Nicholi
Initial release unreleased
Written in ANSI C, Make, POSIX sh
OSes Darwin/XNU, GNU/Linux
ISAs Apple silicon, x86-64
Licence ASL 1.1

Byblos is a software development kit developed for Sirius DOS, A* and Unix-based servers, with distinction for MILOTIX and Linux, BSD and Darwin (pan-Unix) support. It is divided into two versions: Byblos 1, a provisional SDK that uses existing compiler toolchains and host infrastructure of Unix-like operating systems, and Byblos 2, the proper SDK that provides its own C compiler, assembler, and the first C* compiler.

Byblos 1

Byblos 1 is the provisional Byblos SDK, running on GNU/Linux with glibc, either on x86-64 or AArch64. These two platforms are the only supported hosts, and on them Byblos can target the following platforms:

  • GNU/Linux with glibc on x86-64
  • GNU/Linux with glibc on AArch64
  • GNU/Linux with glibc on ARMv7HF
  • GNU/Linux with musl on x86-64
  • GNU/Linux with musl on AArch64
  • GNU/Linux with musl on ARMv7HF
  • Microsoft Windows 95, 98 and Me on i386
  • Microsoft Windows NT 4.0+ on i386
  • Microsoft Windows NT 5.1+ on x64
  • Apple macOS 10.4+ on Intel 64
  • Apple macOS 11.0+ on AArch64

All GNU/Linux targets use GCC cross-compilers, while all Windows targets use a single MinGW-W64 cross-compiler and all Apple targets use two clang compilers to generate fat binaries with lipo. Even though Clang is inherently a cross-compiler, two versions of it must be provided since maximal compatibility necessitates using different versions of the proprietary Apple SDK for each microarchitecture: 10.4 provides the earliest x86-64 SDK while 11.0 provides the earliest AArch64 SDK.

Later, support may be added for the following platforms, pending integration of devkitARM and OpenWatcom 2:

  • Nintendo Game Boy Advance on ARMv4T
  • Microsoft Windows 3.1 on i286
  • MS-DOS 5.0+ on i286

All target platforms support console-type applications as well as graphical ones with OpenGL hardware acceleration. Supported languages include ANSI C, C++14, and GNU assembler. Platforms that use OpenWatcom 2 lose C++ support, and both OpenWatcom 2 and devkitARM dependent platforms lack OpenGL support.

Supported targets

i Target Full name ISA Host ASM C C++ bin Notes
agbhb GBA homebrew ARMv4T Scratch-building GBA ROMs.
agbsp GBA sourcepatch ARMv4T Source-patching existing GBA ROMs.
astar Anodyne A* unknown Too early to specify.
darwin macOS x86-64 v1 and ARMv8  
glinuxa64 GNU/Linux + glibc ARMv8.0 Assumes VFPv2 hard float support.
glinuxx64 GNU/Linux + glibc x86-64 v1  
mlinuxa64 GNU/Linux + musl ARMv8.0 Assumes VFPv2 hard float support.
mlinuxx64 GNU/Linux + musl x86-64 v1  
pcdos MS-DOS 5.0+ Intel i286  
win311 Windows 3.11 Intel i286  
win95 Windows 95, 98 & Me Intel i386  
winnt32 Windows NT 4.0 32-bit Intel i386  
winnt64 Windows NT 5.1 64-bit x86-64 v1  

Notes

  • binpacking is a highly portable method of compiling assets statically into binaries
  • For assembly, uncertainty exists about toolchain support on macOS
  • For binpacking, it may eventually work but needs further research

Programs list

i Utility
Hinterlib
Inbound
Outbound
Rebound
Earthbound
Forerunner
Precursor
Simbel
Oración
FCC
Quindle
Gauntlet
Senusret's
Sirius C*
NatPython

Installing the SDK

Byblos 1 can only be run on a musl based installation of GNU/Linux, either on the x86-64 or AArch64 microarchitectures. Use of a VM is recommended when this is not directly available on a machine.

The /opt/byblos root has the following hierarchy:

/opt/byblos/ – SDK root
/opt/byblos/conf/ – configuration settings
/opt/byblos/include/ – header files (.h) and assembly headers (.inc)
/opt/byblos/man/ – manuals
/opt/byblos/sbin/ – script binaries (architecture independent)
/opt/byblos/share/ – shared resources and miscellanea
/opt/byblos/slib/ – script dependencies/libraries (architecture independent)
/opt/byblos/system/ – private folder for internal SDK business
/opt/byblos/target/$t/ – parent folder for target-specific sub-hierarchies ($t is the target ident)
/opt/byblos/target/$t/bin/ – runnable binaries
/opt/byblos/target/$t/lib/ – static libraries
/opt/byblos/target/$t/share/ – target-specific miscellanea (e.g. associated production materials, emulator settings, etc.)
/opt/byblos/tc/$tc/ – toolchain sysroots

Byblos 1 entirely avoids pre-compiling native programs, instead leaning on the externally-provided toolchains to run C code and Vala code in utilities as necessary. So, it lacks a host bin/ folder or associated lib/ folder, which are replaced by sbin/ and slib/ respectively. Hashbangs are used to achieve program invocation.

Xion Megatrends offers an installation shell script that initialises the above directories, downloads the toolchains and downloads additional SDK files as necessary.

About the toolchains

Byblos 1 depends on specially compiled versions of GCC to compile code for the various targets it supports. In total, there are 9 compilers for each host, for a total of 18:

  • GCC aarch64-linux-musl
  • GCC arm-linux-musl
  • GCC x86_64-linux-musl
  • GCC aarch64-linux-gnu
  • GCC arm-linux-gnu
  • GCC x86_64-linux-gnu
  • Clang for macOS SDK 10.4
  • Clang for macOS SDK 11.0
  • MinGW-W64

Xion Megatrends offers pre-built binaries of all of these, compiled to run from /opt/byblos/tc/<ident>, where <ident> is the Byblos target platform identifier, $TP. An exception to this naming rule is for darwin, where instead darwinx64 is used for x86-64 code and the 10.4 SDK and darwina64 is used for AArch64 code and the 11.0 SDK. Another exception is for win95, winnt32 and winnt64, which all use a single MinGW install available at /opt/byblos/tc/mingw64.

Byblos 2

Byblos 2 is a purpose-built SDK that includes dedicated stand-alone tools for compiling code and assets for all supported targets. Initially it will run on the same hosts supported by Byblos 1, with wider support to coincide with the porting of Vala to liberate it from conventional host support structures. Its core is comprised of the following programs:

  • Oración, an assembler and desymboliser
    • Intel 8086, i286, i486, i686, x86-64 v1-v4, ARMv4T, ARMv5TE, ARMv6, ARMv7, ARMv8, SPARC64 V9, Motorola 68000, MOS 6502, MOS 65816, and Itanium/IA-64 are the supported architectures
  • FCC, an expressly non-optimising ANSI C compiler
    • Uses Oración as its backend
  • Sirius C*, a provisional C* compiler
    • Derived from FCC, also uses Oración as its backend
  • Inbound, a software build system
    • Derived from Make, uses a cut-down in-house derivative
  • Outbound, a software packaging system
  • NatPython, a scripting interpreter
    • Hard fork of Python 3.3
  • Simbel, a documentation authoring and generation toolset
  • Precursor, a hub-and-spoke version control system
  • Forerunner, a source code management system built on top of Precursor
  • Gauntlet, a public key cryptosystem for signing and verifying code
  • Quindle, a graphical editor program for authoring code
  • Cigarbochs, an emulator for debugging and testing code
  • Various helper utilities for sanitising and analysing code

Language classes

The Byblos compiler suite has a rigidly-dictated list of "first-class programming languages", chosen holistically for their combination of ubiquity, expressive power and heritage. Currently, they are as follows:

  • ANSI C
  • C*
  • FORTRAN, revision 1977 (F77)
  • Verilog, revision 2005 (V05)