web-dev-qa-db-fra.com

Une gestion des dépendances de type Maven pour C++?

Disons que j'ai un projet C++ divisé en plusieurs sous-projets. Le sous-projet produit tous une DLL et différentes équipes de développeurs travaillent sur chacun des sous-projets. Maintenant, si je veux construire le projet principal, y a-t-il un moyen d'éviter de construire tous les sous-projets par moi-même?

En bref, je cherche quelque chose qui gère la dépendance (c'est-à-dire pour les fichiers binaires et les en-têtes) de la même manière que Maven pour Java.

En fait, j’ai essayé d’utiliser Maven pour cela, mais c’est plutôt fastidieux, car je dois créer les paquetages manuellement et assez souvent, Maven manque de récupérer les modifications les plus récentes. De plus, exécuter la compilation est un peu un bidouillage, car je dois appeler NAnt depuis Maven (j'utilise la fonctionnalité de NAnt pour construire directement des solutions Visual Studio).

Des astuces et des idées sur la façon de procéder?

77
weberste

Réponse initiale: Je suggérerais d'utiliser CMake. C'est un générateur de fichiers multi-plateforme (génère également des projets Visual Studio ou Eclipse CDT).

http://www.cmake.org/

J'ai vraiment fait une bonne expérience avec ça. Ce que j’ai aimé de plus, c’est la possibilité de produire une structure de projet générique. Ainsi, vous pouvez généralement inclure des sous-projets dans la recherche de tests unitaires, etc. sans changer le script à chaque fois.

Ils ont aussi beaucoup de modules sur la façon de trouver des bibliothèques de build pré-installées, nécessaires au projet (comme Boost, QT, etc.)


Update: Entre-temps, quelques efforts ont été déployés pour introduire la gestion des paquets pour C++. Quelques projets intéressants à regarder:

  • conan.io s’intègre aux principaux outils de construction:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm basé sur CMake
  • Buckaroo

Note comme l'a souligné @RAM dans les commentaires, cpm n'est plus maintenu activement.

33
ovanes

Pour la gestion des dépendances, il existe un nouveau projet (c'est une start-up) qui implémente ce type d'outil: https://www.biicode.com/ (gestionnaire de dépendance C++). Vous pouvez ajouter vos dépendances et cela devrait fonctionner.

Actuellement, le nom du projet est conan.io , ils ont été acquis par JFrog .

UPDATE: Le projet est mort ... Malheureusement, il semble que la startup n'ait pas assez de clients payants, mais le serveur semble fonctionner correctement ...

UPDATE2: Il semble qu'il existe un projet de remplacement: conan.io (merci @mucaho)

15
carlos.baez

Je recommande les systèmes de construction de haut niveau suivants:

8
carlosvin

Si vous ne voulez que la gestion des dépendances, essayez Ivy , il s’intègre parfaitement à Ant (et je suppose que NAnt peut faire de même en fonction de ce blog , qui est lié au site Ivy).

Il existe également Byldan , une version .Net de Maven. Je ne sais pas si cela fonctionnera pour vous.

5
Rich Seller

Récemment publié: biicode Outil multi-plateforme et service d'hébergement pour développeurs

Modifier:

Biicode est obsolète

Alternative: Conan.io

3
Martijn Mellens

Make et GCC sont un excellent combo pour une très bonne vérification de dépendance.

GCC peut générer automatiquement des fichiers de dépendance «make» (commutateur de ligne de commande -MD), afin de pouvoir reconstruire tous les fichiers source dépendant d'un en-tête donné, par exemple.

J'ai quelques règles simples que je coupe-n-coller dans mes makefiles:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

Maintenant, si vos fichiers objet sont déclarés dans, disons une liste OBJ_C et une liste OBJ_CPP:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Make peut bien sûr suivre les dépendances avec d’autres projets et autres, par exemple. reconstruire une bibliothèque partagée si nécessaire, aussi.

Par exemple, si vos autres équipes placent toujours leurs dernières DLL sur un dossier partagé:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib
3
Will

Je recommande conan , que j'utilisais de nos jours . Il est très puissant de gérer toutes les bibliothèques dépendantes et les fichiers binaires de votre projet.

2
Ben Chen

Vous pouvez créer un package NuGet pour les bibliothèques utilisées et utiliser NuGet pour la gestion des dépendances.

Voir aussi, NuGet pour C++

1
KindDragon

Il existe un certain nombre d’outils situés au-dessus de SCons, fournissant des fonctionnalités de niveau supérieur similaires à celles d’Autotools qui essaient de simplifier la vie des développeurs (par exemple, WAF, SNOCS). Malheureusement, SCons a l'inconvénient majeur: un temps de compilation plus long pour les grands projets.

Je peux recommander d'essayer SNOCS (qui est un SCons inversé) pour ceux d'entre vous qui recherchent une gestion facile des dépendances et qui choisissent les options de compilation dans la commande unique (compilateur, x86/x64, Debug/Release, statique/bibliothèques partagées, test/installer des cibles, etc.). 

SNOCS essaie également de résoudre le problème de la longue durée de compilation en stockant la sortie de la configuration du projet dans des fichiers séparés, ce qui permet aux générations suivantes de passer complètement à la phase de configuration et de passer directement à la phase de construction (la dernière fonctionnalité est en construction).

La configuration de CMake devient fastidieuse dans les solutions plus vastes, de sorte que la maintenance du système de génération prend une fraction importante du temps nécessaire au développeur. Heureusement, comme l'a déjà mentionné Martijn, il existe biicode qui "utilise CMake pour générer votre projet avec ses dépendances".

0
oleg.blinnikov