Meilleure structure de dossiers pour la bibliothèque et les liaisons inter-plateformes C ++

Je suis sur le sharepoint commencer à travailler sur une bibliothèque multi-plateforme à écrire en C ++. Par la suite, j’ai l’intention d’implémenter des liaisons pour d’autres langages tels que Python, Java, etc. La bibliothèque doit être disponible sur les principales plates-formes: win32, Linux et Mac OSX.

Bien que l’application soit vraiment une bibliothèque, certains programmes de console de base seront fournis avec elle pour la démonstration et les tests.

Je voudrais proposer une structure de dossiers optimale avant de commencer à stocker des éléments dans Subversion.

Je pense à quelque chose comme:

/project //Top level folder /bin //Binaries ready for deployment /linux_amd64 //Linux AMD64 platform /debug //Debug build - duplicated in all platforms /release //Release build - duplicated in all platforms /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /cygwin //Windows 32-bit platform comstackd with Cygwin /vs.net //Windows 32-bit platform comstackd with Visual Studio .NET /win64 //Windows 64-bit platform /build //Make and build files, IDE project files /linux_amd64 //Linux AMD64 platform /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /win64 //Windows 64-bit platform /config //Configuration files that accompany the binaries /data //Data files that accompany the binaries /doc //Documentation /lib //External or third-party libraries /platforms //Platform-specific code for ... /linux_amd64 //Linux AMD64 platform /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /win64 //Windows 64-bit platform /src //Available library source code in subfolders /src //Source code tree - this will contain main.cpp /bindings //Bindings to other languages such as ... /python /java /h //Header files /modules //Platform-independent modules, components or subprojects /platforms //Platform-specific code for ... /linux_amd64 //Linux AMD64 platform-specific code /linux_i386 //Linux 32-bit platform-specific code /macosx /win32 //Windows 32-bit platform-specific code /win64 //Windows 64-bit platform /test //Automated test scripts 

Si vous avez des suggestions, j’aimerais les entendre. Je me demande s’il existe un outil pouvant aider à créer cette structure.

Je compte utiliser CMake et Subversion.

La structure me semble bien, mais il y a quelques points:

  • il est normal de séparer les fichiers d’en-tête et les fichiers sources C ++ dans des répertoires différents, ou peut-être y a-t-il une structure dans le répertoire des modules que vous ne présentez pas?
  • vous voulez probablement que les répertoires placent des fichiers intermédiaires comme * .obj dans
  • vous aurez besoin de différents répertoires pour déboguer et libérer les fichiers de sortie
  • un répertoire pour les installateurs comme InnoSetup et leurs fichiers d’installation peuvent être utiles – vous devez prendre la décision philosophique sur l’opportunité de contrôler ces versions

En ce qui concerne les outils permettant de créer la structure, vous n’avez besoin que de quelques minutes pour écrire un script bash. Cela vaut la peine de disposer des mêmes outils (comme bash) sur toutes les plates-formes.

Pourquoi avez-vous besoin de différents dossiers de plate-forme pour les fichiers binarys? Vous allez construire ce code source sous différents platoforms mais avec le même système de fichiers?

Si oui, je pense que vous avez aussi besoin de dossiers spécifiques au compiller.

Pourquoi n’utilisez-vous pas des dossiers différents pour les versions de débogage et de publication, peut-être pour les versions unicode et non unicode, mono-threading ou multithreading?

Regardez sur bjam ou scons faites des remplacements. Peut-être que vous n’avez pas besoin de dossiers différents dans le répertoire de construction.

Je pense que ce sera mieux si tous les modules du répertoire “modules” contenaient le répertoire “tests” pour le test self.


Et enfin – voyez la librairie boost, cette librairie indépendante de platofrm qui a une structure agréable.

Essayez également d’obtenir des idées de projets indépendants sur d’autres plates-formes.

Boost dossiers structure:

 boost - root dir - boost - library header lib ( for users ) - libs - library source dir ( one dir per lib ) - build - library build files ( if they are needed ) - doc - documentation files - example - sample programs - src - library source files - test - programs and srcipts for testing module - bin - created by bjam build system - libs -  for all comstackd folders from libs [example|test|build] - /<[static|dynamic]-link>/<[debug|release]>/<[threading mode]> contain builded [obj|dll|lib|pdb|so|o|etc] files see detailed information in bjam build system - doc - tools 

Si vous choisissez Bjam, vous ne serez pas concerné par la structure des dossiers de construction et de la corbeille.

De plus, votre libs / src / dir pourrait contenir ses propres fichiers de plate-forme et deux répertoires pour les fichiers spécifiques à la plate-forme.

Je ne vois aucun problème sérieux dans votre structure de dossiers, peut-être que vous les verrez quand commenceront à écrire un prototype de projet.

J’ai récemment posté une question sur les en-têtes d’emballage dans un seul répertoire, et j’ai décidé de choisir un petit nombre de répertoires d’inclusion.

Allez-vous répondre à Win64? Ce sera une cible de plus en plus importante.

Ne placez pas vos fichiers intermédiaires de construction sous un arbre en cours de vérification dans svn. Si vous le faites, en fonction de vos outils client svn, ils génèreront beaucoup de bruit en tant que fichiers qui ne sont pas dans le référentiel. Cela rend difficile de voir les fichiers que vous avez ajoutés et qui doivent figurer dans le référentiel.

Si votre compilateur le permet, placez plutôt les répertoires intermédiaires sur le côté.

Sinon, assurez-vous d’append tous les répertoires intermédiaires à vos propriétés d’exclusion svn. Certaines interfaces graphiques rendent cela plus facile que d’autres (Tortoise sous Windows, Cornerstone ou Versions sous OS / X).

Puis-je suggérer de ne pas utiliser l’architecture pour classer les fichiers de génération?

J’essayais d’appliquer votre structure de dossiers proposée mais je n’ai pas trouvé le bon endroit pour mettre les définitions communes de Linux Makefile et les fichiers de propriétés de Visual Studio. Qu’en est-il de ce qui suit:

 /project /build /linux /macosx /win32 (or win) 

Et exemple exemple:

 /project /build /linux Make.defs Makefile [i386, amd64] /win32 /VC8 / .vcproj .sln [Win32, x64] /VC11 / .vcxproj .sln [Win32, x64, ARM] 

Si vous ne voulez pas définir des constructions d’architecture à travers des configurations, que diriez-vous d’une autre couche de dossiers sous les types de plate-forme?

 /project /build /linux /linux_amd64 /linux_i386 /macosx /? /win32 (or win) /win32 /win64 

Si un projet donné n’a pas de fichiers de construction communs pour une plate-forme, la structure originale suffira.