Efeito da compilação a partir da fonte em aplicativos já instalados

8

Eu uso o Ubuntu 12.04. Digamos que eu instalei a package xpartir do repositório (com todas as suas dependências) na versão 1.7, mas preciso de algumas funcionalidades que só estão disponíveis na versão 1.8; portanto, faço o download do tar de origem e o compilo:

./configure  
make  
make install
  • Isso substitui os binários 1.7 existentes?
  • Se os binários existentes forem substituídos, o gerenciador de pacotes reflete a nova versão (1.8) e pode package xser atualizado pelo gerente de pacotes no futuro?
  • Se package ytiver uma dependência de package x 1.8- será satisfeito?

Eu tenho tentado encontrar uma boa fonte online que explica isso. Se você tiver alguma recomendação, entre em contato.

Philip D'Rozario
fonte
Se você deliberadamente contornar o gerenciador de pacotes, o que diabos faz você pensar que ele posteriormente reconhecerá o que você instalou?
Shadur 30/08/12
@Shadur Esse aspecto dessa pergunta se resume basicamente à questão do que acontece, exatamente quando você instala o software da fonte usando make install. Acho que, pelas respostas, fica claro que, basicamente, tudo o que está acontecendo é que os arquivos são copiados para os diretórios dentro do prefixo de instalação (embora isso aconteça com a possibilidade de que alguns arquivos de configuração possam ser inseridos /etce alguns dados dinamicamente alteráveis, representando uma inicial estado de algo pode ser colocado /var). No entanto, se você achar que isso não está claro, ficarei feliz em editar minha resposta para explicar.
Eliah Kagan
@EliahKagan Eu estava sendo retórico principalmente para Philip, lá.
Shadur 30/08/12

Respostas:

12

A grande maioria dos .debpacotes, fornecidos ou não por repositórios oficiais, é instalada com o prefixo /usr.

O que isso significa é que os executáveis ​​que devem ser executados pelo usuário entram /usr/binou /usr/sbin(ou /usr/gamesse é um jogo), as bibliotecas compartilhadas entram /usr/lib, os dados compartilhados independentes da plataforma entram /usr/share, os arquivos de cabeçalho entram /usr/includee o código fonte instalado entra automaticamente /usr/src.

Uma pequena porcentagem de pacotes usa /como prefixo. Por exemplo, o bashpacote coloca o bashexecutável em /bin, não /usr/bin. Isso é para pacotes que fornecem o essencial para executar no modo de usuário único (como o modo de recuperação) e iniciar o modo de usuário múltiplo (mas lembre-se, isso geralmente inclui funcionalidade para montar alguns tipos de compartilhamentos de rede ... caso /usrseja um sistema de arquivos remoto).

Uma pequena porcentagem de .debpacotes, principalmente aqueles criados com o Quickly , cria uma pasta específica do pacote /opte coloca todos os seus arquivos lá. Fora isso, na maioria das vezes /opté o local usado pelo software instalado a partir de um instalador executável que não usa o gerenciador de pacotes do sistema, mas não envolve a compilação a partir do código-fonte. (Por exemplo, se você instalar um programa proprietário como o MATLAB, provavelmente o incluirá /opt.)

Ao contrário de tudo isso, quando você baixa um arquivo fonte (ou obtém o código fonte de um sistema de controle de revisão como o Bazaar ou o git), constrói e instala, ele geralmente é instalado no prefixo /usr/local(a menos que você o solicite) de outra forma). Isso significa que seus executáveis ir /usr/local/bin, /usr/local/libou /usr/local/games, suas bibliotecas /usr/local/lib, e assim por diante.

Existem algumas exceções - alguns programas, por padrão, são instalados no /usrprefixo e, portanto, substituem as instalações dos mesmos programas nos .debpacotes. Normalmente, você pode evitar isso executando, em ./configure --prefix=/usr/localvez de ./configurequando criá-los. Mais uma vez enfatizo que geralmente isso não é necessário.

(É por esse motivo que faz muito sentido colocar o código-fonte que você está construindo e instalará para uso em todo o sistema /usr/local/src, o que existe para esse fim.)

Supondo que a versão empacotada esteja instalada /usre a versão que você instalou da fonte esteja em /usr/local:

  • Os arquivos do pacote instalado não serão substituídos.

    Normalmente, a versão mais recente será executada quando você invocar o programa manualmente a partir da linha de comando (supondo que /usr/local/binou onde os executáveis ​​estejam instalados esteja em sua PATHvariável de ambiente e apareça antes do /usrdiretório com prefixo correspondente , como /usr/bin).

    Mas pode haver alguns problemas com o que os lançadores são criados e disponibilizados através de menus ou pesquisa. Além disso, se você instalou mais de uma versão de uma biblioteca em locais diferentes, pode ser um pouco mais complicado determinar qual será usado por qual software.

    Se você não está realmente usando as duas versões do programa ou da biblioteca, geralmente deve remover a que não está usando, embora em situações limitadas você queira manter um pacote instalado para satisfazer as dependências.

