Question

Je suis au milieu de la mise en place d'un environnement de construction pour un c ++ projet de jeu. Notre principale exigence est la capacité de construire non seulement notre code de jeu, mais aussi ses dépendances (Ogre3D, CEGUI, coup de pouce, etc.). De plus, nous aimerions être en mesure de construire Linux ainsi que sur Windows comme notre équipe de développement se compose de membres utilisant différents systèmes d'exploitation.

CMake comme outil de construction. Voilà pourquoi nous avons basé notre projet sur CMake trop jusqu'à présent. Nous pouvons compilons parfaitement bien une fois que toutes les dépendances sont configurées manuellement sur chaque système de membres de l'équipe CMake est en mesure de trouver les bibliothèques.

La question est de savoir s'il existe un moyen possible d'obtenir les dépendances mis en place automatiquement. En tant que développeur Java je connais Maven, mais quels outils existent dans le monde de c ++?


Mise à jour: Merci pour les réponses belles et des liens. Au cours des prochains jours, je vais essayer quelques-uns des outils pour voir ce qui répond à nos exigences, à commencer par CMake. J'ai bien eu ma part Autotools jusqu'à présent et autant que j'aime la documentation (le autobook est une très bonne lecture), je crains autotools ne sont pas destinés à être utilisés sur Windows en mode natif.

Certains d'entre vous ont suggéré de laisser certains IDE gérer la gestion des dépendances. Nous composons des personnes utilisant toutes les technologies possibles au code de pur entièrement Vim soufflé Eclipse CDT ou Visual Studio. C'est là CMake permet d'utiliser une certaine flexibilité avec sa capacité à générer des fichiers de projet natifs.

Était-ce utile?

La solution

Dans la dernière version 2.8 CMake il y a la nouvelle ExternalProject Module . Cela permet de télécharger / code de commande, configurer et construire dans le cadre de votre arbre principal de construction. Il devrait également permettre de définir des dépendances.

A mon travail (groupe de traitement d'images médicales) nous utilisons CMake pour construire nos propres bibliothèques et applications. Nous avons un outil interne pour suivre toutes les dépendances entre les projets (définis dans une base de données XML). La plupart des bibliothèques de tiers (comme Boost, Qt, VTK, ITK etc ..) sont construits une fois pour chaque système que nous soutenons (MSWin32, MSWin64, Linux32 etc ..) et sont commited sous forme de fichiers zip dans le système de contrôle de version. CMake puis extraire et configurer le fichier zip correct en fonction du système, le développeur travaille.

Autres conseils

J'utilise GNU autotools (Autoconf, Automake, Libtool) pour les deux derniers mois dans plusieurs projets que j'ai participé et je pense que cela fonctionne à merveille. À vrai dire, il ne prend un peu pour se habituer à la syntaxe, mais je l'ai utilisé avec succès sur un projet qui nécessite la distribution de scripts python, les bibliothèques C, et une application C ++. Je vais vous donner quelques liens qui m'a aidé quand j'ai posé une question similaire ici.

  • La GNU Autotools fournit la meilleure documentation sur le système dans son ensemble, mais il est tout à fait bavard.
  • Wikipédia a une page qui explique comment tout fonctionne. Autoconf configure le projet basé sur la plate-forme que vous êtes sur le point de compiler sur, Automake construit le Makefile pour votre projet et Libtool bibliothèques poignées.
  • Un exemple Makefile.am et a exemple configure.ac devrait vous aider à démarrer.

Quelques plus de liens:

  1. http://www.lrde.epita.fr/~adl/autotools .html
  2. http://www.developingprogrammers.com/ index.php / 2006/01/05 / autotools-tutorial /
  3. http://sources.redhat.com/autobook/

Une chose que je ne suis pas certain sur est tout type d'emballage Windows pour GNU autotools. Je sais que vous êtes capable de l'utiliser à l'intérieur de Cygwin, mais comme pour la distribution en fait des fichiers et des dépendances sur les plateformes Windows, vous êtes probablement mieux d'utiliser un programme d'installation de Windows MSI (ou quelque chose qui peut conditionner votre projet à l'intérieur de Visual Studio).

Si vous souhaitez distribuer des dépendances, vous pouvez les mettre en place dans un sous-répertoire différent, par exemple, libzip , avec une entrée Makefile.am spécifique qui va construire cette bibliothèque. Lorsque vous effectuez une make install la bibliothèque sera installée à la lib dossier que le script de configuration a déterminé qu'il doit utiliser.

