Vindo do mundo de C e C ++, a maioria dos sistemas de compilação tem um install
alvo, principalmente Makefiles (onde é recomendado pelo GNU, por exemplo) ou CMake . Esse destino copia os arquivos de tempo de execução (executáveis, bibliotecas, ...) no sistema operacional (por exemplo, no C:\Program Files\
Windows).
Isso parece muito hacky, pois para mim não é responsabilidade do sistema de compilação instalar programas (que é realmente responsabilidade do sistema operacional / gerenciador de pacotes). Também significa que o sistema ou script de construção deve conhecer a organização dos programas instalados, com variáveis de ambiente, variáveis de registro, links simbólicos, permissões, etc.
Na melhor das hipóteses, os sistemas de compilação devem ter um release
destino que produza um programa instalável (por exemplo .deb
ou .msi
) e, em seguida, solicite ao sistema operacional que instale esse programa. Também permitiria ao usuário desinstalar sem precisar digitar make uninstall
.
Então, minha pergunta: por que o sistema de compilação geralmente recomenda ter um install
alvo?
fonte
make install
geralmente instala sob/usr/local
(ou mesmo/opt
) diretórios não tratados pelo "sistema principal de gerenciamento de SO / pacotes". Não faço ideia se o Windows tem alguma convenção semelhante.make install
não faz sentido quando falamos de compilação cruzadaDESTDIR
.Respostas:
Muitos scripts de construção ou Makefiles têm um destino de instalação porque foram criados antes da existência dos gerenciadores de pacotes e porque até hoje muitos sistemas não têm gerenciadores de pacotes. Além disso, existem sistemas onde
make install
realmente é a maneira preferida de gerenciar pacotes.fonte
make install
é preferido. Além disso, eu quis dizer gerente de programa quando disse que makefiles deveriam criar pacotes instaláveis. Eu acho que quase todos os sistemas operacionais vêm com uma maneira de gerenciar os programas instalados? Por exemplo, o Windows não tem gerenciador de pacotes (para além da loja), mas ainda tem uma forma de gerenciar os programas instalados (via.msi
pacotes para exemplos)make install
.checkinstall
maismake install
por duas razões: "Você pode remover facilmente o pacote com uma etapa." e "Você pode instalar o pacote resultante em várias máquinas". - como checkinstall constrói um .deb e instala-lo, ele usa o gerenciador de pacotes ...make install
checkinstall
chamada realmente usarámake install
e monitorará suas ações para a criação de pacotes.A
makefile
pode não ter uminstall
destino e, mais importante, você pode ter programas que nem deveriam ser instaláveis (por exemplo, porque eles devem ser executados a partir do diretório de compilação ou porque podem ser instalados em qualquer lugar). Oinstall
alvo é apenas uma convenção para o habitualmakefile
-s.No entanto, muitos programas exigem a execução de recursos externos (por exemplo: fontes, bancos de dados, arquivos de configuração etc.). E seus executáveis geralmente fazem algumas hipóteses sobre esses recursos. Por exemplo, seu
bash
shell geralmente lê alguns arquivos de inicialização de/etc/bash.bashrc
etc ... Esses recursos geralmente estão no sistema de arquivos (consulte hier (7) para convenções sobre a hierarquia de arquivos) e o caminho padrão do arquivo é construído em seu executável.Tente usar as strings (1) na maioria dos executáveis do seu sistema. Você descobrirá quais caminhos de arquivo são conhecidos por ele.
BTW, para muitos programas GNU usando
autoconf
, você pode executarmake install DESTDIR=/tmp/destdir/
sem ser root. Em seguida,/tmp/destdir/
é preenchido com os arquivos que devem ser empacotados posteriormente.FWIW, acredito que meu programa bismon (licenciado pela GPLv3 +) (descrito no meu relatório bismon-chariot-doc.pdf ) não pode ser "instalado"; Não tenho certeza se posso provar isso e não consigo imaginar como poderia tornar esse programa instalável.
fonte
/opt
ou no$HOME
. A única maneira de evitar prefixos diferentes é usar contêineres, mas é claro que é uma solução específica para Linux../configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install
e realocar o pacote para/opt/foo
sem problemas.Existem várias razões que vêm à mente.
$HOME
diretório Nem todos os gerenciadores de pacotes o suportam.fonte
Um motivo não mencionado é que muitas vezes você não está usando a versão atual do software ou uma versão modificada do software. Tentar criar um pacote personalizado não é apenas mais trabalho, mas pode entrar em conflito com os pacotes atualmente criados e distribuídos. No código-fonte aberto, isso acontece muito, especialmente se alterações recentes forem introduzidas em versões futuras que você estiver usando.
Digamos que você esteja usando o projeto de código aberto FOO, que está atualmente na versão 2.0.1 e você está usando a versão 1.3.0. Você não deseja usar nada acima disso porque a versão 2.0.0 é incompatível com o que você está fazendo no momento, mas há uma única correção de bug na versão 2.0.1 que você precisa desesperadamente. Tendo a
make install
opção, você pode instalar o software 1.3.0 modificado sem ter que se preocupar em criar um pacote e instalá-lo no seu sistema.fonte
As distribuições Linux geralmente separam a manutenção do programa da manutenção de pacotes. Um sistema de construção que integra a geração de pacotes forçaria os mantenedores do programa a também realizar a manutenção do pacote.
Isso geralmente é uma má ideia. As distribuições têm muita infraestrutura para verificar a consistência interna, fornecer binários para várias plataformas de destino, realizar pequenas alterações para melhor integrar-se ao restante do sistema e fornecer uma experiência consistente para os usuários que relatam bugs.
Para gerar pacotes diretamente de um sistema de construção, você teria que integrar ou ignorar toda essa infraestrutura. Integrá-lo seria muito trabalhoso para um benefício questionável, e ignorá-lo daria uma experiência pior ao usuário.
Esse é um dos problemas "principais da cadeia alimentar", típicos dos sistemas multipartidários. Se você possui vários sistemas complexos, é necessário haver uma hierarquia clara de qual sistema é responsável por coordenar todos os outros.
No caso do gerenciamento de instalação de software, o gerenciador de pacotes é esse componente e ele executa o sistema de compilação do pacote, em seguida conduz a saída por uma interface conveniente ("arquivos em um diretório após uma etapa de instalação"), gera um pacote e prepara para upload para um repositório.
O gerenciador de pacotes fica no meio entre o sistema de compilação e o repositório aqui, e está na melhor posição para integrar-se bem a ambos.
Você deve ter notado que existem apenas alguns pacotes JavaScript disponíveis por
npm
meio delesapt
- principalmente porque o pessoal do JavaScript decidiu issonpm
e o repositório associado seria o topo de sua cadeia alimentar, o que tornava quase impossível enviar esses pacotes como pacotes Debian.Com meu chapéu de desenvolvedor Debian ativado: se você lançar um software de código aberto, deixe a embalagem para os mantenedores da distribuição. Isso poupa muito trabalho a você e a nós.
fonte
Bem, os desenvolvedores de aplicativos são os que sabem onde cada arquivo deve ir. Eles podem deixar isso na documentação e fazer com que os mantenedores do pacote leiam isso e criem um script para cada pacote. Talvez os mantenedores de pacotes interpretem mal a documentação e precisem depurar o script até que funcione. Isso é ineficiente. É melhor para o desenvolvedor do aplicativo escrever um script para instalar corretamente o aplicativo que ele escreveu.
Ele poderia escrever um script de instalação com um nome arbitrário ou talvez fazer parte do procedimento de outro script. No entanto, com um comando de instalação padrão
make install
(uma convenção anterior aos gerenciadores de pacotes), ficou muito fácil criar pacotes. Se você observar o modelo PKGBUILD para criar pacotes do Archlinux , poderá ver que a função que realmente empacota simplesmente executa ummake DESTDIR="$pkgdir/" install
. Isso provavelmente funciona para a maioria dos pacotes e provavelmente mais com uma pequena modificação. Graças amake
(e as ferramentas automáticas) ser padrão, a embalagem é muito, muito fácil.fonte