Builder et intégrer son module

Écrire le code d’un module ne dit rien de comment il est buildé — et deux approches, très différentes, sont également légitimes selon ce qu’on compte en faire.

Travailler dans son coin

Rien n’oblige à passer par le dépôt ost/ostmodules : un module peut vivre dans son propre dépôt, avec son propre CMakeLists.txt, en s’inspirant de celui d’ost/ostmodules plutôt qu’en le copiant servilement. Deux informations suffisent à retrouver une installation OST réelle :

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 fait exactement ça dans cmake_modules/FindOSTSERVER.cmake — en repartant de ce fichier plutôt que de le deviner, le plus simple est encore de le lire directement.

Pour un module purement Basemodule, seul OST_LIBRARY_BASE est nécessaire ; OST_LIBRARY_INDI ne l’est que pour un IndiModule.

Contribuer au dépôt partagé

Pour que le module soit visible et maintenu avec les autres, il rejoint ost/ostmodules :

  1. Cloner le dépôt, créer une branche.
  2. Ajouter son propre bloc dans CMakeLists.txt, sur le modèle d’un module existant simple (osthello par exemple) :
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. Ajouter ostmonmodule à la liste install(TARGETS ...), un peu plus bas dans le même fichier.
  2. Ouvrir une merge request.
Pas de fonction/macro partagée entre les blocs

Chaque module répète ce bloc à la main — il n’y a aujourd’hui aucune fonction CMake qui le factorise. Copier le bloc d’un module déjà proche (un IndiModule pour un IndiModule, par exemple osthelloindi) évite les oublis plus sûrement que le réécrire de zéro.