2010-06-26 4 views
3

J'ai une application C Je convertis un ensemble de Makefiles codés à la main en GNU AutoMake. Il a un sous-répertoire qui contient un en-tête d'interface et plusieurs implémentations dépendant de la plate-forme. Actuellement, une implémentation est sélectionnée et construite dans un fichier objet avec un nom fixe dans ce répertoire. Le code qui utilise l'interface du pilote établit alors des liens avec ce fichier objet et obtient automagiquement le bon pilote.Fichiers d'objets intermédiaires explicites dans GNU AutoMake

Quelle est la meilleure façon de convertir ce système pour utiliser AutoTools? J'ai déjà AutoConf créer une substitution pour le fichier d'implémentation de pilote correct. Je n'arrive pas à comprendre comment obtenir une cible AutoMake dont je peux mettre les fichiers d'implémentation avec les variables EXTRA_*_SOURCES et *_LDADD. Ai-je juste besoin d'abandonner le fichier d'objet intermédiaire et de le mettre dans la liste pour la cible du programme qui utilise leur?

EDIT: Résolu grâce à ptomato. En raison de la résolution des dépendances d'Automake, toutes les sources possibles doivent être nommées dans *_SOURCES et EXTRA_*_SOURCES, comme expliqué dans the Conditional Sources section of the manual. Par conséquent, la strophe de la bibliothèque est en fait:

noinst_LIBRARIES = libdriver.a 
libdriver_a_SOURCES = driver.h 
EXTRA_libdriver_a_SOURCES = driver-linux.c driver-windows.c driver-osx.c 
libdriver_a_LIBADD = @[email protected] 

Répondre

2

Vous pouvez créer une bibliothèque pratique et la lier de manière statique à votre application. Il y a finalement très peu de différence entre ça et un fichier objet. Voir this page du manuel Automake. Fondamentalement, il va comme ceci:

noinst_LIBRARIES = libdriver.a 
libdriver_a_SOURCES = @[email protected] 
myprogram_LDADD = libdriver.a 

où votre fichier objet intermédiaire avec un nom fixe est libdriver.a, et votre application est myprogram.

Cependant, cela me semble inutilement compliqué. Je ne vois pas pourquoi vous ne devriez pas, comme vous le suggérez, abandonner le fichier objet intermédiaire et mettre les fichiers d'implémentation dans la cible du programme qui les utilise.

+0

Je crois qu'il a été implémenté à l'origine de telle sorte que le fichier Makefile contrôlant la construction du pilote puisse se trouver dans le même répertoire que le code du pilote. Je ne suis pas sûr d'être d'accord avec cette philosophie, mais ce n'est pas mon projet, alors je m'en tiendrai là. –

Questions connexes