web-dev-qa-db-fra.com

Comment lire une variable CMake dans le code source C ++

Je voudrais stocker le numéro de version de ma bibliothèque en un seul endroit. J'ai donc défini une telle variable dans le fichier CMake:

    SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface")

Avec cette définition, je peux générer un fichier version.rc selon la définition de Microsoft, que je compile dans la bibliothèque et qui s'affiche ensuite correctement dans la fenêtre des propriétés de mon fichier dll.

Maintenant, j'aimerais également utiliser cette variable CMake dans mon code source c ++, mais en fait je ne parviens pas à une solution de travail. J'ai essayé différentes choses comme ça:

    #ifndef VERSION_LIBINTERFACE
    #  define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@
    #endif

ou ca:

    unsigned int getLibInterfaceVersion()
    {
        return @LIBINTERFACE_VERSION@;
    }

Mais le compilateur n'acceptera rien. Étant donné que mes recherches dans la documentation CMake n'ont donné aucun résultat, j'espère que quelqu'un pourra me donner les conseils essentiels.

Merci d'avance.

38
Snowfox

La façon la plus simple de le faire est de passer la LIBINTERFACE_VERSION en tant que définition avec add_definition :

add_definitions( -DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION} )

Cependant, vous pouvez également créer un "modèle de fichier d'en-tête" et utiliser configure_file . De cette façon, CMake remplacera votre @ LIBINTERFACE_VERSION @. C'est aussi un peu plus extensible car vous pouvez facilement ajouter des définitions ou des variables supplémentaires ici ...

Par exemple. créer un fichier "version_config.h.in", ressemblant à ceci:

#ifndef VERSION_CONFIG_H
#define VERSION_CONFIG_H

// define your version_libinterface
#define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@

// alternatively you could add your global method getLibInterfaceVersion here
unsigned int getLibInterfaceVersion()
{
    return @LIBINTERFACE_VERSION@;
}

#endif // VERSION_CONFIG_H

Ajoutez ensuite une ligne configure_file à votre cmakelists.txt:

configure_file( version_config.h.in ${CMAKE_BINARY_DIR}/generated/version_config.h )
include_directories( ${CMAKE_BINARY_DIR}/generated/ ) # Make sure it can be included...

Et bien sûr, assurez-vous que la version_config.h correcte est incluse dans vos fichiers source.

59
André