2010-12-10 66 views
3

Venant d'un background Rails, je suis habitué à pouvoir spécifier les dépendances de mon application dans un Gemfile qui est enregistré dans mon repo git. Lorsque mon application est tirée, l'utilisateur doit simplement exécuter bundle install et ils ont toutes les dépendances nécessaires.Comment stocker les dépendances de bibliothèque C dans le contrôle de version?

Dans this answer, la communauté semble être d'accord sur le fait que les bibliothèques C ne doivent pas être vérifiées dans le contrôle de source. Cela a du sens (après tout, les Gems eux-mêmes ne sont pas archivés sous Rails) mais cela crée toujours un problème. Si j'écris du code et inclue une nouvelle dépendance sur une bibliothèque créée par l'utilisateur, comment puis-je exprimer cette dépendance dans le contrôle source?

+1

Quelle plateforme? Parce que l'endroit standard de facto pour cela sur Linux est dans un fichier 'configure' (ou n'importe quelle partie du mess d'autoconf le projette). – detly

+5

Si vous utilisez autotools, les dépendances sont vérifiées dans 'configure.ac', généralement via' pkg-config' en invoquant la macro 'PKG_CHECK_MODULES'. Cela vit dans votre VC. Le fichier 'configure', généré à partir de' configure.ac', est exécuté par l'utilisateur et ne le fait pas. –

+2

@Jack Kelly: Vous devriez écrire cela comme une réponse plutôt que comme un commentaire. – caf

Répondre

3

Évidemment, les choses dans le monde C sont un peu différentes parce que vous n'avez pas besoin de la source à l'exécution. La manière générale de faire les choses sur GNU/Linux (et beaucoup d'autres systèmes * ix) est que certaines étapes de la configuration sont effectuées en utilisant un script ou un programme de configuration. Le plus commun d'entre eux est le fameux script configure, généré par GNU autoconf. Les autotools génèrent beaucoup de fichiers cache et copient beaucoup de scripts auxiliaires dans votre arborescence source, alors n'oubliez pas de mettre en place .gitignore ou vous deviendrez fou.

Un grand nombre de bibliothèques installent des fichiers de contrôle pour pkg-config dans $prefix/lib/pkgconfig ou $prefix/share/pkgconfig. Ceux-ci sont lus par l'outil pkg-config pour vérifier l'existence des bibliothèques et obtenir les indicateurs correcteurs du compilateur et de l'éditeur de liens pour cette bibliothèque. Ils sont en texte brut, alors jetez un oeil à /usr/lib/pkgconfig pour avoir une idée de ce à quoi ils ressemblent.

Dans autoconf, un fichier configure.ac est compilé dans configure en appelant le processeur de macros m4 (à travers une enveloppe appelée autoconf). Pour vérifier une bibliothèque qui fonctionne avec pkg-config, les choses sont vraiment faciles. Vous ajoutez quelque chose comme ce qui suit à configure.ac

# Checks for libraries. 
PKG_CHECK_MODULES([GLib], [glib-2.0]) 

Cela vérifiera que pkg-config est installé et ensuite l'utiliser pour vérifier le paquet glib-2.0, l'impression du message Checking for GLib... le long du chemin. Il va également définir les variables de shell GLib_CFLAGS et GLib_LIBS, et faire en sorte qu'elles soient remplacées dans tous les fichiers créés par AC_CONFIG_FILES (tels que votre Makefile, de Makefile.in).S'il ne trouve pas glib, configure échouera avec une erreur. Jetez un oeil à /usr/share/aclocal/pkg.m4 pour trouver la définition de PKG_CHECK_MODULES, qui prend en charge quelques autres options. La documentation est dans la page de manuel pkg-config(1).

Si votre bibliothèque dépendante ne prend pas en charge pkg-config, le fournisseur de bibliothèque fournit parfois une macro autoconf. Les anciennes versions de SDL, par exemple, ont fourni AM_PATH_SDL, mais les nouvelles versions utilisent simplement pkg-config.

S'il n'y a pas de support du fournisseur, il existe parfois un support tiers au autoconf archive. L'archive autoconf est disponible sous forme de paquet dans Debian GNU/Linux et MacPorts (et probablement beaucoup d'autres systèmes), ce qui signifie que toutes les définitions nécessaires peuvent être utilisées sans copier les fichiers .m4 à la main.

Si rien de ce qui précède n'est vrai, alors vérifiez un en-tête en utilisant quelque chose comme AC_CHECK_HEADER et vérifiez la bibliothèque en utilisant quelque chose comme AC_CHECK_LIB.

2

La communauté semble être d'accord pour que les bibliothèques C ne soient pas vérifiées dans le contrôle de source.

Dépend de la bibliothèque que vous utilisez. Par exemple, lorsque j'utilise Sqlite, je vérifie les fichiers sqlite sur mon contrôle de version et les compile avec mes fichiers source. C'est facile car sqlite est livré avec un fichier source et un en-tête. Cela ne sera pas pratique si la bibliothèque a plus de fichiers.

mais cela crée toujours un problème. Si j'écris du code et inclue une nouvelle dépendance sur une bibliothèque créée par l'utilisateur, comment puis-je exprimer cette dépendance dans le contrôle source?

Sous Linux, ceci est géré à l'aide d'autotools. En utilisant cela, vous pouvez spécifier les paquets avec lesquels utiliser et le configure essayera de le trouver lors de la construction. Si vous recherchez une solution multi-plateforme, CMake est le meilleur outil. Ces outils peuvent trouver les packages installés sur des emplacements standard (/usr/lib & /usr/include) et fournit également un moyen d'ajuster le patch de recherche.

+1

+1 pour "Dépend de la bibliothèque que vous utilisez." – khachik