Was ist der Unterschied zwischen den Optionen "./configure" "--build", "--host" und "--target"?

121

Das Skript ./configureakzeptiert 3 Optionen --build, --hostund --target. Ich verwirre ihre Rollen. Was ist der Unterschied und die Semantik von ihnen?

eonil
quelle
Autotools verwenden die falsche Toolchain für eine Cross-Kompilierung, auch mit --hostund --build. Ich habe zwei C ++ - Projekte und es ist unmöglich, für Android zu bauen, weil Autotools so verrückt ist. Es besteht darauf, Tests mit der Toolchain des Hosts auszuführen.
JWW

Antworten:

109

Wie in diesem Blog-Beitrag erwähnt und in den GCC-Konfigurationsbedingungen erwähnt , --targetgilt dies nur, wenn Sie Toolchains kompilieren. Wenn Sie eine normale Kreuzkompilierung einer Bibliothek oder Binärdatei durchführen, die Sie verwenden

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

Wenn Sie jedoch Toolchains erstellen, können die Dinge komplizierter werden. Ich denke, dass Folgendes richtig ist (obwohl ich nicht sagen kann, dass ich jemals einen Cross-Debugger manuell kompiliert habe):

Nehmen wir an, Sie haben:

  • Eine PowerPC-Build-Maschine, auf der Sie die gesamte Kompilierung durchführen werden
  • Mehrere eingebettete Geräte mit Mips-Prozessoren, auf denen Ihr Code ausgeführt wird
  • Ein x86-Laptop, den Sie zum Debuggen dieser Geräte vor Ort verwenden werden

Sie würden Ihren Debugging-Server (z. B. gdbserver) so konfigurieren und erstellen, dass er auf Ihrem eingebetteten Gerät ausgeführt wird

./configure --build=powerpc --host=mips

Damit können Sie Kitt auf Ihr eingebettetes Gerät übertragen und "gdbserver: 1234 a.out" ausführen, um das Debuggen zu starten und Port 1234 abzuhören.

Sie würden dann Ihren Debugging-Client (der eine Verbindung zum GDBServer herstellt und diesen steuert) mit erstellen

./configure --build=powerpc --host=i686 --target=mips 

die Sie auf Ihren x86-Laptop kopieren würden, damit Sie im Feld "gdbclient embedded.device: 1234" ausführen können, um Ihr a.out-Programm zu debuggen.

Dies gilt auch für Compiler, für die Sie möglicherweise den obigen GCC-Link oder diesen Abschnitt über die kanadische Cross- Kompilierung lesen möchten .

Beachten Sie auch, dass in der Praxis möglicherweise kein Build, Host oder Ziel angegeben wird, da laut dieser Autoconf-Handbuchseite "Ziel standardmäßig Host, Host zum Erstellen und Build zum Ergebnis von config.guess" ist.

Mit einem Wort, bauen Sie den Code auf --buildund führen Sie ihn --hostmit der --targetArchitekturumgebung aus.

user124850
quelle
11
Wie finde ich heraus, was für "Host" und "Ziel" zu setzen ist?
Schwarz
4
Ich denke, Sie sprechen über das Erstellen eines neuen Compilers, da "--target" nur für Compiler relevant ist. * "Host" ist der Ort, an dem Ihr neuer Compiler ausgeführt werden soll. * "Ziel" ist der Ort, an dem die von Ihrem neuen Compiler erstellten ausführbaren Dateien ausgeführt werden sollen.
user1735594
Ist dies nicht eine falsche Antwort, weil --host = i686 hier nicht gültig ist?
Infoclogged
1
In der Antwort wurde erwähnt, dass die Kompilierung für das MIPS-Ziel durchgeführt wurde. Dies ist der Build, und der Host ist der Debugger für den MIPS-Computer. Bedeutet dies, dass der Debugger / Compiler auch vom PowerPC erstellt wurde? Dies ist ein Kommentar, den ich von einem anderen Benutzer (Ned) erhalten habe: build = wo kompiliere ich den Compiler, host = wo der Compiler ausgeführt wird, target = welcher Code wird der Compiler produzieren. Referenz: stackoverflow.com/questions/7088576/…
supmethods
Laut Ned würde dies nicht bedeuten, dass der PowerPC sowohl der Build / Host, der x86-Computer ein Ziel des Debuggers als auch das Ziel als MIPS-System ist. Können Sie mehr erklären, was "Bauen für" und "Bauen auf" ist? Ich verweise auf gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
Methoden
75

Hinweis: Argument --targetist nur beim Erstellen eines Compilers (z. B. GCC) sinnvoll. Beim Ausführen configurevor dem Erstellen von GCC:

  • --build: die Maschine, auf der Sie bauen
  • --host: die Maschine, für die Sie bauen
  • --target: Die Maschine, für die GCC Binärdateien erstellt

Aus der GCC-Dokumentation ( Host / Target-spezifische Installationshinweise ):

Wenn Build, Host und Ziel identisch sind, wird dies als nativ bezeichnet. Wenn Build und Host identisch sind, das Ziel jedoch unterschiedlich ist, wird dies als Kreuz bezeichnet. Wenn Build, Host und Ziel unterschiedlich sind, spricht man von einem Kanadier (aus obskuren Gründen, die sich mit Kanadas politischer Partei und dem Hintergrund der Person befassen, die zu diesem Zeitpunkt an dem Build arbeitet). Wenn Host und Ziel identisch sind, der Build jedoch unterschiedlich ist, verwenden Sie einen Cross-Compiler, um einen Native für ein anderes System zu erstellen. Einige Leute nennen dies einen Host-x-Host, einen gekreuzten Eingeborenen oder einen gekreuzten Eingeborenen. Wenn Build und Target identisch sind, der Host jedoch unterschiedlich ist, verwenden Sie einen Cross-Compiler, um einen Cross-Compiler zu erstellen, der Code für den Computer erzeugt, auf dem Sie aufbauen. Dies ist selten, daher gibt es keine übliche Art, es zu beschreiben. Es gibt einen Vorschlag, dies als Crossback zu bezeichnen.

Delan Azabani
quelle
2
Was anscheinend bedeutet, --targetist für kein Projekt relevant, das selbst kein Compiler ist. Warum ist es eine Standardkonfigurationsoption? Verwirrend.
Dhardy
1
@dhardy: configureist nicht gerade ein Höhepunkt für gutes und sauberes Design; Ich denke, es ist nur ein Ergebnis des anwendungsspezifischen Feature-Creep.
Tim
Wenn ich eine gcc erhalten möchte, z. B. "./configure --build = powerpc --host = i686 --target = mips" ausführen, ist die ausführbare Ausgabedatei verkrüppelt? Normalerweise ist gcc ein leistungsstarkes Tool, das C-Code erstellen und dann viele Ergebnisse für viele Plattformen ausgeben kann. Wenn ich hier '--target = mips' verwende, hat der angegebene gcc die Fähigkeit verloren?
Gfan
Möglicherweise funktionieren auch die Dateien config.guess und config.sub, damit der Compiler mehr Zielplattformen kennt. Sie können sie hier herunterladen
wirtsi