Breve: Este guia detalhado explica como instalar um programa a partir do código fonte no Linux e como remover o software instalado a partir do código-fonte.
uma das maiores forças da sua distribuição Linux é o seu gestor de pacotes e o repositório de software associado. Com eles, você tem todas as ferramentas e recursos necessários para baixar e instalar novo software em seu computador de uma forma completamente automatizada.
mas apesar de todos os seus esforços, os mantenedores do pacote não podem lidar com cada caso de uso. Nem podem embalar todo o software disponível lá fora. Então, ainda existem situações em que você terá que compilar e instalar um novo software por si mesmo. Quanto a mim, a razão mais comum, de longe, eu tenho que compilar algum software é quando eu preciso executar uma versão muito específica, ou modificar o código fonte pelo uso de algumas opções de compilação extravagantes.se as suas necessidades pertencem a esta última categoria, é provável que já saiba o que fazer. Mas, para a grande maioria dos usuários de Linux, compilar e instalar o software a partir do código-fonte, pela primeira vez, pode parecer uma cerimônia de iniciação: um pouco assustadora, mas com a promessa de entrar em um novo mundo de possibilidades e um lugar de prestígio na privilegiada comunidade.
- a. Instalar software a partir do código fonte no Linux
- Passo 1: Obter o código fonte no GitHub
- Passo 2: noções básicas sobre o Sistema de Compilação do programa
- Passo 3: O FHS
- B. o Que se as coisas correrem mal durante a instalação a partir do código fonte?
- do Debian 9.0 “Stretch”
- de CentOS 7.0
- C. fazendo alterações ao software instalado a partir do código-fonte
- D. deixe a shell localizar o nosso software de compilação personalizado
- Adicionar um link de /usr/local/bin
- a Modificar o CAMINHO
- E. Como remover essa recém-instalado o software a partir do código fonte
- espere? Onde estava o inferno da dependência?
a. Instalar software a partir do código fonte no Linux
e é exatamente isso que faremos aqui. Para o propósito deste artigo, digamos que eu preciso instalar NodeJS 8.1.1 no meu sistema. Exactamente essa versão. Uma versão que não está disponível no repositório Debian:
sh$ apt-cache madison nodejs | grep amd64 nodejs | 6.11.1~dfsg-1 | http://deb.debian.org/debian experimental/main amd64 Packages nodejs | 4.8.2~dfsg-1 | http://ftp.fr.debian.org/debian stretch/main amd64 Packages nodejs | 4.8.2~dfsg-1~bpo8+1 | http://ftp.fr.debian.org/debian jessie-backports/main amd64 Packages nodejs | 0.10.29~dfsg-2 | http://ftp.fr.debian.org/debian jessie/main amd64 Packages nodejs | 0.10.29~dfsg-1~bpo70+1 | http://ftp.fr.debian.org/debian wheezy-backports/main amd64 Packages
Agora, instalar NodeJs no Ubuntu ou Debian é bastante simples se você o fizer com o Gestor de pacotes. Mas vamos fazê-lo através do código fonte.
Passo 1: Obter o código fonte no GitHub
Como muitos projetos de código aberto, as fontes de NodeJS pode ser encontrado no GitHub: https://github.com/nodejs/node
Então, vamos ir diretamente para lá.
Se você não está familiarizado com o GitHub, git ou qualquer outro sistema de controle de versão que vale a pena mencionar o repositório contém a fonte de corrente para o software, bem como um histórico de todas as modificações feitas ao longo dos anos para que o software. Eventualmente até a primeira linha escrita para esse projeto. Para os desenvolvedores, manter essa história tem muitas vantagens. Para nós, hoje, o principal é que seremos capazes de obter as fontes para o projeto como eles foram em qualquer momento. Mais precisamente, eu serei capaz de obter as fontes como eram quando a Versão 8.1.1 que eu quero foi lançado. Mesmo que houvesse muitas modificações desde então.
No GitHub, você pode usar o “ramo” botão para navegar entre diferentes versões do software. “Branch” e “tags” são conceitos relacionados no Git. Basicamente, os desenvolvedores criam “branch” e “tags” para manter o controle de eventos importantes no histórico do projeto, como quando eles começam a trabalhar em um novo recurso ou quando eles publicam um lançamento. Eu não vou entrar em detalhes aqui, tudo o que você precisa saber é que eu estou procurando a versão com a tag “v8.1.1”
Depois de ter escolhido o “v8.1.1 ” tag, a página é refrescada, a mudança mais óbvia sendo a tag agora aparece como parte da URL. Além disso, você vai notar que a data de mudança de arquivo são diferentes também. A árvore fonte que você está vendo agora é a que existia no momento em que a marca v8.1.1 foi criada. Em algum sentido, você pode pensar em uma ferramenta de controle de versão como o git como uma máquina de viagens no tempo, permitindo que você vá e volte para um histórico de projeto.
neste ponto, podemos baixar os fontes do NodeJS 8.1.1. Você não pode perder o grande botão azul sugerindo para baixar o arquivo ZIP do projeto. Quanto a mim, eu vou baixar e extrair o ZIP da linha de comando para o bem da explicação. Mas se preferir usar uma ferramenta GUI, não hesite em fazer isso em vez disso:
wget https://github.com/nodejs/node/archive/v8.1.1.zipunzip v8.1.1.zipcd node-8.1.1/
baixar o arquivo ZIP funciona muito bem. Mas se você quiser fazer isso” como um pro”, eu sugeriria usar diretamente a ferramenta git
para baixar o código. Não é complicado de todo— e será um bom primeiro contato com uma ferramenta que você vai encontrar muitas vezes:
# first ensure git is installed on your systemsh$ sudo apt-get install git# Make a shallow clone the NodeJS repository at v8.1.1sh$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/nodesh$ cd node/
a propósito, Se você tem um problema, basta considerar a primeira parte deste artigo como uma introdução geral. Mais tarde, Tenho explicações mais detalhadas para distribuições baseadas no Debian e no RedHat, a fim de ajudá – lo a resolver problemas comuns.
de qualquer maneira, sempre que você tiver baixado o código fonte usando o git
ou como um arquivo ZIP, você agora deve ter exatamente a mesma fonte de arquivos no diretório atual:
sh$ lsandroid-configure BUILDING.md common.gypi doc Makefile srcAUTHORS CHANGELOG.md configure GOVERNANCE.md node.gyp testbenchmark CODE_OF_CONDUCT.md CONTRIBUTING.md lib node.gypi toolsBSDmakefile COLLABORATOR_GUIDE.md deps LICENSE README.md vcbuild.bat
Passo 2: noções básicas sobre o Sistema de Compilação do programa
costumamos falar sobre a “compilação das fontes”, mas a compilação é apenas uma das etapas necessárias para produzir um trabalho de software a partir de sua origem. Um sistema de compilação é um conjunto de ferramentas e práticas usadas para automatizar e articular essas diferentes tarefas, a fim de construir inteiramente o software apenas emitindo poucos comandos.se o conceito é simples, a realidade é um pouco mais complicada. Porque diferentes projetos ou linguagem de programação podem ter requisitos diferentes. Ou por causa do gosto do programador. Ou as plataformas suportadas. Ou por razões históricas. Ou … ou.. há uma lista quase interminável de razões para escolher ou criar outro sistema de construção. Tudo isso para dizer que há muitas soluções diferentes usadas lá fora.
NodeJS usa um sistema de compilação em estilo GNU, é uma escolha popular na comunidade de código aberto e, mais uma vez, uma boa maneira de iniciar sua jornada.
escrever e sintonizar um sistema de compilação é uma tarefa bastante complexa, mas para o “utilizador final”, os sistemas de compilação do estilo GNU facilitam a tarefa usando duas ferramentas: configure
e make
.
o configure
ficheiro é um programa específico do projecto que irá verificar a configuração do sistema de destino e a funcionalidade disponível, a fim de garantir que o projecto pode ser construído, eventualmente lidando com as especificidades da plataforma actual.
uma parte importante de um id típicoconfigure
job é construir oMakefile
. Esse é o arquivo que contém as instruções necessárias para construir efetivamente o projeto.
a ferramenta make
por outro lado, é uma ferramenta POSIX disponível em qualquer sistema semelhante ao Unix. Ele irá ler o projeto específico Makefile
e executar as operações necessárias para construir e instalar o seu programa.
mas, como sempre no mundo Linux, você ainda tem alguma clemência em Personalizar a construção de acordo com suas necessidades específicas.
./configure --help
The configure -help
command will show you all the available configuration options. Mais uma vez, trata-se de um projecto muito específico. E para ser honesto, às vezes é necessário escavar no projeto antes de compreender completamente o Significado de cada opção de configuração.
mas há pelo menos uma opção padrão GNU Autotools que você deve saber: a opção --prefix
. Isto tem a ver com a hierarquia do sistema de arquivos e o lugar onde o seu software será instalado.
Passo 3: O FHS
O sistema de arquivos Linux hierarquia em uma distribuição normal, principalmente conformidade com o Filesystem Hierarchy Standard (FHS)
Essa norma explica a finalidade dos diversos diretórios de seu sistema: /usr
/tmp
/var
e assim por diante.
ao usar o GNU Autotools— e a maioria dos outros sistemas de compilação-a localização predefinida para a instalação do seu novo software será /usr/local
. Qual é uma boa escolha, pois de acordo com a FSH “a hierarquia /usr/local é para ser usada pelo administrador do sistema ao instalar o software localmente? Ele precisa ser seguro de ser substituído quando o software do sistema é atualizado. Ele pode ser usado para programas e dados que são compartilháveis entre um grupo de hosts, mas não encontrados em /usr.”
/usr/local
hierarquia, de alguma forma, replica o diretório raiz, e você vai encontrar lá /usr/local/bin
para os programas executáveis, /usr/local/lib
para as bibliotecas, /usr/local/share
para ficheiros independentes da arquitectura e assim por diante.
a única questão ao usar o /usr/local
árvore para instalação de software personalizado é que os arquivos para todo o seu software serão misturados lá. Especialmente, depois de ter instalado um par de software, vai ser difícil controlar a qual arquivo exatamente de /usr/local/bin
e /usr/local/lib
pertence a qual o software. No entanto, isso não irá causar qualquer problema ao sistema. Afinal, /usr/bin
é praticamente a mesma confusão. Mas isso se tornará um problema no dia em que você vai querer remover um software instalado manualmente.
para resolver esse problema, eu geralmente prefiro instalar software personalizado na sub-árvore /opt
. Mais uma vez, para citar o FHS:
_ ” / opt está reservado para a instalação de pacotes de software para aplicações adicionais.
Um pacote para ser instalado em /opt deve localizar seus arquivos estáticos em separado para /opt/<o pacote> ou /opt/<fornecedor> árvore de diretório, onde <o pacote> é um nome que descreve o pacote de software e <fornecedor> é o provedor de LANANA nome registrado.”_
assim nós criaremos um sub-diretório de /opt
especificamente para a nossa instalação NodeJS personalizada. E se um dia eu quiser remover o software, simplesmente vou ter que remover o diretório:
sh$ sudo mkdir /opt/node-v8.1.1sh$ sudo ln -sT node-v8.1.1 /opt/node# What is the purpose of the symbolic link above?# Read the article till the end--then try to answer that# question in the comment section!sh$ ./configure --prefix=/opt/node-v8.1.1sh$ make -j9 && echo ok# -j9 means run up to 9 parallel tasks to build the software.# As a rule of thumb, use -j(N+1) where N is the number of cores# of your system. That will maximize the CPU usage (one task per# CPU thread/core + a provision of one extra task when a process# is blocked by an I/O operation.
Qualquer coisa, mas “ok” depois de make
comando foi concluído significaria houve um erro durante o processo de compilação. Como fizemos uma compilação paralela por causa da opção -j
, nem sempre é fácil recuperar a mensagem de erro dado o grande volume de saída produzido pelo sistema de compilação.
no caso de um problema, basta reiniciar make
, mas sem a opção -j
desta vez. E o erro deve aparecer perto do final da saída:
sh$ make
Finalmente, uma vez que a compilação foi para a final, você pode instalar o software para a sua localização com o seguinte comando:
sh$ sudo make install
E testá-lo:
sh$ /opt/node/bin/node --versionv8.1.1
B. o Que se as coisas correrem mal durante a instalação a partir do código fonte?
o que eu expliquei acima é principalmente o que você pode ver na página “instruções de construção” de um projeto bem documentado. Mas dado este objetivo do artigo é permitir que você compile seu primeiro software a partir de fontes, pode valer a pena tomar o tempo para investigar algumas questões comuns. Então, eu vou fazer todo o procedimento novamente, mas desta vez a partir de um novo e mínimo Sistema Debian 9.0 e CentOS 7.0 para que você possa ver os erros que eu encontrei e como eu os resolvi.
do Debian 9.0 “Stretch”
:~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
este problema é muito fácil de diagnosticar e resolver. Basta instalar o git
embalagem:
:~$ sudo apt-get install git
:~$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node && echo okok
:~/node$ sudo mkdir /opt/node-v8.1.1:~/node$ sudo ln -sT node-v8.1.1 /opt/node
Nenhum problema aqui.
:~/node$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.
obviamente, para compilar um projecto, é necessário um compilador. NodeJS sendo escrito usando a linguagem C++, precisamos de um compilador C++. Aqui vou instalar ‘ g++’, O compilador C++ GNU para esse fim:
:~/node$ sudo apt-get install g++:~/node$ ./configure --prefix=/opt/node-v8.1.1/ && echo okok
:~/node$ make -j9 && echo ok-bash: make: command not found
outra ferramenta em falta. Os mesmos sintomas. Same solution:
:~/node$ sudo apt-get install make:~/node$ make -j9 && echo okok
:~/node$ sudo make install:~/node$ /opt/node/bin/node --versionv8.1.1
Success!
Por Favor note: Instalei as várias ferramentas, uma a uma, para mostrar como diagnosticar os problemas de compilação e mostrar-lhe a solução típica para resolver esses problemas. Mas se você procurar por mais informações sobre o tópico ou ler outros tutoriais, você vai descobrir que a maioria das distribuições tem “meta-pacotes” atuando como um guarda-chuva para instalar algumas ou todas as ferramentas típicas usadas para compilar um software. Em sistemas baseados no Debian, você provavelmente encontrará o pacote build-essentials para esse propósito. E nas distribuições baseadas em Red-Hat, esse será o grupo “Ferramentas de desenvolvimento”.
de CentOS 7.0
~]$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node-bash: git: command not found
comando não encontrado? Basta instalá-lo usando o yum
gerenciador de pacotes:
~]$ sudo yum install git
~]$ git clone --depth 1 \ --branch v8.1.1 \ https://github.com/nodejs/node && echo okok
~]$ sudo mkdir /opt/node-v8.1.1 ~]$ sudo ln -sT node-v8.1.1 /opt/node
~]$ cd node node]$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.
acho que Você: NodeJS é escrito usando a linguagem C++, mas o meu sistema não possui o compilador correspondente. Yum para o resgate. Como eu não sou um usuário regular de CentOS, eu realmente tive que pesquisar na Internet o nome exato do pacote que contém o compilador g++. Levando-me a essa página: https://superuser.com/questions/590808/yum-install-gcc-g-doesnt-work-anymore-in-centos-6-4
node]$ sudo yum install gcc-c++ node]$ ./configure --prefix=/opt/node-v8.1.1/ && echo okok
node]$ make -j9 && echo okok
node]$ sudo make install && echo okok
node]$ /opt/node/bin/node --versionv8.1.1
o Sucesso. Outra vez.
C. fazendo alterações ao software instalado a partir do código-fonte
pode instalar o software a partir do código-fonte porque necessita de uma versão muito específica não disponível no seu repositório de distribuição, ou porque deseja modificar o programa para corrigir um erro ou adicionar uma funcionalidade. Afinal, open-source é tudo sobre fazer modificações. Então, eu vou aproveitar esta oportunidade para lhe dar uma amostra do poder que você tem na mão agora que você é capaz de compilar seu próprio software.
aqui, faremos uma pequena alteração nas fontes de NodeJS. E veremos se a nossa alteração será incorporada na versão compilada do software:
abra o ficheiro node/src/node.cc
no seu editor de texto favorito (vim, nano, gedit, … ). And try to locate that fragment of code:
if (debug_options.ParseOption(argv, arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) { printf("%s\n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp(); exit(0); }
It is around line 3830 of the file. Em seguida, modificar a linha que contém printf
para corresponder a essa em vez:
printf("%s (compiled by myself)\n", NODE_VERSION);
depois volte para o seu terminal. Antes de ir mais longe— e para lhe dar mais informações sobre o poder por trás do git— pode verificar se modificou o ficheiro correcto:
diff --git a/src/node.cc b/src/node.ccindex bbce1022..a5618b57 100644--- a/src/node.cc+++ b/src/node.cc@@ -3828,7 +3828,7 @@ static void ParseArgs(int* argc, if (debug_options.ParseOption(argv, arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {- printf("%s\n", NODE_VERSION);+ printf("%s (compiled by myself)\n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp();
deve ver um “-” (sinal menos) antes da linha como era antes de a alterar. E um ” + ” (sinal mais) antes da linha após as suas alterações.
Agora é hora de recompilar e re-instalar seu software:
make -j9 && sudo make install && echo okok
desta vez, a única razão pela qual ele pode falhar é que você fez um erro de digitação ao alterar o código. Se este for o caso, reabra o ficheiro node/src/node.cc
no seu editor de texto e corrige o erro.
Uma vez que tenha conseguido compilar e instalar a nova versão NodeJS modificada, poderá verificar se as suas modificações foram realmente incorporadas no software:
:~/node$ /opt/node/bin/node --versionv8.1.1 (compiled by myself)
Parabéns! Você fez sua primeira mudança para um programa de código aberto!
D. deixe a shell localizar o nosso software de compilação personalizado
pode ter notado que eu sempre lancei o meu novo software NodeJS compilado, especificando o caminho absoluto para o ficheiro binário.
/opt/node/bin/node
It works. Mas isto é, no mínimo, irritante. Na verdade, há duas maneiras comuns de corrigir isso.
na verdade, Existem duas formas de corrigir o problema chato de especificar o caminho absoluto para os arquivos binários,
mas compreendê-los, você deve primeiro saber o que o seu shell localiza os arquivos executáveis, olhando para eles somente nos diretórios especificados pela variável de ambiente PATH.
:~/node$ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Aqui, em que o sistema Debian, se você não especificar explicitamente qualquer diretório, como parte de um nome de comando, o shell vai olhar primeiro para os programas executáveis no /usr/local/bin
e, em seguida, se não for encontrado em /usr/bin
em seguida, se não for encontrado em /bin
, em seguida, se não for encontrado em /usr/local/games
, em seguida, se não for encontrado em /usr/games
e, em seguida, se não encontrado … o shell irá reportar um erro “comando não encontrado”.
dado que, temos duas formas de tornar um comando acessível à shell: adicionando-o a uma das pastas já configuradas PATH
. Ou adicionando a pasta que contém o nosso ficheiro executável ao PATH
.
Adicionar um link de /usr/local/bin
copiar Apenas o nó binário executável a partir de /opt/node/bin
/usr/local/bin
seria uma má idéia, pois ao fazê-lo, o programa executável não seria mais capaz de localizar os outros componentes necessários pertencentes a /opt/node/
(é uma prática comum por um software para localizar seus arquivos de recurso em relação à sua própria posição).
Assim, a forma tradicional de fazer isto é usando um link simbólico:
:~/node$ sudo ln -sT /opt/node/bin/node /usr/local/bin/node:~/node$ which -a node || echo not found/usr/local/bin/node:~/node$ node --versionv8.1.1 (compiled by myself)
Esta é uma solução simples e eficaz, especialmente se um pacote de software é feita de apenas alguns conhecidos programas executáveis— desde que você tem para criar um link simbólico para cada usuário-invokable de comando. Por exemplo, se você está familiarizado com NodeJS, você conhece o npm
aplicação de companheiro I deve symlink de /usr/local/bin
também. Mas deixei-te fazer isso como exercício.
a Modificar o CAMINHO
Primeiro, se você fechar a anterior solução, remova o nó link simbólico criado anteriormente para iniciar a partir de um claro estado:
:~/node$ sudo rm /usr/local/bin/node:~/node$ which -a node || echo not foundnot found
E agora, aqui está a magia de comando para alterar o PATH
:
:~/node$ export PATH="/opt/node/bin:${PATH}":~/node$ echo $PATH/opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Simplesmente disse, eu substituí o conteúdo de PATH
a variável de ambiente do seu conteúdo anterior, mas com o prefixo /opt/node/bin
. Então, como você pode imaginar agora, a shell irá olhar primeiro para o diretório /opt/node/bin
para programas executáveis. Podemos afirmar que, usando o which
comando:
:~/node$ which -a node || echo not found/opt/node/bin/node:~/node$ node --versionv8.1.1 (compiled by myself)
Considerando que o “link” a solução é permanente, assim que você tiver criado um link simbólico para o /usr/local/bin
PATH
alteração só é eficaz para o shell atual. Vou deixá-lo fazer algumas pesquisas sobre como fazer mudanças no PATH
permanents. Como dica, tem a ver com o teu “perfil”. Se você encontrar a solução, não hesite em compartilhar isso com os outros leitores usando a seção de comentários abaixo!
E. Como remover essa recém-instalado o software a partir do código fonte
Desde o nosso personalizado compilado NodeJS software fica completamente /opt/node-v8.1.1
diretório, a remoção de que o software não requer mais esforço do que usar o comando rm para remover o diretório:
sudo rm -rf /opt/node-v8.1.1
CUIDADO: sudo
e rm -rf
são um coquetel perigoso! Verifique sempre o seu comando duas vezes antes de carregar na tecla “enter”. Você não tem nenhuma mensagem de confirmação e não há undelete, se você remover o diretório errado…
Então, se você tiver modificado o PATH
, você terá que reverter essas alterações, o que não é complicado.
E se você criou links de /usr/local/bin
você terá que removê-los todos:
:~/node$ sudo find /usr/local/bin \ -type l \ -ilname "/opt/node/*" \ -print -delete/usr/local/bin/node
espere? Onde estava o inferno da dependência?
como comentário final, se você ler sobre compilar seu próprio software personalizado, você pode ter ouvido sobre o inferno de dependência. Este é um apelido para aquela situação irritante em que antes de ser capaz de compilar com sucesso um software, você deve primeiro compilar uma biblioteca pré-requisito, que por sua vez requer outra biblioteca que pode, por sua vez, ser incompatível com algum outro software que você já tenha instalado.
parte do trabalho dos mantenedores de pacotes de sua distribuição é realmente resolver esse inferno de dependência e garantir que os vários softwares do seu sistema estão usando bibliotecas compatíveis e estão instalados na ordem certa.
para este artigo, eu escolhi, de propósito, para instalar NodeJS como ele virtualmente não tem dependências. Eu disse” virtualmente ” porque, na verdade, tem dependências. Mas o código fonte dessas dependências estão presentes no repositório de origem do projeto (nonode/deps
subdiretório), de modo que você não tem que baixá-los e instalá-los manualmente antes da mão.