Das eigene Modul bauen und integrieren

Den Code eines Moduls zu schreiben sagt nichts darüber aus, wie es gebaut wird — und zwei sehr unterschiedliche Ansätze sind gleichermaßen legitim, je nachdem, was man damit vorhat.

Für sich allein arbeiten

Nichts verpflichtet dazu, über das Repository ost/ostmodules zu gehen: ein Modul kann in seinem eigenen Repository leben, mit seiner eigenen CMakeLists.txt, inspiriert von der aus ost/ostmodules, statt sie sklavisch zu kopieren. Zwei Informationen reichen aus, um eine reale OST-Installation wiederzufinden:

find_path(OST_INCLUDE_DIR ost/indimodule.h)
find_library(OST_LIBRARY_BASE NAMES libostbasemodule.so PATHS /usr/lib /usr/lib/x86_64-linux-gnu)
find_library(OST_LIBRARY_INDI NAMES libostindimodule.so PATHS /usr/lib /usr/lib/x86_64-linux-gnu)

ost/ostmodules macht genau das in cmake_modules/FindOSTSERVER.cmake — statt es zu erraten, ist es am einfachsten, direkt von dieser Datei auszugehen und sie zu lesen.

Für ein rein auf Basemodule basierendes Modul ist nur OST_LIBRARY_BASE nötig; OST_LIBRARY_INDI wird nur für ein IndiModule benötigt.

Zum gemeinsamen Repository beitragen

Damit das Modul sichtbar ist und zusammen mit den anderen gepflegt wird, tritt es ost/ostmodules bei:

  1. Das Repository klonen, einen Branch erstellen.
  2. Den eigenen Block in CMakeLists.txt hinzufügen, nach dem Vorbild eines einfachen bestehenden Moduls (zum Beispiel osthello):
add_library(ostmonmodule SHARED
    ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/monmodule/monmodule.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/monmodule/monmodule.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/modules/monmodule/monmodule.qrc
)
target_link_libraries(ostmonmodule PRIVATE
    ${OST_LIBRARY_BASE}        # ou ${OST_LIBRARIES} (base + indi) pour un IndiModule
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::Concurrent
    Qt${QT_VERSION_MAJOR}::Widgets
    Threads::Threads
    z
)
target_compile_definitions(ostmonmodule PRIVATE MONMODULE_MODULE)
  1. ostmonmodule zur Liste install(TARGETS ...) hinzufügen, etwas weiter unten in derselben Datei.
  2. Eine Merge Request öffnen.
Keine gemeinsame Funktion/Makro zwischen den Blöcken

Jedes Modul wiederholt diesen Block von Hand — es gibt heute keine CMake-Funktion, die ihn faktorisiert. Den Block eines bereits ähnlichen Moduls zu kopieren (ein IndiModule für ein IndiModule, zum Beispiel osthelloindi) vermeidet Versehen sicherer, als ihn von Null an neu zu schreiben.