86 lines
3.7 KiB
Markdown
86 lines
3.7 KiB
Markdown
# MontaukOS App Template
|
|
|
|
Self-contained development environment for building standalone MontaukOS GUI apps. Copy this entire directory anywhere and start building.
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
make programs && ./scripts/sync_template.sh
|
|
```
|