Por que sempre ./configure; faço; make install; como 3 etapas separadas?

118

Cada vez que você compila algo da fonte, você segue as mesmas 3 etapas:

$ ./configure
$ make
$ make install

Eu entendo que faz sentido dividir o processo de instalação em etapas diferentes, mas não entendo por que cada programador neste planeta tem que escrever os mesmos três comandos repetidamente apenas para realizar um único trabalho. Do meu ponto de vista, faria todo o sentido ter um ./install.shscript entregue automaticamente com o código-fonte que contém o seguinte texto:

#!/bin/sh
./configure
make
make install

por que as pessoas fariam as 3 etapas separadamente?

erikbwork
fonte
2
Se o sistema de compilação estiver escrito corretamente - e geralmente é - você pode omitir a segunda etapa.
reinierpost de
Sua pergunta não é estúpida. Você pode construir seu programa no ambiente Linux e depois disso você pode usar por algum aplicativo de virtualização ou você pode construir diretamente no ambiente Windows usando o mingw.
Mihai8

Respostas:

121

Porque cada etapa faz coisas diferentes

Prepare (configure) o ambiente para a construção

./configure

Este script possui muitas opções que você deve alterar. Gostar --prefixou --with-dir=/foo. Isso significa que cada sistema possui uma configuração diferente. Também ./configureverifica se há bibliotecas ausentes que devem ser instaladas. Qualquer coisa errada aqui faz com que não construa seu aplicativo . É por isso que as distros têm pacotes que são instalados em locais diferentes, porque toda distro pensa que é melhor instalar certas bibliotecas e arquivos em certos diretórios. Diz-se que corre./configure , mas na verdade você deve alterá-lo sempre.

Por exemplo, dê uma olhada no site de pacotes do Arch Linux . Aqui você verá que qualquer pacote usa um parâmetro de configuração diferente (suponha que eles estejam usando autotools para o sistema de compilação).

Construindo o sistema

make

Isso é na verdade make all por padrão. E cada marca tem diferentes ações a realizar. Alguns fazem a construção, alguns fazem testes após a construção, alguns fazem check-out de repositórios SCM externos. Normalmente você não precisa fornecer nenhum parâmetro, mas, novamente, alguns pacotes os executam de maneira diferente.

Instale no sistema

make install

Isso instala o pacote no local especificado com configure. Se desejar, você pode especificar ./configurepara apontar para seu diretório inicial. No entanto, muitas opções de configuração estão apontando para /usrou /usr/local. Isso significa que você terá que usar de fato sudo make installporque apenas o root pode copiar arquivos para / usr e / usr / local.


Agora você vê que cada etapa é um pré-requisito para a próxima etapa. Cada etapa é uma preparação para fazer as coisas funcionarem em um fluxo sem problemas. As distros usam essa metáfora para construir pacotes (como RPM, deb, etc.).

Aqui você verá que cada etapa é, na verdade, um estado diferente. É por isso que os gerenciadores de pacotes têm wrappers diferentes. Abaixo está um exemplo de um invólucro que permite construir todo o pacote em uma etapa. Mas lembre-se de que cada aplicativo tem um wrapper diferente (na verdade, esses wrappers têm um nome como spec, PKGBUILD, etc.):

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

Aqui pode-se usar autotools, ou seja ./configure, makee make install. Mas outro pode usar SCons, configuração relacionada ao Python ou algo diferente.

Como você pode ver, a divisão de cada estado torna as coisas muito mais fáceis de manutenção e implantação, especialmente para mantenedores de pacotes e distribuições.

Fatih Arslan
fonte
23
Lendo isso novamente, cerca de um ano depois, tenho que acrescentar que tudo faz sentido e ainda pode haver uma única chamada de comando que executa todas as 3 etapas com sua configuração padrão. Todos eles têm uma configuração padrão, caso contrário, você não poderia simplesmente chamá-los sem argumentos.
erikbwork
Às vezes posso fazer a instalação sem fazer. O que isto significa? Se eu pular o make, posso apenas fazer make install?
CMCDragonkai
3
installdepende de, allportanto make install, ligareimake all
excelente resposta, no entanto, não entendo por que às vezes um make install é necessário e outras vezes não (um único make, faz toda a mágica)
HanniBaL90
make installbasta instalar vários recursos em um local pré-definido. Se você se preocupa apenas com o arquivo executável, pode usar o arquivo executável do diretório de compilação e adicionar o diretório de compilação ao seu PATH.
jdhao
31

Primeiro, deve ser, ./configure && make && make installjá que cada um depende do sucesso do primeiro. Parte do motivo é a evolução e parte do motivo é a conveniência para o fluxo de trabalho de desenvolvimento.

Originalmente, a maioria dos Makefiles conteria apenas os comandos para compilar um programa e a instalação era deixada para o usuário. Uma regra extra permitemake install colocar a saída compilada em um local que possa ser correto; ainda existem muitos bons motivos pelos quais você pode não querer fazer isso, incluindo não ser o administrador do sistema, nem querer instalá-lo. Além disso, se estou desenvolvendo o software, provavelmente não quero instalá-lo. Quero fazer algumas alterações e testar a versão que está em meu diretório. Isso se torna ainda mais evidente se eu tiver várias versões por aí.

