Hallo,Variables globales dans CMake pour le suivi des dépendances
J'utilise CMake comme système de construction dans un de mes projets, ce qui est assez complexe. Le projet comprend plusieurs bibliothèques et plusieurs applications. Mon but est, de faire le possible suivant:
- Les bibliothèques peuvent être construites sur demande par l'utilisateur (réalisé par la variable CMake mis en cache)
- Les applications sont construites sur demande par l'utilisateur (voir ci-dessus), mais une application peut sélectionner les bibliothèques nécessaires et les construire sans que l'utilisateur en les sélectionnant
- Cela ne devrait pas changer la sélection de l'utilisateur mis en cache sur lequel les bibliothèques de construire (pour désactiver la construction des bibliothèques automatiquement si le bâtiment d'application est désactivée)
Mon système de construction layo ut est la suivante: J'ai un répertoire parent qui contient un CMakeLists.txt qui ajoute les bibliothèques et les applications en tant que sous-répertoire. Chaque bibliothèque et application possède son propre CmakeLists.txt qui définit les options de configuration définissables par l'utilisateur à stocker dans le cache, les cibles à construire et les autres bibliothèques du projet dont il dépend. Les applications ne sont pas nécessairement situées dans le sous-répertoire suivant du répertoire parent, mais peuvent également avoir des niveaux inférieurs, de sorte que je ne peux pas utiliser PARENT_SCOPE, car le parent ne doit pas être le parent le plus haut, mais les dépendances doivent être connues en haut. J'ai essayé de paramétrer les propriétés GLOBAL comme PROJECT_BUILD_SOMELIBRARY sur on et j'ai essayé de les récupérer dans CMakeLists.txt de SOMELIBRARY pour décider de construire ou non, mais les propriétés ne sont pas passées à la bibliothèque, donc elles ne sont jamais construites si c'était le cas, car une autre bibliothèque ou application indiquait que cela dépendait de cette bibliothèque. L'utilisation d'un LISTE contenant le nom de chaque application ou cible de bibliothèque en fonction d'une bibliothèque et la mise en cache de celle-ci en interne ne fonctionnait pas non plus. Pour résumer ces nombreux mots, je cherche un moyen d'influencer un CMakeLists dans un sous-répertoire chargé de construire une bibliothèque par un CMakeLists dans un autre sous-répertoire (qui n'est pas nécessairement le même niveau de sous-répertoire que l'autre subdir) pour construire cette bibliothèque, même si l'utilisateur ne l'a pas explicitement spécifié via l'option de configuration sur l'invocation cmake.
Est-ce que quelqu'un sait comment cela pourrait être réalisé ou est-ce impossible avec CMake? Y a-t-il des suggestions pour d'autres approches à ce problème qui, cependant, incluent l'utilisation de CMake? Connaissez-vous un autre système de construction qui pourrait gérer ces exigences confortablement?
Un grand merci, Crispinus
Merci pour votre réponse très élaborée. Autant que je vois, votre solution se dirige dans une direction différente, car je ne peux pas laisser de côté le répertoire add_subdirectory, parce que le CMakeLists.txt dans chaque sous-répertoire parts contient l'option de cache qui fera les cibles de cette partie. Chaque sous-répertoire doit être ajouté, quelles que soient les pièces à construire. – crispinus