2010-01-26 9 views
20

ich für die Antwort auf diese Frage gesucht, aber nicht gut finden. Vielleicht sind sie alt und etwas hat sich geändert, also frage ich noch einmal.Automake- Binärdateien ist Erzeugen/statt in src/

Ich habe eine Verzeichnisstruktur wie:

my_project

  • src

  • bin

Ich möchte, dass, wenn ich in der Wurzel dir machen, Die Binärdateien werden in ./bin eingefügt, anstatt sie zu überladen ./src. Aber wie?

EDIT: Ich benutze C++. Meine Makefile.am hat nichts besonderes. Nur die Variablen bin_PROGRAM und _SOURCES.

Wenn ich make ausführen, werden die generierten Binärdateien in ./src eingefügt. Ich möchte sie einfach nur in ./bin haben.

+0

Post, was Sie getan haben (Ihre Makefile), klären Sie Ihre Verzeichnisstruktur oben, dann wird es viel einfacher zu helfen (auch die Programmiersprache, die Sie verwenden, könnte relevant sein) – KevinDTimm

+0

Verwenden Sie den vollständigen Autotools-Stack? Wenn ja, wie @Braden erwähnt, verwenden Sie einfach das Shell-Skript 'configure', das von Autoconf generiert wird. – Plamen

+0

http: // Stapelüberlauf.com/questions/1015700/autotools-library-and-object-file-output-control –

Antwort

29

Sie haben hier die falsche Idee.

Ihr Build-Baum ist wo immer Sie laufen configure. So funktioniert autoconf. Benutzer Ihres Pakets (die ihren Quellbaum nicht durcheinander bringen wollen) erwarten, dass es so funktioniert.

Dieser Ansatz ist eine allgemeinere Lösung mit viel mehr Flexibilität als die Organisation, die Sie sich vorstellen. Zum Beispiel ist es nicht ungewöhnlich, Quellen zu pflegen und Dateien auf separaten Dateisystemen zu erstellen.

18

Automake kommt nicht gut zurecht, wenn Sie versuchen, Ihre Verzeichnisse anders als erwartet einzurichten. Was Sie wollen, würde beinhalten, zusätzliche Regeln zu schreiben, um die Binaries nach dem Kompilieren nach ../bin zu verschieben, was unnötigerweise kompliziert ist.

Wenn Sie Ihr Quellverzeichnis Krempel wollen dies nicht, versuchen Sie:

cd my_project 
mkdir build 
cd build 
../configure 
make 

, dass alle generierten Dateien (wie Makefiles, Binärdateien, Objektdateien) gesetzt wird in einem Unterverzeichnis von my_project/build.

+0

Es funktioniert, aber ist ein bisschen clusmy. Ich könnte es tun, aber was ist, wenn andere meine Software benutzen? Sie werden ihre ./src überladen haben. Vielleicht könnte ich einfach diese Befehle zur Makefile-Regel hinzufügen? –

+1

'configure' ist, was die Makefiles generiert, so dass Sie diesen Befehl nicht in das Makefile einfügen können. Ich kann mit Sicherheit sagen, dass die meisten Leute nicht daran interessiert sind, ihre ./src überladen zu haben, weil Automake immer so funktioniert. Dies ist die Standardlösung für diejenigen, die sich darum kümmern. Und wenn sie lieber die Binärdateien im gleichen Verzeichnis haben? Wenn Sie es immer noch einrichten möchten, ich glaube nicht, dass es einen Weg gibt, Automake zu verlassen (obwohl Sie Autoconf immer noch verwenden können). – ptomato

+2

Plus, wenn andere Leute Ihre Software verwenden und sehen, dass es verwendet autoconf/automake, sie erwarten nicht, dass sie Sachen in einem separaten Verzeichnis erstellen (es sei denn, sie arrangieren dies, indem sie configure elsewere ausführen, wie es ptomato gezeigt hat). Es ist nur die Philosophie des GNU Build Systems, und Autoconf/Automake sind Werkzeuge, um das GNU Build System zu implementieren und nicht etwas anderes. Vielleicht möchten Sie das einführende Kapitel von Automake für benutzerspezifische Anwendungsfälle des GNU Build Systems betrachten: http://sources.redhat.com/automake/automake.html#Use-Cases – adl

14

Eine Möglichkeit, Automake anzuweisen, Binärdateien in einem bestimmten Verzeichnis zu erstellen, besteht darin, dieses Verzeichnis direkt dem Namen in der Variable "bin_PROGRAMS" hinzuzufügen.

Betrachten Sie die folgende src/Makefile.am:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

Es schafft eine binäre "src/foo", aber man kann sagen, Automake- die Quellen in src zu verwenden, um eine binäre "bin/foo" zu erstellen :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

Ich versuchte es mit einigen Paketen und sogar "make distcheck" schluckt es. Kann aber nicht viel von einem Hack sein ...

+0

Es ist die beste Lösung, denke ich. Nicht perfekt, weil alle .o und Dateien, die durch den Kompilierungsprozess erstellt wurden, immer noch in src sind, aber ... –

+1

Gibt es sowieso etwas zu bewegen * alles * build bezogen auf einen Unterordner wie build/(einschließlich Objektdateien, generierte Textdateien .desktop-Dateien, etc.), ähnlich wie ich es in der Java-Welt zB mit Maven gewohnt bin. – lanoxx

+2

Sie könnten versuchen, das configure-Skript von einem anderen Ordner aus auszuführen; Zum Beispiel könnten Sie einen "build" Unterordner erstellen, führen Sie "cd build; ../configure; make" aus. Dies wird alles außerhalb "Build" unberührt lassen und alle Dateien innerhalb von "Build" generieren, einschließlich Objekte und Binärdateien. –