Projet

Général

Profil

Partager des variables avec différents pri

Préambule

Cette page résulte d'un problème que j'ai rencontré lors de la tentative de mettre en commun du code source entre deux projets : Abuledu-Minitexte et Abuledu-Microtexte.
Ces projets partagent le même code à quelques exceptions près. Nous avons donc décider de fusionner les deux projets pour améliorer la maintenabilité et la répercussion des diverses améliorations entre les deux projets.
Cependant, même si certaines différences entre les projets se réglaient à la compilation, d'autres devaient être gérés avant (i.e. au qmake).
En effet, les qrc (ceux des librairies AbulEduSplashScreenV1 et AbulEduAproposV1 sont différents et uniques à chaque projet) doivent être connus du Makefile à cette étape là, et je n'ai pas réussi à utiliser des DEFINES de manière satisfaisante... Ensuite, d'une manière historique, un système de personnalisation du qrc est implanté et permet de définir dans le dossier data du projet. Mais ce système ne permet qu'une seule personnalisation.
Il faut aussi ne pas casser ce système qui fonctionne parfaitement sur les autres projets.

Mise en place (définition du chemin qrc de la librairie AbuleduSplashScreenV1)

Je devais donc définir différents chemins de qrc pour la librairie AbuleduSplashScreenV1.
Ces différents chemins doivent être "rangés" dans des variables à l'étape du qmake, et partagés instantanément avec les différentes librairies impactées afin d'être prise en compte à la compilation.

J'ai donc ajouter un fichier config.pri que j'ai inclus dans le .pro général du projet.

  • abuledu-minitete.pro
    TEMPLATE = subdirs
    SUBDIRS += src
    include(config.pri)
    

Le fichier config.pri peut donc contenir différentes variables. que nous allons partager avec les librairies adéquates.

  • config.pri
    PROJECT_ROOT_DIRECTORY = $$PWD
    
    microtexte {
        message(CONFIGURATION MICROTEXTE)
        ABULEDUSPLACHSCREENV1_QRC = "$${PWD}/src/microtexte.data/abuledusplashscreenv1/abuledusplashscreenv1.qrc" 
    }
    else {
    message(CONFIGURATION MINITEXTE)
        ABULEDUSPLACHSCREENV1_QRC = "$${PWD}/src/minitexte.data/abuledusplashscreenv1/abuledusplashscreenv1.qrc" 
    }
    

Dans ce fichier, j'ai défini deux variables : PROJECT_ROOT_DIRECTORY et ABULEDUSPLACHSCREENV1_QRC.

Pour retrouver ces variables dans le fichier abuledusplashscreenv1.pri, il me suffit d'inclure ce fichier.

  • abuledusplashscreenv1.pri
    HEADERS += $$PWD/abuledusplashscreenv1.h
    SOURCES += $$PWD/abuledusplashscreenv1.cpp
    
    INCLUDEPATH += $$PWD
    DEPENDPATH  += $$PWD
    
    include(../../../config.pri)
    message(SPLACH => $$ABULEDUSPLACHSCREENV1_QRC)
    

Et voilà, ma variable est définie et partagée =) !!
On peut donc l'utiliser !
Comme c'est un chemin vers un fichier qui va faire échouer la compilation s'il n'existe pas, un peu de contrôle s'impose.

  • abuledusplashscreenv1.pri
    HEADERS += $$PWD/abuledusplashscreenv1.h
    SOURCES += $$PWD/abuledusplashscreenv1.cpp
    
    INCLUDEPATH += $$PWD
    DEPENDPATH  += $$PWD
    
    include(../../../config.pri)
    message(SPLACH => $$ABULEDUSPLACHSCREENV1_QRC)
    
    exists($${ABULEDUSPLACHSCREENV1_QRC}){
        message(ABULEDUSPLACHSCREENV1_QRC > Utilisation QRC defini dans le fichier config : [$${ABULEDUSPLACHSCREENV1_QRC}])
        RESOURCES += $${ABULEDUSPLACHSCREENV1_QRC}
    }
    else {
        # on inclut le fichier ressources du developpeur de l'application en priorite
        # mais seulement s'il existe. S'il n'existe pas on fallback sur le fichier
        # de ressources propose par la lib
        !exists($$PWD/../../data/abuledusplashscreenv1/abuledusplashscreenv1.qrc) {
          RESOURCES += $$PWD/abuledusplashscreenv1.qrc
        }
        exists($$PWD/../../data/abuledusplashscreenv1/abuledusplashscreenv1.qrc) {
          RESOURCES += $$PWD/../../data/abuledusplashscreenv1/abuledusplashscreenv1.qrc
        }
    }
    

La méthode exists(fichier) permet d'inclure le fichier seulement s'il existe.
Dans ce cas là, un petit message est affiché dans la console et le fichier est pris en compte pour la compilation.
Sinon, on reste sur la personnalisation normale, avec un qrc dans la librairie, et un autre pris en compte à la volée s'il respecte une certaine arborescence.

Redmine Appliance - Powered by TurnKey Linux