D'une certaine manière, je suis totalement confus par le fonctionnement de CMake. Chaque fois que je pense que je me rapproche pour comprendre comment CMake est censé être écrit, cela disparaît dans l'exemple suivant que je lis. Tout ce que je veux savoir, c'est comment structurer mon projet pour que mon CMake nécessite le moins de maintenance à l'avenir. Par exemple, je ne veux pas mettre à jour mon CMakeList.txt lorsque j'ajoute un nouveau dossier dans mon arborescence src, qui fonctionne exactement comme tous les autres dossiers src.
C'est ainsi que j'imagine la structure de mon projet, mais s'il vous plaît, ce n'est qu'un exemple. Si la méthode recommandée diffère, veuillez me le dire et me dire comment le faire.
myProject
src/
module1/
module1.h
module1.cpp
module2/
[...]
main.cpp
test/
test1.cpp
resources/
file.png
bin
[execute cmake ..]
En passant, il est important que mon programme sache où se trouvent les ressources. J'aimerais connaître la manière recommandée de gérer les ressources. Je ne souhaite pas accéder à mes ressources avec "../resources/file.png"
la source
For example I don't want to update my CMakeList.txt when I am adding a new folder in my src tree
pouvez-vous donner un exemple d'IDE qui collecte automatiquement les sources?Réponses:
après quelques recherches, j'ai maintenant ma propre version de l'exemple de cmake le plus simple mais complet. Le voici, et il essaie de couvrir la plupart des bases, y compris les ressources et l'emballage.
la gestion des ressources est une chose non standard. Par défaut, cmake veut les mettre dans / usr / share /, / usr / local / share / et quelque chose d'équivalent sous Windows. Je voulais avoir un simple zip / tar.gz que vous pouvez extraire n'importe où et exécuter. Par conséquent, les ressources sont chargées par rapport à l'exécutable.
la règle de base pour comprendre les commandes cmake est la syntaxe suivante:
<function-name>(<arg1> [<arg2> ...])
sans virgule ni point-virgule. Chaque argument est une chaîne.foobar(3.0)
etfoobar("3.0")
c'est pareil. vous pouvez définir des listes / variables avecset(args arg1 arg2)
. Avec cet ensemble de variablesfoobar(${args})
etfoobar(arg1 arg2)
sont effectivement les mêmes. Une variable inexistante équivaut à une liste vide. Une liste est en interne juste une chaîne avec des points-virgules pour séparer les éléments. Par conséquent, une liste avec un seul élément est par définition juste cet élément, aucune boxe n'a lieu. Les variables sont globales. Les fonctions intégrées offrent une forme d' arguments nommés du fait qu'elles attendent des identifiants commePUBLIC
ouDESTINATION
dans leur liste d'arguments, pour regrouper les arguments. Mais ce n'est pas une fonctionnalité de langage, ces identifiants ne sont également que des chaînes et analysés par l'implémentation de la fonction.vous pouvez tout cloner depuis github
la source
set(sources src/main.cpp)
.CMakeLists.txt
, alors un make normal (ou ninja) déclenchera la réinvocation de cmake, donc vous ne pouvez pas l'oublier. C'est aussi un peu plus convivial pour l'équipe, car les membres de l'équipe ne peuvent pas non plus oublier d'exécuter cmake. Mais je pense qu'un makefile ne devrait pas avoir besoin d'être touché, juste parce que quelqu'un a ajouté un fichier. Écrivez-le une fois, et personne ne devrait plus avoir à y penser.L'exemple le plus basique mais complet se trouve dans le didacticiel CMake :
Pour votre exemple de projet, vous pouvez avoir:
Pour votre question supplémentaire, une façon de procéder est à nouveau dans le didacticiel: créez un fichier d'en-tête configurable que vous incluez dans votre code. Pour cela, créez un fichier
configuration.h.in
avec le contenu suivant:Puis dans votre
CMakeLists.txt
ajout:Enfin, là où vous avez besoin du chemin dans votre code, vous pouvez faire:
la source
string resourcePath = string(RESOURCE_PATH) + "file.png"
IMHO c'est une mauvaise idée de coder en dur le chemin absolu vers le répertoire source. Et si vous devez installer votre projet?Ici, j'écris un exemple de fichiers CMakeLists.txt le plus simple mais complet.
Code source
Après cela, j'ai offert un document pour les détails.
Si vous avez des questions, vous pouvez me contacter et j'aimerais vous l'expliquer.
la source