No entanto, se por algum motivo os arquivos forem substituídos (por exemplo, se o código-fonte estiver instalado em /usrvez de /usr/local):

  • O gerenciador de pacotes não saberá nada sobre como o software instalado foi alterado. Ele pensará que a versão antiga está instalada. Problemas ruins podem resultar. Você deve evitar isso. Se você criou essa situação, desinstale o software que instalou da origem (geralmente sudo make uninstallno diretório) e desinstale o pacote ou pacotes que fornecem os arquivos que foram substituídos (pois eles não serão restaurados com a desinstalação da versão instalada da fonte). Em seguida, reinstale a versão que você deseja ter./usr/local/src/program-or-library-name

Quanto ao cumprimento de dependências:

  • Se houver um .debpacote que dependa do software que você instalou da fonte e exija a versão que você instalou da fonte (ou superior), esse pacote não será instalado com êxito. (Ou, para ser mais preciso, você poderá "instalá-lo", mas ele nunca será "configurado" para não poder usá-lo.) Dependências são resolvidas de acordo com as versões dos pacotes instaladas, e não qual software você realmente tem.

    Da mesma forma, pelo menos o software tentará instalar completamente, mesmo se você tiver excluído manualmente os arquivos fornecidos pelos pacotes dos quais o software que está sendo instalado depende. (Geralmente, você não deve tentar aproveitar isso para qualquer finalidade. O gerenciador de pacotes que opera com base em informações falsas é quase sempre uma coisa ruim.)

Portanto, se você não conseguir encontrar um pacote que forneça a versão do software necessária, poderá ser necessário criar seu próprio .debpacote a partir do software compilado e instalar a partir desse pacote. Então, o gerenciador de pacotes saberá o que está acontecendo. Criar um pacote para seu próprio uso, que você não precisa funcionar bem nos computadores de outras pessoas, na verdade não é muito difícil. (Mas acho que isso pode estar fora do escopo da sua pergunta, como está atualmente redigida.)

Eliah Kagan
fonte
Obrigado pela sua resposta detalhada, isso deixou muitos conceitos claros.
Philip D'Rozario
5

O que você instala a partir do centro de software ou com um comando APT ( apt-get, aptitude) ou com dpkgé conhecido pelo sistema de gerenciamento de pacotes. dpkgé a ferramenta de manipulação de pacotes de baixo nível, o APT e os amigos são ferramentas de nível superior que invocam dpkgpara executar a instalação real e também manipulam dependências e downloads de pacotes.

Se você compilar um programa a partir da fonte, ele não será conhecido pelo gerenciador de pacotes. A convenção no Linux, que você deve seguir com a dificuldade de acompanhar as coisas e substituir suas instalações, é:

  • /bin, /lib, /sbin, /usrEstão reservados para o gerenciador de pacotes;
  • exceto que /usr/localé para o administrador do sistema - respeite a hierarquia de diretórios lá, mas você está sozinho para gerenciar arquivos.

Veja a melhor maneira de atualizar o vim / gvim para 7.3 no Ubuntu 10.04? para obter uma lista de maneiras de obter versões mais recentes do software. A maneira mais fácil é obter um PPA , se houver. Se você obtiver um pacote binário ou compilar da fonte, recomendo o uso do stow para gerenciar o software instalado manualmente. Como alternativa, crie seu próprio .debpacote - é mais trabalhoso, mas vale a pena se você atualizar com freqüência (geralmente refazer o pacote para a próxima versão menor é muito rápido) ou se você implantar em muitas máquinas executando a mesma distribuição.

Na maioria dos programas, se você executar ./configure && make && sudo make install, o programa é instalado em /usr/local. Verifique a documentação fornecida com a fonte (normalmente em um arquivo chamado READMEou INSTALL) ou execute ./configure --helppara verificar se esse é o caso. Se o programa estiver instalado /usr/local, ele não interferirá na versão fornecida pelo gerenciador de pacotes. /usr/local/binvem em primeiro lugar no sistema PATH. Observe que você precisará executar make installcomo administrador (root); não compile como raiz. Como observado acima, eu recomendo usar o stow em vez de instalar diretamente no /usr/local.

Gilles 'SO- parar de ser mau'
fonte
1

Isso depende do pacote e de muitas outras coisas

  1. convenções de nomenclatura usadas - o binário contém números de versão nos nomes dos arquivos
  2. local de instalação - é por padrão em opt, mas a versão empacotada está em / usr
  3. muito mais possibilidades

Para encurtar a história:
não há resposta genérica. É altamente dependente do pacote. Você deve usar PPAs +1 oficiais, se possível, em vez de compilar a partir da fonte.

RobotHumans
fonte
1
Na verdade, é bastante incomum instalar programas ou bibliotecas compiladas a partir da fonte /opt. /usr/localé o prefixo padrão e even /usré um prefixo padrão mais comum que /opt. /opté mais comumente usado para software que é instalado dentro de um diretório dedicado nomeado para o aplicativo específico (por exemplo, um aplicativo chamado Foo pode ser instalado com todos os seus arquivos /opt/foo).
Eliah Kagan