Qual é a diferença das opções "./configure" "--build", "--host" e "--target"?

121

O script ./configureaceita 3 opções --build, --hoste --target. Estou confundindo os papéis deles. Qual a diferença e semântica deles?

eonil
fonte
As ferramentas automáticas usarão a cadeia de ferramentas errada para uma compilação cruzada, mesmo usando --hoste --build. Eu tenho dois projetos em C ++ e é impossível criar para o Android porque o Autotools está tão fodido. Ele insiste em executar testes usando a cadeia de ferramentas do host.
JWW

Respostas:

109

Conforme observado nesta postagem do blog e mencionado nos Termos de configuração do GCC , --targetsó se aplica quando você está compilando cadeias de ferramentas. Ao fazer uma compilação cruzada normal de uma biblioteca ou binário, você usa

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

No entanto, quando você está construindo toolchains, as coisas podem ficar mais complicado. Eu acho que o seguinte está correto (embora eu não possa dizer que já compilei manualmente um depurador cruzado):

Vamos dizer que você tem:

  • uma máquina de compilação powerpc na qual você fará toda a compilação
  • vários dispositivos incorporados, com processadores mips, nos quais seu código será executado
  • um laptop x86 que você usará para depurar esses dispositivos no campo

Você configuraria e construiria seu servidor de depuração (por exemplo, gdbserver) para executar no seu dispositivo incorporado com

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

para que você possa colar no dispositivo incorporado e executar "gdbserver: 1234 a.out" para iniciar a depuração e escutar na porta 1234.

Você criaria seu cliente de depuração (que se conecta e controla o gdbserver) com

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

que você copiava no seu laptop x86 para que, em campo, você pudesse executar "gdbclient embedded.device: 1234" para depurar o programa a.out.

Isso também se aplica aos compiladores para os quais você pode querer consultar o link do GCC acima ou esta seção sobre a compilação cruzada do Canadá .

Observe também que, na prática, talvez você não veja build, host ou destino especificado porque, de acordo com esta página de manual do Autoconf , "o padrão é o destino do host, o host a ser construído e o resultado do config.guess".

Em uma palavra, construa o código --build, execute-o --hostcom o --targetambiente de arquitetura.

user124850
fonte
11
Como descobrir o que colocar para "host" e "target"?
Preto
4
Eu acho que você está falando sobre a construção de um novo compilador, pois "--target" é relevante apenas para compiladores. * "host" é onde seu novo compilador deve ser executado. * "target" é onde os executáveis ​​produzidos pelo seu novo compilador devem ser executados.
user1735594
isso não faz disso uma resposta errada, porque --host = i686 não é válido aqui?
infoclogou 24/03
1
A resposta fornecida menciona que a compilação foi feita para o destino do MIPS e esta é a compilação, e o host é o depurador da máquina MIPS. Isso significa que o depurador / compilador também foi criado pelo powerpc? Este é um comentário que recebi de outro usuário (Ned): build = onde estou compilando o compilador, host = onde o compilador será executado, destino = qual código o compilador produzirá. Referência: stackoverflow.com/questions/7088576/…
supmethods
De acordo com Ned, isso não significa que o powerpc é o build / host, a máquina x86 um alvo do depurador e o alvo como sistema MIPS. Você pode explicar mais o que é "construir para" e "construir sobre"? Estou fazendo referência a gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods
75

Nota: O argumento --targetsó faz sentido ao criar o compilador (por exemplo, GCC). Ao executar configureantes de criar o GCC:

  • --build: a máquina em que você está construindo
  • --host: a máquina para a qual você está construindo
  • --target: a máquina que o GCC produzirá binário para

Na documentação do GCC ( notas de instalação específicas do host / destino ):

Se build, host e destino são todos iguais, isso é chamado de nativo. Se build e host forem iguais, mas o destino for diferente, isso será chamado de cruzamento. Se build, host e target são todos diferentes, isso é chamado de canadense (por motivos obscuros que lidam com o partido político do Canadá e o histórico da pessoa que trabalha na build naquele momento). Se o host e o destino forem iguais, mas a construção for diferente, você estará usando um compilador cruzado para criar um nativo para um sistema diferente. Algumas pessoas chamam isso de host-x-host, nativo cruzado ou nativo cruzado. Se build e target forem iguais, mas o host for diferente, você estará usando um compilador cruzado para criar um compilador cruzado que produz código para a máquina na qual está construindo. Isso é raro, portanto não há uma maneira comum de descrevê-lo. Existe uma proposta para chamar isso de crossback.

Delan Azabani
fonte
2
O que aparentemente significa que --targetnão é relevante para nenhum projeto que não seja um compilador. Então, por que é uma opção de configuração padrão? Confuso.
dhardy
1
@ Dhardy: configurenão é exatamente um pináculo do design bom e limpo; Eu acho que é apenas o resultado da fluência de recursos específicos de aplicativos.
Tim Čas
Se eu quiser obter um gcc, por exemplo, execute "./configure --build = powerpc --host = i686 --target = mips", o resultado da execução é prejudicado? geralmente, o gcc é uma ferramenta poderosa que pode criar código c e gerar muitos tipos de resultado para várias plataformas. Aqui, se eu usar '--target = mips', o gcc especificado perdeu a capacidade?
Gfan
O que também pode funcionar é atualizar os arquivos config.guess e config.sub, para que o compilador conheça mais plataformas de destino. Você pode obtê-los aqui: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi