Dlaczego gcc pokazuje `unknown` w Target: x86_64-unknown-linux-gnu w Arch Linux?

12

Chciałbym wiedzieć, dlaczego, kiedy działam gcc -vpod Arch Linux, pokazuje unknownsłowo w tych wynikach:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/5.1.0/lto-wrapper
Target: x86_64-unknown-linux-gnu

podczas gdy w innych dystrybucjach, takich jak ubuntu, wyświetla nazwę dystrybucji, na przykład ubuntu:

 Using built-in specs.
 COLLECT_GCC=gcc
 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-ubuntu-linux-gnu/5.1.0/lto-wrapper
 Target: x86_64-ubuntu-linux-gnu
noslin005
źródło
Skąd zainstalowałeś ten gcc?
Faheem Mitha
gcczostały zainstalowane wraz z corepakietami podczas instalacji Arch.
noslin005
Dobrze. Może więc sprawdź instrukcje kompilacji tego pakietu?
Faheem Mitha

Odpowiedzi:

8

Jak już wspomniano w komentarzu, domyślnie triplet docelowy jest generowany przez skrypt config.guess . Jego logika jest dość prosta. Najpierw używa unamekilku podstawowych informacji o systemie:

UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown

Ciągi te są łączone i dopasowywane do zakodowanych wzorów. Wynik jest również zakodowany na stałe:

case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
...(snip)...
    x86_64:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
...(snip)...

W przypadku niektórych systemów można uzyskać bardziej znaczący wynik, na przykład IBM w „rs6000-ibm-aix”.

Opiekunowie dystrybucji po prostu nadpisują ten ciąg swoim własnym (także zakodowanym na stałe):

$ gcc -v
...(snip)...
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10'
...(snip)...
--target=x86_64-linux-gnu

GCC 6 prawdopodobnie domyślnie wyświetli x86_64-pc-linux-gnu: zaktualizowano config.guess w repozytorium nadrzędnym.

Michaił Malcew
źródło
Niesamowite, że GCC 6 się rozwija.
acgtyrant
OMG, więc unknownjest domyślnie zakodowane na stałe.
acgtyrant
4

To część produkcyjna konfiguracji / docelowego trypletu. Autobook mówi o tym:

manufacturer
   A somewhat freeform field which indicates the manufacturer of the system. This is often simply `unknown'. Other common strings are `pc' for an IBM PC compatible system, or the name of a workstation vendor, such as `sun'.

Podręcznik autoconf nazywa to company.

Nie jestem ekspertem w kompilacji z GCC, ale wygląda na to, że informacje podane w tym polu mają raczej charakter informacyjny i unknownsą tylko domyślną wartością, której używa GCC, chyba że zostaną wyraźnie nadpisane. Na przykład GCC na Ubuntu 12.04 używa x86_64-linux-gnuGCC Debiana 7 i486-linux-gnu, więc pozostawienie pola pustego jest całkowicie możliwe.

Wieland
źródło
To prawie wszystko. x86_64-linux-gnuOdmiany są cele SKRÓTU odstaniu x86_64-unknown-linux-gnulub x86_64-pc-linux-gnu. gcc -vpokazuje cel, dla którego został skompilowany, i config.subpodaje kanoniczną tryplet (poszukaj go w /usr/share/miscsystemach opartych na Debianie z autotools-devzainstalowanymi).
Stephen Kitt