Se você usa o sistema operacional Linux há muito tempo e até conhece um pouco de programação, mais cedo ou mais tarde poderá ser necessário compilar o programa a partir do código-fonte. Talvez o programa desejado não esteja nos repositórios de distribuição. Ou o programa possui uma versão antiga nesses repositórios e você precisa da versão mais recente. Ou talvez você tenha criado um novo programa e queira compartilhá-lo com outros usuários.
Obviamente, você pode instalar o programa de acordo com as instruções que acompanham o código-fonte. Mas você precisará gerenciar manualmente os arquivos de programa e monitorar suas dependências. É muito melhor criar um pacote com o programa e usar o gerenciador de aplicativos embutido no sistema operacional.
Espero que este artigo ajude você a descobrir rapidamente como criar um pacote RPM para o Rosa Linux ou para outra distribuição que use o gerenciador de pacotes RPM (Mandriva, RedHat). Ou pelo menos me diga onde procurar informações.
Aqui vou mostrar como criar pacotes RPM no meu computador local, usando um exemplo simples. Vamos construir o programa xkb-switch no sistema operacional Rosa Linux . Nós pegaremos o código fonte do programa no GitHub .
O artigo está dividido em várias partes curtas, de modo que o índice esteja embaixo do spoiler Um pouco sobre o Rosa Linux
Rosa Linux é uma distribuição criada e suportada por desenvolvedores russos . É baseado no Mandriva , mas com alguns recursos. Estou usando a versão de 32 bits do Rosa Fresh R8 , lançada em 2014. Agora, a versão R8 não é mais suportada pelos desenvolvedores (os repositórios não são atualizados), mas funciona bem no meu laptop, portanto, não quero instalar uma nova versão.
Rosa Fresh R8 Usa a área de trabalho do KDE4 . Todas as versões do pacote de distribuição usam gerenciadores de rpm
e urpm
para gerenciar pacotes com aplicativos, e os comandos correspondentes são rpm
, urpmi
, urpme
, urpmq
, urpmf
.
Os princípios de criação de pacotes de software geralmente raramente são alterados na mesma família de distribuição Linux. Portanto, o que é descrito neste artigo deve funcionar em todas as versões das distribuições Rosa .
Construir pacotes no Rosa Linux é um pouco mais simples do que em outras distribuições baseadas em RPM . Alguns pontos são automatizados e não precisam ser configurados.
Um pouco sobre o xkb-switch
Gostei da ideia de usar o plugin para o editor de texto Vim - xkbswitch , sobre o qual existe um artigo sobre Habré . Ele muda automaticamente o layout do teclado para inglês quando você sai do modo de entrada e vice-versa - para aquele em que o texto foi inserido pela última vez - se você entrar no modo de entrada novamente. Para que este plug-in funcione, você precisa do programa xkb-switch , que permite alternar o layout do teclado na linha de comando e nos plug-ins do editor Vim . Este programa não estava nos repositórios Rosa Linux R8 (e provavelmente ninguém o adicionará, porque a distribuição já é antiga e o programa xkb-switch não é muito popular).
Configurando, finalizando, verificando o programa
Freqüentemente, é necessário configurar a compilação do programa para funcionar corretamente em uma distribuição específica ou mesmo para um sistema específico. Acontece que um programa precisa ser construído com outras opções ou com o suporte de algum driver especial. Ou talvez você queira corrigir erros no código do programa ou apenas verificar se funciona. Para fazer isso, é melhor copiar o código-fonte para o seu computador antes de criar o pacote RPM, tente compilá-lo e verifique como o programa compilado funciona.
Se você tiver certeza de que não precisará modificar os arquivos do projeto, poderá usar o código-fonte original do site do projeto e prosseguir imediatamente para compilar o pacote. Mas se você precisar alterar as configurações de compilação, geralmente é muito mais fácil alterar o arquivo na pasta de origem (o chamado makefile ) do que lidar com as opções para os comandos de compilação e o dispositivo macro interno para o arquivo de especificação.
Verificando o código fonte sem o seu perfil no GitHub
Se você decidir trabalhar com o código-fonte ou as configurações de compilação do projeto, mas não tiver seu próprio perfil no GitHub ou não quiser usá-lo, basta baixar e descompactar o código-fonte. No nosso caso, pode ser assim (eu uso a pasta ~/Projects/cpp
para código-fonte C ++ ):
cd ~/Projects/cpp git clone https://github.com/ierton/xkb-switch.git
Isso criará a pasta ~/Projects/cpp/xkb-switch
contém o código-fonte. Obviamente, em vez de usar o git
você pode baixar o arquivo com o programa e descompactá-lo.
No arquivo README.md
na pasta do projeto, é fácil adivinhar que o utilitário cmake
é usado para criar o programa. Portanto, se você precisar alterar as configurações de compilação, no nosso caso elas estão no arquivo CMakeLists.txt
. E apenas tentamos compilar o programa e verificar se ele funciona. Quais comandos você precisa usar para isso estão escritos no mesmo arquivo README.md
na raiz do projeto.
cd xkb-switch mkdir build && cd build cmake .. make ./xkb-switch
Depois disso, para usar o projeto alterado, você precisará limpar ou excluir a pasta de build
do projeto e compactar o código-fonte no arquivo morto. Pode ser assim:
cd ~/Projects/cpp/xkb-switch rm -rf ./build cd ~/Projects/cpp zip -r xkb-switch.zip xkb-switch
O arquivo xkb-switch.zip
precisará ser usado para criar o pacote.
Verificação ao salvar o projeto no seu perfil do GitHub
Suponho que qualquer pessoa que leia esta seção esteja ao menos um pouco familiarizada com o trabalho com o git e já tenha configurado um perfil no GitHub . Penso que este método é o melhor, pelo que o resto do artigo implica que é utilizado, salvo indicação em contrário.
Primeiro, você precisa inserir o projeto original no seu GitHub . Depois disso, como no método anterior, clonamos o projeto em nosso computador, mas em nosso repositório (no meu caso, o nome de usuário é alexandersolovyov ):
cd ~/Projects/cpp git clone https://github.com/alexandersolovyov/xkb-switch.git
Para adicionar alterações, é melhor usar uma nova ramificação. Então, se desejado, será possível usar diferentes versões do programa. E também será possível propor alterações ao autor do projeto usando solicitações de recebimento. Por exemplo, se você decidir corrigir um pouco o arquivo CMakeLists.txt
, antes disso, será necessário criar uma nova ramificação com:
git branch cmake_corrections
Depois que as alterações são feitas, verificadas e adicionadas à ramificação (usando git commit -am " "
), você pode adicionar uma nova ramificação ao seu GitHub:
git push origin cmake_corrections
Depois disso, você pode fazer uma solicitação de recebimento, se necessário.
Você pode criar um link para o repositório original:
git remote add ierton https://github.com/ierton/xkb-switch.git
E atualize a ramificação principal do seu repositório para que ela corresponda ao original:
git pull ierton master
O código do programa correspondente à ramificação corrigida pode ser usado ao criar o RPM. Para fazer isso, você precisará especificar o endereço do arquivo morto no formulário no arquivo de especificação:
Source0: https://github.com/-/-/archive/---.zip
Mas, como o usuário do specblog solicitou , esse não é realmente o caso. É melhor transmitir suas alterações na forma de patches. Para fazer isso, você precisa criar arquivos de correção a partir das alterações em sua ramificação e copiá-los para a pasta de origem para criar o pacote ( ~/rpmbuild/SOURCES/
). Então você precisará especificá-los no arquivo de especificações. Consideraremos isso um pouco mais tarde, mas se você quiser, pode ler aqui . Se você não sabe como criar patches, pode procurar no spoiler.
Como criar patches usando gitCriando patches
Patches , são Patches - são arquivos nos quais as alterações são registradas no código-fonte do programa. Eles são usados como uma alternativa aos comandos git pull
e git push
para comunicação entre repositórios de códigos locais, se não for conveniente "puxar" alterações de um repositório remoto, ou o histórico de alterações do projeto e os princípios de trabalhar com ele são de tal forma que é melhor usar patches.
Vamos imaginar que precisamos fazer alterações no arquivo CMakeLists.txt
. Primeiro, você precisa fazer tudo como descrito acima: o ramo mestre em nosso repositório GitHub deve corresponder ao ramo principal do projeto original e, para suas alterações, você precisa usar o ramo cmake_corrections . Então você precisa ir para este ramo, fazer as alterações necessárias e salvá-las no git usando commits.
Agora você precisa salvar as alterações como arquivos de correção na pasta ~/rpmbuild/SOURCES
(se você não estiver usando o Rosa Linux, o caminho para a pasta SOURCES
poderá ser diferente). Por exemplo, isso (quero dizer que estamos na pasta do projeto - por exemplo, ~/Projects/cpp/xkb-switch
- e no ramo cmake_corrections
):
git format-patch -o ~/rpmbuild/SOURCES origin/master
O comando git format-patch
cria um arquivo de git format-patch
para cada confirmação. Nesse formulário, ele fará patches começando na confirmação especificada pelo último argumento e terminando na última confirmação da ramificação atual. Você pode especificar uma confirmação de qualquer maneira: no início do hash, usando o ponteiro HEAD ou o nome da ramificação, que agora indica a confirmação desejada. O principal é que uma das confirmações visíveis quando o git log
executado é tomada como início. Ou seja, não é possível começar a fazer correções a partir de uma consolidação que esteja em outra ramificação.
E você pode lembrar (ou ver) quantos commits de volta nós ramificamos da ramificação principal e fazer correções para um certo número de commits de volta. Por exemplo, se fizermos duas confirmações, o comando seria:
git format-patch -o ~/rpmbuild/SOURCES -2
Aqui, o número de confirmações é definido usando -2
. Você pode especificar qualquer número deles em vez desta figura.
Você pode especificar o intervalo de confirmações a partir das quais as correções devem ser feitas colocando dois pontos entre os links para as confirmações inicial e final:
git format-patch -o ~/rpmbuild/SOURCES master..cmake_corrections
O nome de cada arquivo de correção consiste em um número de série e na primeira linha de um comentário de confirmação. Portanto, é melhor renomear cada arquivo para que a descrição do patch descreva de maneira mais rápida e clara sua essência. Por exemplo, assim:
mv 0001-Return-memory-allocated-by-XkbRf-getNamesProp()-for-tmp.patch 001-Fix-memory-leak.patch
a convenção de nomenclatura para correções no artigo sobre a sintaxe do arquivo spec recomenda adicionar package_name-version-rosa- antes da descrição de cada arquivo de correção. Talvez essa seja uma boa prática se você enviar correções por email, mas não para criar pacotes. Como construímos pacotes em nosso computador, é melhor esvaziar a pasta ~/rpmbuild/SOURCES
todas as vezes antes de ~/rpmbuild/SOURCES
pacote com outro programa ou um novo pacote de versão.
Agora, se você precisar atualizar o ramo principal do repositório ( mestre ) para corresponder ao original, depois disso, o ramo de mudança ( cmake_corrections ) precisará ser atualizado usando o git rebase
. Você pode ver como fazer isso aqui . Depois disso, os patches precisarão ser recriados.
Prepare o "local de trabalho" para criar um pacote
Primeiro você precisa criar uma estrutura de diretórios. Toda a montagem ocorre na pasta rpmbuild
na pasta inicial do rpmbuild
. Crie a estrutura de diretório inicial e vá para a pasta dos arquivos de especificação:
mkdir -p ~/rpmbuild/SPECS && cd ~/rpmbuild/SPECS
Para o Rosa Linux, basta: as pastas restantes serão criadas automaticamente.
Outra distribuição pode usar um local de arquivo diferente para criar o pacote. E talvez você precise criar manualmente toda a hierarquia de pastas. Procure informações para sua distribuição se você não estiver usando o Rosa Linux. Por exemplo, isso pode ser assim no Red Hat .
Se o pacote tiver sido construído com erros, todos os arquivos criados pelo comando rpmbuild
não rpmbuild
excluídos - o mesmo que com uma compilação bem-sucedida. Vamos tentar coletar o pacote várias vezes, e os arquivos restantes após a última vez irão interferir. Portanto, é melhor criar um script simples que ajude a removê-los rapidamente. Crie um arquivo cleanup.sh e coloque-o na ~/rpmbuild/SPECS
. Aqui está o seu conteúdo:
!
Obviamente, é melhor adicionar direitos de execução usando o chmod u+x cleanup.sh
.
Se você deseja coletar um pacote de arquivos que estão no computador local - se você não está usando o GitHub e fez alterações nos arquivos do projeto, ou deseja criar um pacote a partir do seu próprio programa, que é armazenado apenas no seu computador - você precisa compactar o projeto em um arquivo morto ( por exemplo, .zip
, .tar
ou .tar.gz
) e coloque-o na pasta SOURCES
. Por exemplo, assim:
cd ~/Projects/cpp/ zip -r xkb-switch.zip xkb-switch mkdir -p ~/rpmbuild/SOURCES cp xkb-switch.zip ~/rpmbuild/SOURCES/
Se, após a criação do programa, você desejar criar outra versão igual ou diferente, mas diferente, será necessário excluir todos os arquivos da pasta ~/rpmbuild/SOURCES
e, em seguida, copiar o arquivo morto (se você não fizer o download no GitHub ) e arquivos de correção (se usados). Caso contrário, o arquivo morto provavelmente não será baixado do GitHub (por que - veja mais adiante), e também será difícil descobrir qual arquivo de correção pertence a qual programa.
Vamos começar a criar um arquivo de especificação
A base para a criação de um pacote RPM é o chamado arquivo speck . Este arquivo contém as instruções para o programa rpmbuild
(ou melhor, rpm
) necessárias para a construção do pacote.
Crie o arquivo xkb-switch.spec
na ~/rpmbuild/SPECS/
. A maneira mais fácil de começar é com um modelo que pode ser encontrado no site Arquivos de especificação de modelo .
No README
na página do projeto xkb-switch , é sabido que o programa é compilado usando o utilitário cmake
. Portanto, selecionaremos o arquivo Spec para um programa criado usando o CMake e copiaremos o modelo inteiro em nosso arquivo spec. Obviamente, para montar adequadamente nosso pacote RPM, esse modelo precisa ser muito alterado, o que faremos.
Um pouco sobre a sintaxe do arquivo de especificação
- A sintaxe do arquivo spec permite adicionar comentários no estilo bash.
- Você pode usar espaços como os espaços entre os valores na mesma linha para criar a aparência de colunas pares, mas a documentação recomenda enfaticamente o uso do caractere de tabulação (um ou dois, desde que as colunas sejam pares). Nota: em todos os exemplos de código deste artigo, apenas espaços são usados; portanto, é melhor não copiar todo o texto daqui para seu arquivo de especificação, mas imprimi-lo você mesmo.
- Os campos de opção consistem em um nome de opção especial com dois pontos e o próximo valor através de guias (ou espaços). O caso de caracteres nos nomes dos campos não importa. Por exemplo:
Name: xkb-switch
- Se a palavra for precedida pelo símbolo
%
(por exemplo, %description
), essa é uma palavra-chave especial. Pode ser uma chamada de comando, macro ou script. Depois disso, os parâmetros que ele usa podem ser indicados. E há palavras-chave que indicam o início de um bloco de comandos ou opções. Em seguida, os parâmetros podem ser indicados próximos a ele e nas próximas linhas deve haver comandos ou uma lista de opções que descrevi no parágrafo anterior. Após esse bloco, uma linha vazia deve ser deixada.
- Para usar o valor de uma constante, você precisa inserir uma construção do formulário
%{_}
. Seu valor pode ser predefinido ou pode ser determinado por uma opção (por exemplo, Name: xkb-switch
) ou usando a palavra-chave %define
. Todas essas constantes também são consideradas macros. Seu uso será discutido em mais detalhes abaixo.
Cabeçalho do arquivo Spec
No arquivo de especificações, o cabeçalho é sempre escrito primeiro. Esta é uma lista de opções que se aplicam ao pacote principal do RPM. Quando o pacote estiver pronto, quase todas essas informações serão exibidas ao visualizar sua descrição. Aqui está o que as linhas individuais indicam:
Resumo:Uma breve descrição do pacote. Espiei a descrição no arquivo
README.md
no projeto
xkb-switch :
Query and change XKB layout state
.
Nome:O nome do pacote. No nosso caso, este é o
xkb-switch
.
Versão:Versão do programa. Para descobrir, é melhor consultar o arquivo
CMakeLists.txt
na pasta raiz do projeto. Obviamente, você precisa tirar o arquivo da cópia do projeto que será usado para a montagem. Se você usar o projeto original,
poderá abrir o arquivo diretamente na página do GitHub . Como você pode ver, a versão é composta por
MAJOR_VERSION
,
MINOR_VERSION
e
RELEASE_VERSION
. Eu usei a versão do programa
1.6.0
.
Lançamento:O número da versão do próprio pacote. Exibe a hora em que um pacote com um programa da mesma versão está sendo montado. No nosso caso, é "1", pois ninguém jamais montou um programa desta versão. No caso ideal, se já tentamos criar o pacote e o assembly chegou ao fim (mesmo que houvesse erros), depois de cada nova tentativa, é necessário aumentar esse número em 1 e, ao mesmo tempo, não exclua os pacotes coletados antigos das
rpmbuild/SRPMS
rpmbuild/RPMS
e
rpmbuild/SRPMS
: Em seguida, novos pacotes com um novo número de compilação serão criados. Talvez isso deva ser feito se você usar um servidor especial para montagem. Nós usamos nosso computador e, em vez disso, limparemos as pastas. Se um pacote com um programa desta versão já estiver nos repositórios da distribuição Linux, mas você estiver compilando com outras configurações, é melhor especificar o número do release 1 a mais que esse pacote.
Licença:O nome abreviado da licença sob a qual o programa é distribuído. De acordo com as regras do Rosa Linux, você só pode criar pacotes com uma licença que permita a distribuição gratuita.
README.md
pode descobrir no arquivo
README.md
que a licença é
GNU GPLv3 . Então, escrevemos:
GPLv3+
.
Grupo:O grupo ou categoria à qual o programa pertence. Usando esses grupos, os programas são classificados no menu de inicialização do aplicativo e no gerenciador de programas da janela (“Adicionar ou remover programas”).
A lista de grupos para o Rosa Linux pode ser encontrada aqui . Eu acho que o
Development\X11
é melhor para nós, pois o programa está relacionado ao X11 e é principalmente necessário para criar scripts e plugins para o Vim.
URL:Endereço da Internet em que você pode baixar o código fonte original do programa. Será especificado ao visualizar as informações do pacote RPM. Este item é opcional, mas indicaremos:
https://github.com/ierton/xkb-switch
Fonte0:O nome do arquivo que contém o código-fonte ou o endereço da Internet em que pode ser baixado. Se você especificar um endereço na Internet, durante a primeira compilação, o arquivo será baixado para
~/rpmbuild/SOURCES/
. Se esse arquivo já existir, ele não será mais baixado, ou seja, o programa
rpmbuild
usará apenas o nome do arquivo especificado no final desta URL. Você pode especificar apenas o nome do arquivo, mas ele precisará ser colocado na pasta
~/rpmbuild/SOURCES/
manualmente. É melhor fornecer o endereço da sua cópia do projeto no GitHub. Usei o arquivo
https://github.com/alexandersolovyov/xkb-switch/archive/master.zip
. Você pode especificar várias fontes diferentes para coletar as fontes de vários arquivos com a ajuda de um arquivo pontilhado. Em seguida, no nome da opção para adicionar cada arquivo subsequente, o número deve aumentar (
Source2
,
Source2
, etc.). Esses endereços de arquivo não são visíveis ao exibir as informações do pacote RPM.
Patch0:Esta opção não está no arquivo de modelo. Pode ser útil se você decidir transferir suas alterações nos arquivos de projeto do programa na forma de patches. Quanto à opção
Source0
, cada arquivo deve ser indicado em uma linha separada, e o número no final do nome da opção deve aumentar a cada vez. Os arquivos de correção devem estar localizados na pasta
~/rpmbuild/SOURCES
(ao lado do arquivo de origem baixado). O nome de cada arquivo deve ser escrito sem um caminho para ele. Não é necessário especificar todos os arquivos de correção aqui - apenas aqueles que você deseja aplicar podem ser usados.
BuildRequires:Pacotes necessários para construir o programa. O modelo
cmake
. O arquivo
CMakeLists.txt
indica que a versão mínima do CMake para montagem não deve ser inferior a
2,6 ; portanto, é melhor especificar
cmake >= 2.6
. Você pode adicionar outros pacotes, cada um em uma linha separada, usando a opção
BuildRequires:
separada. A lista de pacotes necessários para montagem pode ser encontrada lendo o
README
do projeto e analisando atentamente o arquivo
CMakeLists.txt
(especialmente as
FIND_PACKAGE
,
TARGET_LINK_LIBRARY
,
FIND_PROGRAM
). Em seguida, você precisa encontrar o nome do pacote correto nos repositórios usando o comando
urpmq -a __
. No nosso caso, o arquivo de configurações de compilação (
CMakeLists.txt
) já contém linhas que verificam a presença dos pacotes necessários no sistema. Mas é melhor especificar a lista inteira aqui também:
# CMake 2.6 BuildRequires: cmake >= 2.6 # C/C++ BuildRequires: gcc # libxkbfile BuildRequires: libxkbfile-devel # X11 libxkbfile, # libx11-devel . # man: BuildRequires: xz
Requer:, Fornece:Essas opções não estão na amostra, mas às vezes podem ser úteis. Eles estabelecem dependências entre pacotes.
A opção Provides
especifica os recursos fornecidos pelo pacote que está sendo construído. Este pode ser o nome do arquivo de linguagem de cabeçalho C , ou dinâmico nome da biblioteca de link, ou qualquer função especial. E a opção Requires
indica em quais recursos de outros pacotes o pacote depende. Package Manager ( rpm
, urpm
ou outras pessoas que utilizam a sua distribuição), na busca de dependências que procuram estas oportunidades em vez de nomes de pacotes. Portanto, Provides
é melhor indicar a versão da Oportunidade fornecida e para Requires
quais versões das Oportunidades fornecidas são adequadas. A versão é indicada por sinais >=
,=
, ou <=
cercado por espaços. Normalmente, todas as opções são indicadas primeiro Requires
, depois - Provides
, um nome de recurso por linha - o mesmo que para BuildRequires:
. Normalmente, ao criar pacotes no Rosa Linux, as dependências são reconhecidas automaticamente e essas opções raramente precisam ser especificadas.AutoReq:, AutoProv:se você estiver criando um programa que está escrito em um idioma em que o gerenciador de rpm é novo ou proprietário e as dependências não são detectadas corretamente automaticamente, é possível desativar a detecção automática de Recursos (com AutoProv: no
) e / ou Dependências (com ajuda AutoReq: no
).% descriçãoEste bloco não faz mais parte do cabeçalho, mas está associado a ele. Ele adicionará uma descrição completa do programa ao pacote RPM. Uma linha vazia deve ser deixada depois dela. A descrição pode ser a seguinte: %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley.
As linhas do modelo que começam com %files
e %find_lang
são necessárias apenas se você criar um aplicativo com suporte para vários idiomas, portanto, exclua-os.
Além disso, após o comentário da linha divisória, seguido por comandos e macros que devem ser concluídos antes de compactar os arquivos. Todos esses comandos são divididos em blocos definidos usando palavras-chave especiais.
Preparação da fonte
O primeiro é um bloco %prep
que indica os comandos para se preparar para a compilação. Nele está um comando macro %setup
. Ela executa um script que faz o seguinte:
- ,
SourceX:
( — Source0:
). , .
~/rpmbuild/SOURCES/
.
~/rpmbuild/BUILD/
.
- .
-q
, .
, %prep
:
rpmbuild -bp ~/rpmbuild/SPECS/xkb-switch.spec
rpmbuild
. , rpm
: rpmbuild
, . ( root
sudo
). rpmbuild
, man rpmbuild
. , , , — , rpmbuild
.
: xkb-switch-1.6.0: No such file or directory
. , ~/rpmbuild/BUILD/xkb-switch-1.6.0
, .
ls ~/rpmbuild/BUILD/
, xkb-switch-master
. %setup
-n
. %prep
- :
%prep %setup -q -n xkb-switch-master
~/rpmbuild/SPECS/cleanup.sh
, BUILD
, , %prep
. , exit 0
. , .
, . %prep
. , , :
%apply_patches
rpmbuild -bp xkb-switch.spec
. — .
Maximum RPM .
.
%build
. README
, cmake ..
make
, - . : , . , %build
:
~/rpmbuild/SPECS/cleanup.sh rpmbuild -bc ~/rpmbuild/SPECS/xkb-switch.spec
exit 0
: .
, . shell ( bash zsh, ). rpmbuild
, . shell - — . ( .)
- , , , %build
shell .
, , . cmake
, , , %cmake
- , , . ( — CMakeLists.txt
). , .
Instalação
, . %install
, , , ~/rpmbuild/BUILDROOT/__-buildroot/
.
__
, Name:
-, ( Version:
-), ( Release:
-), , .
README
, make install
, build
. - - %makeinstall_std -C build
, . ( , ):
~/rpmbuild/SPECS/cleanup.sh rpmbuild -bi ~/rpmbuild/SPECS/xkb-switch.spec
, RPM. - , .
, - . , ~/rpmbild/BUILDROOT/
. ( , , tree
, - Linux.) , , .debug
. , , : .
, , %files
-. , , . .
%files
-. , . Rosa Linux %prep
( - ). , , , , — . - (, , ).
%files
, RPM. , :
%files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz
-. , , /usr/lib/rpm/macros
. , %{_bindir}
, %{_libdir}
— , %{_mandir}
— man. %{name}
%{version}
Name:
Version:
-.
:
~/rpmbuild/SPECS/cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec
… 2 1 . rpmlint
, . , , Rpmlint Errors , :
`xkb-switch.i586: E: versão incoerente no nome (validade: 50) 1`Erro: a versão no nome do pacote da biblioteca não está especificada corretamente.`xkb-switch.i586: E: executável na biblioteca-pacote (Badness: 1) / usr / bin / xkb-switch`Erro: o pacote da biblioteca contém um arquivo executável.`xkb-switch.i586: W: arquivo devel-em-non-devel-pacote / usr / lib / libxkbswitch.so`Aviso que um arquivo de pacote de desenvolvimento ( -devel
) foi encontrado em um pacote que não foi desenvolvido para desenvolvimento.Está tudo claro? Eu acho que não. Vamos dar uma olhada no que está acontecendo aqui.
O que é rpmlint
Rosa Linux rpmbuild
rpmlint
, . rpmlint
, , . , Rosa Linux ( , rpmlint
) .
, , . ~/rpmbuild/RPMS/_/
rpmlint -i __
.
, RPM - , , , , Rosa Linux, rpmlint -i __
.
RPM Rosa Linux
Rosa Linux 6 . , .
Pacote executávelÉ binário. Ele contém apenas um arquivo ou script binário destinado diretamente à execução. Os arquivos desses pacotes costumam ser instalados em uma pasta /bin/
ou em /usr/bin
. Também pode conter links - para a possibilidade de chamar o programa usando vários nomes diferentes. O nome do pacote corresponde ao nome do programa. Esses pacotes geralmente dependem da biblioteca.BibliotecaContém arquivos compilados de bibliotecas dinamicamente conectadas ("compartilhadas", "compartilhadas") usadas pelos programas. Normalmente, esse é o próprio arquivo da biblioteca, cujo nome termina com a versão e um link para esse arquivo, cujo nome termina com o primeiro número da versão. Por exemplo, para uma biblioteca libxkbfile
versão 1.0.2, será um arquivo libxkbfile.so.1.0.2
e um link para ele,libxkbfile.so.1
. O próprio nome do pacote da biblioteca, pelo qual é reconhecido no repositório do instalador, termina com o primeiro número da versão e começa com o prefixo lib
. A biblioteca tem o libxkbfile
nome correto - libxkbfile1
. Isso ocorre porque geralmente o número da primeira versão muda apenas com alterações incompatíveis da biblioteca e, portanto, será possível instalar vários pacotes com uma biblioteca de versões diferentes se alguns programas usarem a versão antiga da biblioteca e outros usarem uma versão mais recente.Pacote para desenvolvedoresArquivos necessários para compilar programas que usam a biblioteca, mas desnecessários para o trabalho de programas prontos. Para programas C / C ++ simples , este é um link para o arquivo da biblioteca, mas sem versões no nome (por exemplo,libxkbfile.so
), bem como arquivos de cabeçalho (com a extensão .h
). Nome do pacote termina com -devel
, por exemplo: libxkbfile-devel
. Durante a instalação, sempre depende da biblioteca apropriada. Por exemplo, o pacote libxkbfile-devel
depende libxkbfile1
.Código Fonte Osrepositórios Rosa Linux possuem pacotes RPM que contêm o código fonte para alguns programas - basicamente apenas aqueles que realmente precisam ser reconstruídos. Os nomes desses pacotes terminam com -src
ou -source
(por exemplo, apache-source
). rpmbuild
sempre cria esse pacote automaticamente e o coloca ~/rpmbuild/SRPMS/
.Símbolos de depuraçãoEsta é uma informação que pode ser usada para depurar um programa concluído. Ele associa locais em arquivos compilados ao código fonte. Esses pacotes são criados rpmbuild
automaticamente pela equipe , e um final é atribuído ao seu nome -debuginfo
. Não encontrei esses pacotes nos repositórios do Rosa Linux.Documentação Osrepositórios do Rosa Linux possuem pacotes de documentação para vários programas e bibliotecas. Eu (por enquanto) não conheço os recursos para compilar esses pacotes. Seus nomes geralmente terminam em doc
: por exemplo libx11-doc
, java-1.7.0-openjdk-javadoc
. A propósito, quase todos eles são feitos no estilo de sites e, para visualizá-los, é melhor abrir um navegador, acessar o endereço file:///usr/share/doc/
e selecionar a pasta e o arquivo desejados.Nosso resultado
Agora tudo ficou mais claro.
xkb-switch
libxkbswitch.so
, , , . , : xkb-switch.i586: W: devel-file-in-non-devel-package /usr/lib/libxkbswitch.so
.
- ,
/usr/lib/libxkbswitch.so.1
/usr/lib/libxkbswitch.so.1.6.0
. , . : xkb-switch.i586: E: executable-in-library-package (Badness: 1) /usr/bin/xkb-switch
.
- , (1). :
xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1
.
, rpmlint
, . . xkb-switch , libxkbswitch.so.1.6.0
, Vim . xkb-switch , C C++ . RPM- .
-:
- xkb-switch Summary: Query and change XKB layout state Name: xkb-switch Version: 1.6.0 Release: 1 License: GPLv3+ Group: Development/X11 URL: https://github.com/ierton/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build
— , . , , xkb-switch
3 : , . :
/usr/bin/xkb-switch
/usr/share/man/man1/xkb-switch.1.xz
,
- —
/usr/lib/libxkbswitch.so.1
/usr/lib/libxkbswitch.so.1.6.0
,
- —
/usr/lib/libxkbswitch.so
.
-. , ,
- Maximum RPM . - libxkbfile Rosa Linux .
.
— - libxkbfile . - :
%define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch
%define
. , ( ) — , . , %{major}
1
, .
%mklibname
«lib», , — ( ). %{libname}
«lib» + «xkbswitch» + ( %{major}) = libxkbswitch1
— .
-d
%mklibname
-devel
. %{develname}
libxkbswitch-devel
— .
Version:
Version: %{major}.6.0
, -.
- . . :
Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley.
- . - , - ( rpm ). %package
. -. , -. Version
, Summary
, Group
. Provides
Requires
, . Name
: , %package
.
. %description
— , %package
.
Rosa Linux - %description
-. libxkbswitch1
:
%package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'.
-n
%package
%description
, . - , xkb-switch-libxkbswitch1
. libxkbswitch1
. .
:
%package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'.
, . %files
.
, , %package
, %description
%files
. , %description
- . , , — xkb-switch
.
- Rosa Linux %files
, %prep
. :
%files %{_bindir}/%{name} %{_mandir}/%{name}.1.xz %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %files -n %{develname} %{_libdir}/libxkbswitch.so
, :
xkb-switch
~/usr/bin/xkb-switch
~/usr/share/man/man1/xkb-switch.1
,
libxkbswitch1
~/usr/lib/libxkbswitch.so.1
~/usr/lib/libxkbswitch.so.1.6.0
,
libxkbswitch-devel
~/usr/lib/libxkbswitch.so
.
cleanup.sh
rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec
. 3 :
libxkbswitch1.i586: W: no-documentation libxkbswitch-devel.i586: W: no-documentation libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch
, . , . . Vamos tentar descobrir.
, , , README.md
. %files
— %doc
:
%doc README.md
. %doc
— . ~/rpmbuild/BUILD/xkb-switdh-master/README.md
.
: libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch
. , libxkbswitch-devel
libxkbswitch
.
rpm -qp --
. :
[user@pc ~] $ cd ~/rpmbuild/RPMS/i586/ [user@pc ~/rpmbuild/RPMS/i586] $ ls libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-debuginfo-1.6.0-1-rosa2014.1.i586.rpm [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch.so.1 libxkbswitch1 = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libxkbswitch) libxkbswitch-devel = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libX11) devel(libgcc_s) devel(libstdc++) devel(libxkbfile) rpmlib(PayloadIsXz) <= 5.2-1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.11) libstdc++.so.6(GLIBCXX_3.4.20) libstdc++.so.6(GLIBCXX_3.4.9) libxkbswitch.so.1 rpmlib(PayloadIsXz) <= 5.2-1
, libxkbswitch1
libxkbswitch.so.1
libxkbswitch1
. xkb-switch
libxkbswitch.so.1
, libxkbswitch-devel
libxkbswitch1
. , %package
libxkbswitch-devel
. :
%package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version}
, … . libxkbswitch-devel
, , . , , rpmbuild
.
-, ( README.md
), — :
- %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch # Main package. Automaticaly requires libxkbswitch and libxkbswitch-devel Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. # libxkbswitch %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. # libxkbswitch-devel %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. # xkb-switch %files %{_bindir}/%{name} %{_mandir}/man1/%{name}.1.xz # libxkbswitch1 %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %doc README.md # libxkbswitch-devel %files -n %{develname} %{_libdir}/libxkbswitch.so %doc README.md #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build
Conclusão
, RPM Rosa Linux ( ). , -. , — , , rpmrc , ABF , — .
— , -, - , — .
rpmbuild -bp specfile.specExecute a preparação (% de preparação).rpmbuild -bc specfile.specRun compilação (% build) e todas as ações anteriores.rpmbuild -bi specfile.specExecute uma pseudo- instalação (% install) e todas as etapas anteriores.rpmbuild -ba specfile.specCrie pacotes completamente.Verificando o pacote pronto
rpmlint -i package_file_name.rpmVerificação geral - quão bem o pacote foi construído.rpm -qp - fornece package_filename.rpmVerifique quais "recursos" são fornecidos pelo pacote.rpm -qp - requer package_filename.rpmVerifique em quais "capacidades" de outros pacotes este pacote depende.rpm -qpl package_file_name.rpmLista de arquivos contidos no pacote.rpm -qpi nome do arquivo do pacote.rpmInformações sobre o pacote (no "cabeçalho" do arquivo de especificação ou no bloco % package )., p
. , Rosa Linux, . urpmq
, rpm -q
. , urpmq -l _
, urpmq --requires _
.
( )
- Building RPMs — Quick Start — RPM Rosa Linux.
- RPM — , , . .
- RPM: spec — - Rosa Linux.
- Maximum RPM —
rpm
RPM- RedHat Linux. , Rosa Linux. . - Template Spec Files —
.spec
. , -. - Automatic Build Farm (ABF) — Rosa Linux. , , ,
.spec
. -. - Rpmlint Errors — ,
rpmlint
. - Packaging Group — Rosa Linux.
- Rosa Linux .
- Git — — Git .