./configurevai e detecta o que está disponível no ambiente e / ou é desejado pelo usuário para determinar como construir o software. Isso não é algo que precise mudar com muita frequência e pode levar algum tempo. Novamente, se eu sou um desenvolvedor, não vale a pena reconfigurar constantemente. Mais importante, uma vez que makeusa timestamps para reconstruir módulos, se eu executar novamente, configurehá uma possibilidade de que os sinalizadores mudem e agora alguns dos componentes em minha construção serão compilados com um conjunto de sinalizadores e outros com um conjunto diferente de sinalizadores que podem levar a comportamento diferente e incompatível. Contanto que eu não execute novamente configure, eu sei que meu ambiente de compilação permanece o mesmo, mesmo se eu mudar minhas fontes. Se eu repetir configure, eu deveriamake clean primeiro, para remover quaisquer fontes criadas para garantir que as coisas sejam criadas de maneira uniforme.

O único caso onde os três comandos são executados em uma linha é quando os usuários instalam o programa ou um pacote é compilado (por exemplo, debuild do Debian ou rpmbuild do RedHat). E isso pressupõe que o pacote pode receber um simplesconfigure , o que normalmente não é o caso da embalagem, onde, pelo menos, --prefix=/usré desejado. E os pacakgers precisam lidar com raízes falsas ao fazer o make installpapel. Como há muitas exceções, fazer ./configure && make && make installa regra seria inconveniente para muitas pessoas que o fazem com muito mais frequência!

Apmasell
fonte
2
Obrigado pelo conselho com o &&!
erikbwork
4

Em primeiro lugar, ./configure nem sempre encontra tudo o que precisa ou, em outros casos, encontra tudo o que precisa, mas nem tudo que poderia usar. Nesse caso, você gostaria de saber sobre isso (e seu script ./install.sh iria falhar de qualquer maneira!) O exemplo clássico de não falha com consequências indesejadas, do meu ponto de vista, é compilar grandes aplicativos como ffmpeg ou mplayer. Eles usarão bibliotecas se estiverem disponíveis, mas serão compilados de qualquer maneira se não estiverem, deixando algumas opções desabilitadas. O problema é que você descobre mais tarde que ele foi compilado sem suporte para um formato ou outro, sendo necessário voltar atrás e refazê-lo.

Outra coisa que ./configure faz de forma interativa é dar a você a opção de personalizar onde o aplicativo será instalado no sistema. Distribuições / ambientes diferentes têm convenções diferentes, e você provavelmente gostaria de seguir a convenção em seu sistema. Além disso, você pode querer instalá-lo localmente (somente para você). Tradicionalmente, os passos ./configure e make não são executados como root, enquanto make install (a menos que seja instalado exclusivamente para você) deve ser executado como root.

Distribuições específicas geralmente fornecem scripts que executam esta funcionalidade ./install.sh de uma maneira sensível à distribuição - por exemplo, RPMs de origem + arquivo de especificações + rpmbuild ou slackbuilds .

(Nota de rodapé: dito isso, concordo que ./configure; make; make install; pode ser extremamente tedioso.)

Soz
fonte
Tudo compreensível, mas na minha opinião nenhuma dessas possibilidades é destruída se você tiver um arquivo adicional que combine as três etapas. Por exemplo, se você quiser ler algum do stdout de configuração, você ainda pode fazer um grep por ele ou colocar todo o stdout em um arquivo e lê-lo depois.
erikbwork de
3
Verdade, mas então, por que um arquivo é necessário? Basta usar um apelido (embora você tenha que pensar em um nome melhor / mais curto do que 'confmakeins', não estou inspirado hoje!). alias confmakeins = '. / configure && make && sudo make install'; diretório de origem do cd; confmakeins;
Soz
Parece bom. Eu nunca escrevi um pseudônimo, então não pensei sobre isso!
erikbwork de
3

configure pode falhar se descobrir que faltam dependências.

makeexecuta um destino padrão, o primeiro listado no Makefile. Muitas vezes, esse alvo é all, mas nem sempre. Então você só poderia make all installse soubesse que esse era o alvo.

Assim ...

#!/bin/sh

if ./configure $*; then
  if make; then
    make install
  fi
fi

ou:

./configure $* && ./make && ./make install

O $*está incluído porque muitas vezes é necessário fornecer opções paraconfigure .

Mas por que não deixar que as pessoas façam isso sozinhas? Esta é realmente uma grande vitória?

ghoti
fonte
1
Não é mortalmente importante, mas é o que nós, programadores, fazemos: fazer com que o computador execute as tarefas repetitivas para nós. Certo?
erikbwork de
1
Bem ... configurefaz parte do kit de ferramentas GNU Automake, que é uma espécie de add-on para o Make. O Make existe há muitos, muitos anos, e faz bem o seu trabalho. Dito isso, as pessoas descobriram outras maneiras de lidar com o processo de fabricação. Ant e cmake têm seus seguidores. Mas as partes do processo de construção (como configuração, construção e instalação) ainda são comandos separados.
ghoti