Por que o gcc show `unknown` no Target: x86_64-unknown-linux-gnu no Arch Linux?

12

Gostaria de saber por que, quando executo o gcc -vArch Linux, ele mostra a unknownpalavra nessas saídas:

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

enquanto em outra distro, como o ubuntu, ele mostra o nome da distro, como 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
fonte
De onde você instalou este gcc?
Faheem Mitha
gccforam instalados com os corepacotes quando eu estava instalando o Arch.
Noslin005 30/05
Está bem. Talvez verifique as instruções de compilação para esse pacote, então?
Faheem Mitha

Respostas:

8

Como já foi mencionado no comentário, por padrão, o trio de destino é gerado pelo script config.guess . É lógica é bastante simples. Primeiro, ele usa unamepara obter algumas informações básicas do sistema:

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

Essas cadeias são combinadas e comparadas com padrões codificados. O resultado também é codificado:

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

Para alguns sistemas, é possível obter resultados mais significativos, como a IBM, em "rs6000-ibm-aix".

Os mantenedores de distribuição simplesmente substituem essa sequência por sua própria (também codificada):

$ 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

O GCC 6 provavelmente produzirá x86_64-pc-linux-gnu por padrão: config.guess atualizado no repositório upstream.

Mikhail Maltsev
fonte
Incrível que o GCC 6 esteja em desenvolvimento.
acgtyrant
OMG, então unknowné codificado por padrão.
acgtyrant
4

Essa é a parte do fabricante do tripleto de configuração / alvo. O Autobook diz sobre isso:

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'.

O manual do autoconf chama assim company.

Não sou especialista em compilação com o GCC, mas parece que as informações fornecidas por esse campo são de natureza informativa e unknownsão apenas o valor padrão que o GCC usa, a menos que seja explicitamente substituído. O GCC no Ubuntu 12.04, por exemplo x86_64-linux-gnu, usa o Debian 7s GCC i486-linux-gnu, portanto é totalmente possível deixar o campo em branco.

Wieland
fonte
É isso mesmo. A x86_64-linux-gnuvariedade são alvos de atalho, representando x86_64-unknown-linux-gnuou x86_64-pc-linux-gnu. gcc -vmostra o alvo para o qual foi compilado e config.subfornece o trigêmeo canônico (procure-o em /usr/share/miscsistemas derivados do Debian com o autotools-devinstalado).
Stephen Kitt