Faur is my personal C framework for my hobby video games.
Features include software or accelerated 2D graphics, abstractions for inputs and sound, application state management, entity-component-system model, and utilities to help with data, files, math, memory, strings, time, and more.
Faur builds native on Linux and cross-compiles for Web, Windows, and some embedded devices I like, including the GP2X handheld and a few Arduino compatibles. The build system uses GNU Make 4.1 and Python 3.6 or later.
Install on Debian-based Linux
$ sudo apt install build-essential git python3 python3-pil
$ sudo apt install libsdl2-dev libsdl2-mixer-dev libpng-dev
$ git clone https://github.com/alxm/faur.git
Create New Project
$ faur/bin/faur-new hello
$ cd hello/build/make
$ make run FAUR_PATH=../../../faur
Move the square with the arrow keys or with a game controller.
hello/src/main.c
#include <faur.h>
void f_main(void)
{
static struct {
int x, y;
FButton *up, *down, *left, *right;
} context;
F_STATE_INIT
{
context.x = f_screen_sizeGetWidth() / 2;
context.y = f_screen_sizeGetHeight() / 2;
context.up = f_button_new();
f_button_bindKey(context.up, F_KEY_UP);
f_button_bindButton(context.up, NULL, F_BUTTON_UP);
context.down = f_button_new();
f_button_bindKey(context.down, F_KEY_DOWN);
f_button_bindButton(context.down, NULL, F_BUTTON_DOWN);
context.left = f_button_new();
f_button_bindKey(context.left, F_KEY_LEFT);
f_button_bindButton(context.left, NULL, F_BUTTON_LEFT);
context.right = f_button_new();
f_button_bindKey(context.right, F_KEY_RIGHT);
f_button_bindButton(context.right, NULL, F_BUTTON_RIGHT);
}
F_STATE_TICK
{
if(f_button_pressGet(context.up)) context.y--;
if(f_button_pressGet(context.down)) context.y++;
if(f_button_pressGet(context.left)) context.x--;
if(f_button_pressGet(context.right)) context.x++;
}
F_STATE_DRAW
{
f_color_colorSetHex(0xaaff88);
f_draw_fill();
f_color_colorSetHex(0xffaa44);
f_draw_rectangle(context.x - 40, context.y - 40, 80, 80);
}
F_STATE_FREE
{
f_button_free(context.up);
f_button_free(context.down);
f_button_free(context.left);
f_button_free(context.right);
}
}
hello/build/make/Makefile
F_CONFIG_APP_AUTHOR := <author>
F_CONFIG_APP_NAME := hello
include $(FAUR_PATH)/make/default.mk
Cross-Compile for Other Platforms
I started Faur by collecting my GP2X games' shared code into a library. Over time I added support for more platforms:
Target | Host | Toolchain | Dependencies | More Info |
---|---|---|---|---|
Desktop | ||||
Linux (SDL 2) | Linux | OS build tools | Debian: libsdl2-dev libsdl2-mixer-dev libpng-dev valgrind Fedora: SDL2-devel SDL2_mixer-devel libpng-devel libubsan valgrind |
|
Linux (SDL 1.2) | Linux | OS build tools | Debian: libsdl1.2-dev libsdl-mixer1.2-dev libpng-dev valgrind Fedora: sdl12-compat-devel SDL_mixer-devel libpng-devel libubsan valgrind |
|
FreeBSD | FreeBSD | OS build tools | gmake devel/sdl20 audio/sdl2_mixer |
Building on FreeBSD |
Windows | Linux | MinGW-w64 | Debian: mingw-w64 libz-mingw-w64-dev and local builds of SDL2 SDL2_mixer libpng Fedora: mingw64-gcc mingw64-gcc-c++ mingw64-SDL2 mingw64-SDL2_mixer mingw64-libpng mingw64-zlib |
Cross-compiling with MinGW |
Web (Wasm) | Linux | Emscripten | Emscripten Notes | |
Embedded Linux | ||||
GP2X, GP2X Wiz | Linux | Open2x SDK | Debian: ia32-libs |
Open2x Project |
Caanoo | Linux | GPH SDK | Debian: ia32-libs |
Caanoo SDK for Linux |
Open Pandora | Linux | Pandora SDK | Debian: ia32-libs libxml2-utils |
Open Pandora Forums |
Arduino | ||||
Gamebuino META | Linux | Arduino 1.8.13, Arduino SAMD Boards 1.8.11, Gamebuino META Boards 1.2.2 | Arduino: Gamebuino META 1.3 Debian: ffmpeg Fedora: ffmpeg-free |
Gamebuino META Makefile |
ODROID-GO | Linux | Arduino 1.8.13, Arduino-ESP32 1.0.6 | Arduino: ODROID-GO 1.0.0 Debian: python3-serial python-is-python3 Fedora: python3-pyserial |
ODROID Wiki |
The default toolchain paths are in make/global/sdk.mk
, and they can be overridden in a project Makefile or globally in ~/.config/faur/sdk.mk
. To build for different targets, change include $(FAUR_PATH)/make/default.mk
to use other files from $(FAUR_PATH)/make
.
License
Copyright 2010-2022 Alex Margarit (alex@alxm.org)
- Source code licensed under GNU GPL 3.0 (file
LICENSE
) - Other content licensed under CC BY-NC-ND 4.0 (file
media/CC-BY-NC-ND
)
Faur is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The project is named after the old Romanian word faur, sometimes used in fables to mean wizard blacksmith. ⚒️✨
Contributing
This is my personal framework and ideas playground, a solo project. You are welcome to check it out and use it under the terms of the license, but I do not take pull requests to this repo.