2009-06-11 7 views
2

Je suis nouveau à Automake et j'essaye de compiler sans lier. Mon but est de générer un Makefile simple comme illustré ci-dessous en utilisant Automake.Comment compiler sans lier dans Automake?

CFLAG = -Wall 

build: Thread.o 

Thread.o: Thread.cc Thread.h 
    g++ $(CFLAG) -c Thread.cc 

clean: 
    rm -f *.o 

Ma tentative jusqu'à présent m'a amené à la suivante Makefile.ac.

noinst_PROGRAMS = thread 

thread_SOURCES = Thread.cc 

EXTRA_DIST= Thread.h 

Comment puis-je simuler mon Makefile d'origine?

Répondre

2

Une façon est de le faire est de tromper Automake en fournissant commande lien qui ne lien:

thread_LINK = true 

Autre que cela, je ne serais pas surpris si Automake n'a pas cette fonctionnalité.

+0

Ce fut une solution simple au problème. Merci pour le conseil. –

2

Pour votre exemple, vous pouvez demander à Automake de créer directement votre fichier .o, par exemple.:

$ make Thread.o 

Je crois que c'est une règle implicite, de sorte que vous ne verrez pas dans la sortie Makefile.

En général, Automake génère des variables contenant tous les objets requis pour chaque cible d'exécutable ou de bibliothèque. Il est assez simple de les utiliser dans votre Makefile, puisqu'il génère simplement leur nom en ajoutant _OBJECTS au nom de la cible. Vous pouvez faire votre propre cible dans Makefile.am comme ceci:

build-thread: $(thread_OBJECTS) 

Ensuite, vous pourriez construire juste Thread.o (et tous les autres objets nécessaires à thread) comme celui-ci:

$ make build-thread 

Ou si vous aviez plusieurs cible les foo, bar et baz, vous pouvez faire votre cible de compilation que dans Makefile.am comme ceci:

build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS) 

La seule douleur ici est que vous devrez maintenir cette liste vous-même en fonction des cibles dans votre Makefile.am. Vous pouvez l'appeler sur la ligne de commande comme ceci:

$ make build 
2

Automake n'est pas conçu pour produire un objet. Il va construire des programmes ou des bibliothèques. Il est difficile de répondre à votre question sans savoir pourquoi vous voudriez compiler un seul fichier objet et pas autre chose. Peut-être qu'il y a une réponse plus claire à votre "vrai" problème.

Un Makefile.am vous pourriez écrire est

noinst_LIBRARIES = libThread.a 
libThread_a_SOURCES = Thread.cc Thread.h # No need to put headers in EXTRA_DIST 

Le résultat Makefile construirait une bibliothèque libThread.a ne contenant que libThread.o, parce que *.a ans les bibliothèques sont juste une collection de fichiers objet, il n'y a pas de lien en cause. Le Makefile.am ci-dessus provoque également l'Makefile émis contenir des règles pour compiler libThread.o, de sorte que vous pouvez ajouter une règle build: si vous le souhaitez.

Si vous voulez vraiment Automake émette cette règle de compilation, mais pas construire la bibliothèque, vous pouvez aller avec

EXTRA_LIBRARIES = libThread.a # EXTRA here means "output build rules but don't 
           # build unless something depends on it". 
libThread_a_SOURCES = Thread.cc Thread.h 
build: Thread.$(OBJEXT) 

Maintenant, vous exigent explicitement le fichier Thread.$(OBJEXT) à construire que lorsque vous tapez make build, comme dans votre original Makefile.

(Automake utilise .$(OBJEXT) plutôt que .o pour soutenir des extensions comme .obj dans des variantes DOS.)

0

Tout d'abord, automake est un outil pour faciliter la réalisation Makefile automatique; faire en soi est une bête complètement différente (et je suis sûr que ce que vous cherchiez était une solution).

est ici le plus facile Makefile à base de GNU pour accomplir ce que vous voulez:

all: Thread.o 

Ce remplit quelque chose (par défaut) comme ce qui suit (s'il vous plaît changer les espaces de 4 espaces à onglets durs):

all: Thread.o 

Thread.o: Thread.cc 
    $(COMPILE.cpp) $(OUTPUT_OPTION) $< 

Les macros COMPILE.cpp et OUTPUT_OPTION se développent bien sûr par défaut sur GNU et ne sont pas portables; $ < est AT & T Faites cependant la syntaxe standard selon la page de manuel de pmake (1). GNU make a un concept de règles implicites ou explicites, de motifs, de suffixes, etc. que vous pouvez utiliser, mais ce n'est pas portable pour toutes les versions de make, et c'est pourquoi tout le Makefile est clairement écrit en termes de cibles et variables comme POSIX ne décrit pas la plupart des scénarios souhaités pour la façon dont on devrait écrire un Makefile.

Run gmake -p pour plus de détails et jetez un oeil au manuel d'texinfo pour gmake dans le sujet des règles implicites, explicites, motifs, suffixes, etc.

Questions connexes