Files
MontaukOS/template

MontaukOS App Template

Self-contained development environment for building standalone MontaukOS GUI apps. Copy this entire directory anywhere and start building.

Quick Start

cp -r template/ ~/dev/myapp/
cd ~/dev/myapp/
# Edit APP_NAME and SRCS in Makefile
make
make install   # copy ELF to MontaukOS ramdisk

Build Commands

make                           # GUI-only app
make USE_TLS=1                 # With HTTPS/TLS (libtls + libbearssl)
make USE_JPEG=1                # With JPEG decoding (libjpeg)
make USE_CRT=1                 # Use the shared CRT and write main(argc, argv)
make USE_TLS=1 USE_JPEG=1     # Both
make clean                     # Remove build artifacts
make install                   # Copy ELF to MontaukOS ramdisk

If the MontaukOS tree is not at ~/dev/MontaukOS/, pass the path to the cross-compiler:

make MONTAUKOS=/path/to/MontaukOS

Structure

myapp/
├── Makefile                     Edit APP_NAME and SRCS here
├── link.ld                      Linker script (load at 0x400000)
├── src/
│   ├── main.cpp                 Your app (template with window, rendering, input)
│   ├── stb_truetype_impl.cpp    TrueType font support (keep this)
│   └── cxxrt.cpp                C++ new/delete runtime (keep this)
├── sysroot/
│   ├── include/
│   │   ├── montauk/             syscall.h, heap.h, thread.h, string.h, config.h, toml.h, user.h
│   │   ├── gui/                 gui.hpp, canvas.hpp, truetype.hpp, widgets.hpp, mtk.hpp, dialogs.hpp, ...
│   │   ├── http/                http.hpp (HTTP GET/POST/etc. wrapper)
│   │   ├── tls/                 tls.hpp (HTTPS/TLS, for USE_TLS=1)
│   │   ├── Api/                 Syscall.hpp (low-level syscall numbers)
│   │   ├── libc/                stdio.h, stdlib.h, string.h, ...
│   │   ├── libloader/           libloader.h (shared library loading, used by gui/dialogs.hpp)
│   │   ├── bearssl*.h           BearSSL headers (for USE_TLS=1)
│   │   └── (freestanding C/C++ standard headers)
│   └── lib/
│       ├── crt1.o             Startup shim for main(argc, argv) ports
│       ├── crti.o             CRT init prologue placeholder
│       ├── crtn.o             CRT init epilogue placeholder
│       ├── liblibc.a            C library (always linked)
│       ├── libtls.a             TLS helper library
│       ├── libbearssl.a         BearSSL crypto
│       └── libjpeg.a            JPEG decoding (stb_image)
└── docs/
    ├── gui-apps.md              GUI programming guide
    └── syscalls.md              Syscall and API reference

Key Points

  • Default entry point: extern "C" void _start()
  • Porting mode: make USE_CRT=1 lets you use int main(int argc, char** argv) instead
  • Memory: montauk::malloc() / montauk::mfree() (no standard libc)
  • Window: win_create() / win_poll() / win_present() / win_destroy()
  • Fonts: TrueTypeFont::init("0:/fonts/Roboto-Medium.ttf")
  • HTTP: #include <http/http.hpp> with USE_TLS=1 (see docs/)
  • No exceptions, no RTTI, 32 KiB user stack

USE_CRT=1 is meant for plain C ports and other code that already expects main(argc, argv). The current CRT does not run global constructors or destructors yet, so keep using _start() for the default C++ template flow.

Keeping the SDK Current

The sysroot is a snapshot of the MontaukOS tree (headers from programs/include plus the freestanding toolchain headers, libraries from programs/lib). To refresh it after kernel or library changes, run from the MontaukOS project root:

make programs && ./scripts/sync_template.sh