pandemonium_engine_minimal/platform/frt/doc/Porting.md
2023-12-14 21:54:22 +01:00

2.9 KiB

Porting

FRT is a modular system, and FRT modules can be developed and tested mostly in isolation, without compiling them as part of Godot. The idea is that developing and testing a module can be done on a real board with a very quick test cycle. Once the module is tested, it can be compiled as part of Godot.

As an example, compiling and linking every FRT module from scratch takes less than 5 seconds on a Pi 2. Relinking them takes less than 1 second. As another example, compiling and linking the video_fbdev module on a A10-based board takes less than 3 seconds.

Modules don't need to be generic. For example, you could access a custom device via GPIO and make a custom module implementing the frt::Keyboard interface. You can then use it instead of one of the standard keyboard modules.

Compiling and Testing a Module

To get familiar with the process, here is how to compile and test the mouse_x11 module on a Linux debian desktop. Either clone the repository or uncompress the FRT source tarball:

$ git clone https://github.com/efornara/frt
$ cd frt

The X11 FRT modules can dynamically load the libX11.so library. The loading code is not included in the repository and it is generated by a python script.

If you have python available, you can generate the loading code like this:

$ cd dl
$ ./procdl.py x11.dl

You will then have to compile and link the generated x11.gen.cpp file.

If you don't have python available, you can use a shell script that generates a mock x11.gen.h file instead:

$ ./minidl.py x11.dl

In this case, there is no 'x11.gen.cpp` file to compile and link.

In the porting directory, there is a sample Makefile. It has been written so that there shouldn't be a need to change it. Instead, changes can be made to the Local.mk file. If you are using git, you don't need to commit the file to the repository and you can just soft-link the real one to it:

$ cd ../porting
$ make local
git update-index --assume-unchanged Local.mk
$ touch Test.mk
$ ln -sf Test.mk Local.mk

Here is an example Test.mk for the python-generated dynamic loading code.

OBJS += test_mouse.o mouse_x11.o x11.gen.o
LIBS += -ldl

And here is an example Test.mk for the mock dynamic loading header:

OBJS += test_mouse.o mouse_x11.o
LIBS += -lX11

You can then compile and test the module like this:

$ make run

Tips

  • If you have a powerful board, consider starting the Godot compilation in background, making sure to choose compilation options carefully as changing them later can trigger a full recompile. Also, make sure that ALSA and udev are enabled (if you need them).

  • If you don't have a powerful board, consider cross compiling.

  • If you need to add preprocessor definitions or special include directories to the compiler command line, add them in the cloned frt_env environment defined in SCsub. This way, they will only be used when compiling the files in platform/frt and changing them will not trigger a full recompile.