2009-06-11 7 views
2

Ich bin neu in Automake und ich versuche, ohne Verknüpfung zu kompilieren. Mein Ziel ist es, mit Automake ein einfaches Makefile wie unten gezeigt zu generieren.Wie kompilieren Sie ohne Verknüpfung in Automake?

CFLAG = -Wall 

build: Thread.o 

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

clean: 
    rm -f *.o 

Mein bisheriger Versuch hat mich zum folgenden Makefile.ac gebracht.

noinst_PROGRAMS = thread 

thread_SOURCES = Thread.cc 

EXTRA_DIST= Thread.h 

Wie kann ich mein original Makefile simulieren?

Antwort

2

Eine Möglichkeit, dies zu tun ist Automake- zu täuschen, indem Link-Befehl bereitstellt, die nicht Link funktioniert:

thread_LINK = true 

Other than that, würde ich nicht überrascht, wenn Automake- nicht solche Funktion hat.

+0

Dies war eine einfache Lösung für das Problem. Danke für den Hinweis. –

2

Für Ihr Beispiel können Sie nur Automake fragen, um Ihre .o Datei direkt zu erstellen, z.:

$ make Thread.o 

Ich glaube, das eine implizite Regel ist, so dass Sie es nicht in der Ausgabe Makefile sehen.

Im Allgemeinen generiert Automake Variablen, die alle die Objekte enthalten, die für jede ausführbare Datei oder jedes Bibliotheksziel erforderlich sind. Es ist ziemlich einfach, sie in Ihrem Makefile zu verwenden, da es nur ihre Namen generiert, indem Sie _OBJECTS an den Zielnamen anhängen. Sie könnten Ihr eigenes Ziel in Makefile.am wie diese machen:

build-thread: $(thread_OBJECTS) 

Dann könnten Sie bauen nur Thread.o (und alle anderen für thread benötigten Objekte) wie folgt aus:

$ make build-thread 

Oder wenn Sie hatte mehrere Ziele foo, bar und baz, könnten Sie Ihre Kompilierung Ziel, das nur in Makefile.am wie diese machen:

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

Der einzige Schmerz hier ist, dass Sie diese Liste basierend auf den Zielen in Ihrem Makefile.am selbst pflegen müssen. Sie können es an der Befehlszeile wie folgt aufrufen:

$ make build 
2

Automake ist nicht für die Herstellung von Objekten entwickelt. Es wird entweder Programme oder Bibliotheken erstellen. Es ist schwierig, Ihre Frage zu beantworten, ohne zu wissen, warum Sie eine einzelne Objektdatei kompilieren möchten und nicht etwas anderes. Vielleicht gibt es eine sauberere Antwort auf Ihr "echtes" Problem.

A Makefile.am Sie schreiben könnte, ist

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

Die Makefile resultierende libThread.a enthält eine Bibliothek bauen würde nur libThread.o, ans weil *.a Bibliotheken nur eine Sammlung von Objekt sind Dateien gibt es keine Verknüpfung beteiligt ist. Die obige Makefile.am bewirkt auch, dass die ausgegebene Makefile Regeln enthält, um libThread.o zu kompilieren, so dass Sie eine build: Regel hinzufügen können, wenn Sie möchten.

Wenn Sie wirklich Automake- wollen diese Kompilierung Regel emittieren, aber die Bibliothek nicht bauen, könnten Sie gehen mit

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) 

Jetzt sind Sie explizit die Datei benötigen Thread.$(OBJEXT) nur gebaut werden, wenn Sie make build geben, wie in Ihrem Original Makefile.

(Automake- verwendet .$(OBJEXT) statt .o zu Erweiterungen wie .obj in DOS-Varianten zu unterstützen.)

0

First off, auto ein Werkzeug zur automatischen Make ist Makefiles zu machen; make an und für sich ist ein ganz anderes Biest (und ich bin mir ziemlich sicher, dass das, was Sie suchten, eine Make-Lösung war).

Hier ist die einfachste GNU basiert Makefile zu erreichen, was Sie wollen:

all: Thread.o 

Diese in etwas füllt (Standardeinstellung) wie folgt (bitte ändern 4-Raum Leerzeichen zu hart Tabs):

all: Thread.o 

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

Die COMPILE.cpp und OUTPUT_OPTION-Makros erweitern natürlich standardmäßig GNU machen angegebene Werte und sind nicht tragbar; $ < ist AT & T Machen Sie Standard-Syntax obwohl nach Pmake (1) der Manpage obwohl.

GNU make hat ein Konzept von impliziten vs expliziten Regeln, Mustern, Suffixen usw., die Sie verwenden könnten, aber das ist nicht auf alle Versionen von make portierbar, und deshalb wird das gesamte Makefile einfach ausgedrückt Ziele und Variablen wie POSIX beschreibt nicht viele der gewünschten Szenarien, wie man ein Makefile schreiben soll.

Run gmake -p, um weitere Informationen und nehmen Sie einen Blick auf die texinfo Handbuch für gmake in das Thema implizit, explizite Regeln, Muster, Suffixe usw.