Jaka jest różnica między opcją „./configure” „--build”, „--host” i „--target”?

121

Skrypt ./configureprzyjmuje 3 opcje --build, --hosti --target. Mylę ich role. Jaka jest ich różnica i semantyka?

eonil
źródło
Autotools użyje niewłaściwego łańcucha narzędzi do kompilacji krzyżowej, nawet używając --hosti --build. Mam dwa projekty C ++ i nie mogę zbudować dla Androida, ponieważ Autotools jest tak popieprzony. Nalega na uruchamianie testów przy użyciu łańcucha narzędzi hosta.
jww

Odpowiedzi:

109

Jak wspomniano w tym poście na blogu i wspomniano w Warunkach konfiguracji GCC , --targetmają zastosowanie tylko wtedy, gdy kompilujesz łańcuchy narzędzi. Kiedy robisz normalną kompilację krzyżową biblioteki lub pliku binarnego, którego używasz

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

Jednak, kiedy toolchain budowę, co może się bardziej skomplikowane. Myślę, że poniższe informacje są poprawne (chociaż nie mogę powiedzieć, że kiedykolwiek ręcznie skompilowałem cross-debugger):

Powiedzmy, że masz:

  • maszyna do budowania powerpc, na której będziesz kompilować
  • kilka urządzeń wbudowanych z procesorami mips, na których będzie działał Twój kod
  • laptop x86, którego będziesz używać do debugowania tych urządzeń w terenie

Skonfigurowałbyś i zbudował swój serwer debugowania (np. Gdbserver), aby działał na twoim urządzeniu wbudowanym z

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

abyś mógł podłączyć się do swojego urządzenia wbudowanego i uruchomić "gdbserver: 1234 a.out", aby rozpocząć debugowanie i nasłuchiwać na porcie 1234.

Następnie zbudowałbyś swojego klienta debugującego (który łączy się z gdbserver i kontroluje go) z

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

który można skopiować na laptopa x86, aby w polu uruchomić "gdbclient embedded.device: 1234" w celu debugowania programu a.out.

To wszystko dotyczy również kompilatorów, dla których możesz zajrzeć do powyższego łącza GCC lub tej sekcji o kanadyjskiej kompilacji krzyżowej .

Zauważ również, że w praktyce możesz nie widzieć kompilacji, hosta lub celu, ponieważ zgodnie z tą stroną podręcznika Autoconf , „cel domyślnie jest hostem, hostem do zbudowania i budowaniem na podstawie config.guess”.

Jednym słowem, zbudować kod na --builduruchom go --hostz --targetarchitekturą otoczenia.

user124850
źródło
11
Jak dowiedzieć się, co wpisać dla „hosta” i „celu”?
Czarny
4
Myślę, że mówisz o zbudowaniu nowego kompilatora, ponieważ „--target” ma znaczenie tylko dla kompilatorów. * „host” to miejsce, w którym powinien działać Twój nowy kompilator. * „miejsce docelowe” oznacza miejsce, w którym powinny działać pliki wykonywalne utworzone przez nowy kompilator.
user1735594
czy to nie oznacza, że ​​jest to błędna odpowiedź, ponieważ opcja --host = i686 nie jest poprawna?
infoclogged
1
W udzielonej odpowiedzi wspomina się, że kompilacja została wykonana dla celu MIPS i to jest kompilacja, a host jest debugerem dla maszyny MIPS. Czy to oznacza, że ​​debugger / kompilator został również zbudowany przez powerpc? To jest komentarz, który otrzymałem od innego użytkownika (Ned): build = gdzie kompiluję kompilator, host = gdzie kompilator będzie działać, cel = jaki kod utworzy kompilator.
Źródła
Według Neda, czy nie oznaczałoby to, że powerpc jest jednocześnie kompilacją / hostem, maszyna x86 jest celem debuggera i celem jako system MIPS. Czy możesz wyjaśnić więcej, czym jest „budowanie” i „budowanie”? Odwołuję się do gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods
75

Uwaga: Argument --targetma sens tylko podczas budowania kompilatora (np. GCC). Podczas uruchamiania configureprzed zbudowaniem GCC:

  • --build: maszyna, na której budujesz
  • --host: maszyna, dla której budujesz
  • --target: maszyna, dla której GCC utworzy plik binarny

Z dokumentacji GCC ( uwagi dotyczące instalacji specyficzne dla hosta / celu ):

Jeśli kompilacja, host i cel są takie same, nazywa się to rodzimym. Jeśli kompilacja i host są takie same, ale cel jest inny, nazywa się to krzyżem. Jeśli budowa, host i cel są różne, nazywa się to kanadyjczykiem (z niejasnych powodów dotyczących kanadyjskiej partii politycznej i osoby pracującej w tym czasie nad kompilacją). Jeśli host i cel są takie same, ale kompilacja jest inna, używasz kompilatora krzyżowego do tworzenia natywnego dla innego systemu. Niektórzy nazywają to host-x-host, cross-native lub cross-build native. Jeśli kompilacja i cel są takie same, ale host jest inny, używasz kompilatora krzyżowego do kompilowania kompilatora krzyżowego, który tworzy kod dla maszyny, na której budujesz. Jest to rzadkie, więc nie ma powszechnego sposobu, aby to opisać. Istnieje propozycja, aby nazwać to zwrotem.

Delan Azabani
źródło
2
Co najwyraźniej oznacza, że --targetnie dotyczy żadnego projektu, który sam nie jest kompilatorem. Dlaczego więc jest to standardowa opcja konfiguracji? Mylące.
dhardy
1
@dhardy: configurenie jest szczytem dobrego i czystego projektu; Wydaje mi się, że to tylko wynik pełzania funkcji specyficznych dla aplikacji.
Tim Čas
Jeśli chcę uzyskać gcc, na przykład uruchom "./configure --build = powerpc --host = i686 --target = mips", czy plik wyjściowy jest uszkodzony? Zwykle gcc jest potężnym narzędziem, które może zbudować kod w języku C, a następnie wygenerować różnego rodzaju wyniki dla wielu platform. Tutaj, jeśli użyję „--target = mips”, czy określone gcc straciło zdolność?
gfan
Może też zadziałać aktualizacja plików config.guess i config.sub, aby kompilator poznał więcej platform docelowych. Możesz je pobrać tutaj: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi