If you need linked lists, maps, and basic I/O abstractions that work on bare metal (i.e. no operating system), then this library is for you.
I've found that for MetalC and a couple other things I'm doing, I'm reusing a lot of the same code. I decided to extract it into a separate library.
The following, and only the following parts of the C standard library are used. MetalData comes with some built-in fallbacks when compiled in unhosted ("freestanding" or "bare metal") mode. Unsupported functionality must be provided by client code; more on that in the docs.
| What | Header | Unhosted Fallbacks |
|---|---|---|
| bool | stdbool.h | * |
| free | stdlib.h | N |
| malloc | stdlib.h | N |
| memcmp | string.h | Y |
| memcpy | string.h | Y |
| memset | string.h | Y |
| realloc | stdlib.h | N |
| SIZE_MAX | stdint.h | * |
| size_t | stddef.h | * |
| strcmp | string.h | Y |
| uintmax_t | stdint.h | * |
| UINTMAX_MAX | stdint.h | * |
| uintptr_t | stdint.h | (Only if available) |
| UINTPTR_MAX | stdint.h | (Only if available) |
*The C standard requires these to be available in unhosted mode. If you're using a standards-compliant compiler, this won't be an issue.
# Set up the build system for your desired target platform
./configure [options]
# Build everything
make
# Install the library (may require sudo)
make installFor a list of options, run ./configure -h.
- Make (NMake will not work)
- C compiler implementing most of C99 and accepting at least a limited subset of GCC-like command-line arguments.
Legend:
- Y: Full support
- (blank): Untested or not implemented yet
- NS: Not supported for technical reasons
- m: Requires compiling with minimal flags (pass
-Ftoconfigure)
| Compiler | OS | Hosted | Unhosted | ||
|---|---|---|---|---|---|
| Compiles | Tests Pass | Compiles | Tests Pass | ||
| Clang | Cygwin | Y | Y | Y | Y |
| Linux | Y | Y | Y | Y | |
| MacOS | Y | Y | Y | Y | |
| GCC | Cygwin | Y | Y | Y | Y |
| Linux | Y | Y | Y | Y | |
| MacOS | Y | Y | Y | Y | |
| Intel | MacOS | ||||
| Linux | |||||
| MinGW | Cygwin | Y | Y | Y | Y |
| Linux | Y [1] | NS | Y | NS | |
| OpenWatcom | MacOS | ||||
| Linux | |||||
| SDCC | See below for the list of architectures this compiles for | ||||
| TCC | Linux | Y | Y | Y | Y |
| Visual Studio | Windows | ||||
The following architectures are tested. SDCC is the only toolchain that can be used for most of these. The microcontrollers require me to write a testbench using uCSim which is going to be time-consuming but (possibly) doable.
| Architecture | Compiles | Passes Tests |
|---|---|---|
| AMD64 (x86-64) | Y | Y |
| DS390 | Y | |
| DS400 | Y | |
| ez80-z80 | Y | |
| HC08 (Motorola 68HC08) | Y | |
| macOS ARM64 | Y | Y |
| MCS-51 | Y | |
| MOS 6502 | Y | |
| MOS 65C02 | Y | |
| Padauk PDK 13 | Y | |
| Padauk PDK 14 | Y | |
| Padauk PDK 15 | Y | |
| Rabbit 800 | Y | |
| Rabbit 2000 | Y | |
| Rabbit 2000A | NS | |
| Rabbit 3000A | Y | |
| S08 | Y | |
| SM83 | NS | |
| STM8 | Y | |
| TININative | Y [2] | |
| TLCS 90 | Y | |
| x86-32 | Y | Y |
| z180 | Y | |
| z80 | Y | |
| z80n | NS |
Here is a quick reference for needs you may encounter:
By default, everything is installed relative to /usr/share on *NIX systems,
including Cygwin. You can change where the files are installed during
configuration:
./configure --prefix=path/to/directoryThe directory will be created if it doesn't already exist. The structure of the directory follows the typical Unix convention, namely:
- Headers go in
PREFIX/include/metaldata - Library goes in
PREFIX/lib - PKG-CONFIG file goes in
PREFIX/lib/pkgconfig
This pattern is also followed on Cygwin for the sake of simplicity.
Optional tools:
- valgrind
- kcallgrind (Debian package)
- massif-visualizer (Debian package)
Mozilla 2.0 License. See LICENSE for the legal details.
This uses µunit for running tests.
| [1] | I used a cross-compiler here because my Windows partition kicked the bucket. |
| [2] | Triggers a bug in SDCC and crashes the compiler. |