Bonne chance!

Il existe plusieurs remplacements de rendre intéressants qui suivent automatiquement les dépendances implicites (à partir des fichiers d'en-tête), sont multi-plateforme et peut faire face à des fichiers générés (par exemple des définitions de shader). Deux exemples que je l'habitude de travailler avec des SCons et Jam / bjam .

Je ne sais pas d'une manière multiplateforme d'obtenir * faire pour suivre automatiquement les dépendances. Le mieux que vous pouvez faire est d'utiliser un script qui analyse les fichiers source (ou a le compilateur C faire) et trouve #includes (compilation conditionnelle rend cette délicate) et génère une partie de makefile. Mais vous auriez besoin d'appeler ce script chaque fois que quelque chose aurait changé.

  

La question est de savoir s'il existe un moyen possible d'obtenir les dépendances mis en place automatiquement.

Que voulez-vous dire mettre en place?

Comme vous l'avez dit, CMake tout compiler une fois que les dépendances sont sur les machines. Vous cherchez juste un moyen d'emballer la source de dépendance? Une fois que toute la source est là, CMake et un outil de construction (gcc, nmake, VSM, etc.) est tout ce dont vous avez besoin.

Edit: Side note, CMake a la commande de fichier qui peut être utilisé pour télécharger des fichiers si elles sont nécessaires: file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

Edit 2: cpack est un autre outil par les gars CMake qui peuvent être utilisés pour emballer des fichiers et comme pour la distribution sur différentes plates-formes. Il peut créer NSIS pour les fichiers Windows et .deb ou .tgz pour * nix.

A mon lieu de travail (nous construisons des systèmes embarqués pour la protection de puissance), nous avons utilisé CMake pour résoudre le problème. Notre configuration permet CMake à exécuter à partir d'endroits différents.

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

L'astuce consiste à faire en sorte que chaque fichier CMakeLists.txt peut être appelé dans l'isolement, mais que le fichier de niveau supérieur peut encore construire tout correctement. Techniquement, nous ne avons pas besoin sous CMakeLists.txt fichiers mais il rend les développeurs heureux. Ce serait une douleur absolue si nous devions modifier un fichier de construction monolithique à la racine du projet.

Je ne l'ai pas mis en place le système (j'ai aidé, mais ce n'est pas mon bébé). L'auteur dit que le système de construction de CMake boost avait des trucs vraiment bien dans ce que l'aider à obtenir le bâtiment chose en douceur.

Sur de nombreux systèmes * nix, une sorte de gestionnaire de paquets ou de construire le système est utilisé pour cela. Le plus commun pour des trucs source est GNU Autotools, que je l'ai entendu est une source de douleur extrême. Cependant, avec quelques scripts et un dépôt en ligne pour votre DEPS vous pouvez configurer quelque chose de similaire comme ceci:

  • Dans votre projet Makefile, créez une cible (le cas échéant avec des sous-objectifs) qui couvre vos dépendances.
  • Dans la cible pour chaque dépendance, vérifiez d'abord si la source est dep dans le projet (sur * nix vous pouvez utiliser touch pour cela, mais vous pourriez être plus complet)
  • Si le dep n'est pas là, vous pouvez utiliser curl, etc pour télécharger le dep
  • Dans tous les cas, les cibles ont dep font un appel make récursif (make; make install; make clean; etc) au Makefile (ou un autre script de configuration / build fichier) de la dépendance. Si le dep est déjà construit et installé, assurez-vous renverra assez rapidement.

Il va y avoir beaucoup de cas de coin qui causeront cette briser si, selon les programmes d'installation pour chaque dep (peut-être l'installateur est interactif?), Mais cette approche devrait couvrir l'idée générale.

En ce moment je travaille sur un outil capable d'installer automatiquement toutes les dépendances d'une application C / C ++ avec exigence exacte version:

  • compilateur
  • libs
  • outils (CMake, autotools)

En ce moment, cela fonctionne, pour mon application. (UnitTest Installation ++, Boost, Wt, sqlite, Cmake tous dans l'ordre correct)

L'outil, nommé «C ++ Version Manager» (inspiré par l'excellent gestionnaire de version rubis), est codé en bash et hébergé sur GitHub: https://github.com/Offirmo/cvm

Les conseils et suggestions sont les bienvenues.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top