SliTaz Cook & Cooker
O Cookutils do SliTaz fornece ferramentas e utilitários que ajudam na
construção de pacotes para o SliTaz. Eles são fáceis de usar e aprender,
rápidos e leves. Você será capaz de criar pacotes para o SliTaz em
apenas alguns comandos. O conjunto cookutils é dividido no estilo BSD,
uma ferramenta para cada tarefa, em torno do comando central cook
e do Cooker.
O cook compila um receipt e produz um tazpkg. Em torno dele,
um punhado de sub-ferramentas focadas lidam com as consultas do wok, o banco
de dados de pacotes, a configuração do ambiente de compilação, a compilação
em lote, a análise de dependências, a limpeza e a criação de receipts. O
Cooker é um robô de compilação com mais automação e pode ser usado como
interface para o cook, já que fornece uma interface CGI/web para visualizar
logs de forma colorida. Todas as ferramentas compartilham os mesmos arquivos
de BD e wok, e todas compartilham listas de pacotes bloqueados
e quebrados, assim como atividade.
Para informações técnicas (estilo de código, layout do repositório, etc), consulte o README encontrado na árvore de fontes ou em /usr/share/doc/cookutils.
Visão geral das ferramentas
O conjunto cookutils é composto pelas seguintes ferramentas voltadas ao
usuário, todas disponíveis em /usr/bin/:
cook Compila e empacota um único receipt cook-all Compila em lote pacotes de uma lista / cookorder cook-clean Apaga arquivos e pastas criados na compilação (taz/, install/, source/) cook-deps Analisa dependências em tempo de execução de um pacote compilado cook-new Cria um novo esqueleto de pacote no wok cook-pkgdb Constrói o BD de pacotes para $PKGS mais split.db / maint.db cook-setup Inicializa um chroot de compilação ou ambiente de compilação cruzada cook-wok Consultas somente leitura no wok (list / search / uncook / …) cooker Robô de compilação com interface web/CGI cookiso Construtor de imagem ISO cooklinux Wrapper de compilação do kernel cooks Compila um pacote mais todos os seus sub-pacotes SPLIT cross Construtor de toolchain de compilação cruzada
Toda ferramenta entende help, --help, -h
ou usage para sua tela de uso embutida com exemplos.
Para compatibilidade retroativa, cook mantém shims (adaptadores) transparentes
para os sub-comandos legados (cook pkgdb, cook list-wok,
cook setup, cook new, cook clean-wok,
cook all, etc.). Eles exec (executam) a ferramenta cook-*
correspondente, para que scripts e hábitos existentes continuem funcionando.
Uso do Cook
O Cook fornece uma pequena ajuda embutida que você pode exibir com o comando
usage. Ele também possui opções para executar tarefas especiais
em um pacote antes de compilá-lo ou depois. Para obter ajuda e uso:
# cook usage
Como fazer
A primeira coisa que você terá que fazer antes de compilar pacotes é configurar seu ambiente. As 2 formas recomendadas de trabalhar: compilar diretamente no host ou compilar em chroot para proteger seu host. No caso de querer trabalhar em um chroot, você pode instalar e usar o Tazdev para criar um e fazer chroot nele:
# tazdev gen-chroot && tazdev chroot
Por padrão o Tazdev cria um chroot em /home/slitaz/cooking/chroot, mas você
pode especificar um caminho personalizado no argumento. A localização do chroot
não é importante, quando você estiver no chroot usará caminhos padrão do
SliTaz como /home/slitaz/wok para o diretório do wok ou /home/slitaz/log
para todos os logs do cook. Como de costume, você pode exibir a ajuda do
tazdev com tazdev usage.
Quando você usa um chroot há 2 diretórios especiais montados com a opção bind: src e packages. Os fontes para todos os pacotes são armazenados por padrão em /home/slitaz/src, este diretório é montado no chroot para que as ferramentas possam usá-los. Este método permite compartilhar fontes entre vários chroots, como um para cooking e outro para stable. A localização padrão do diretório de pacotes é: /home/slitaz/[versão]/packages, então eles não ficam no chroot e estão seguros caso o chroot seja removido por engano.
Primeiros passos
O Cook usa o arquivo de configuração /etc/slitaz/cook.conf, se
você quiser usar caminhos personalizados para diretórios e arquivos do
SliTaz, terá que modificá-lo. O setup cria alguns diretórios e arquivos para
manter rastro de atividade e erros, todos os arquivos são arquivos de texto
puro que você pode abrir em um editor de texto. Para preparar seu ambiente:
# cook-setup
O comando cook-setup possui uma opção --wok que
permite clonar um wok do SliTaz enquanto configura seu ambiente de cook.
Mesmo que você ainda não seja um desenvolvedor oficial, pode cloná-lo e usar
pacotes existentes como exemplo para criar os seus. Para configurar e clonar
o wok cooking padrão ou o wok undigest:
# cook-setup --wok # cook-setup --undigest
Para ambientes de compilação cruzada, passe a arquitetura alvo:
# cook-setup arm # cook-setup armv6hf # cook-setup armv7 # cook-setup x86_64
Opções do cook.conf
Algumas opções globais em /etc/slitaz/cook.conf separam o caso
de uso de host de compilação de um chroot de desenvolvedor:
MAKE_BUNDLE="no" cook-pkgdb constrói bundle.tar.lzma (apenas host de
compilação, empacota mirrors upstream + extra.list).
REPOLOGY_CHECK="no" postcheck consulta repology.org por selos "outdated".
Requer wget com suporte a HTTPS.
Ambas padrão para "no", para que um chroot novo não tente
acessar a rede durante cook / cook-pkgdb. Hosts de compilação estilo Pascal
alternam para "yes". Os padrões de código tratam a ausência
graciosamente, então uma instalação atualizada do cookutils com um cook.conf
existente funciona sem nenhuma mudança manual.
Teste seu ambiente
O Cook fornece um comando de teste que criará um pacote e o compilará. Isso permite ver se seu ambiente está funcionando e fornece um pacote de exemplo com um receipt. O pacote fictício se chama 'cooktest' e pode ser removido após os testes. Para compilar o pacote de teste:
# cook test
Criar e compilar
Se seu ambiente está configurado corretamente, você pode começar a criar e compilar pacotes do SliTaz a partir do seu wok. Para criar um novo pacote com um receipt vazio (você também pode criar um interativamente):
# cook-new pkgname # cook-new pkgname --interactive
Se você acabou de criar um novo pacote, terá que editar o receipt com seu editor de texto favorito. Quando o receipt estiver pronto ou se você tiver um pacote existente, pode compilá-lo:
# cook pkgname
Se tudo correr bem, você encontrará seu pacote no diretório
$SLITAZ/packages e quaisquer arquivos produzidos em
$SLITAZ/wok/pkgname.
Compilar e instalar
Se você quiser compilar e instalar o pacote em um único comando:
# cook pkgname --install
Obter fontes
Se você quiser ou precisar baixar apenas o fonte de um pacote sem compilá-lo,
você pode usar a opção --getsrc como abaixo:
# cook pkgname --getsrc
Limpar pacotes
Após a compilação e empacotamento, há vários arquivos no wok que ocupam espaço em disco. Para limpar um único pacote:
# cook pkgname --clean
Você também pode limpar o wok inteiro de uma vez ou apenas remover os fontes para recuperar espaço em disco:
# cook-clean wok # cook-clean src
Buscar e listar o wok
cook-wok lida com consultas somente leitura no wok. Ele usa
grep e, portanto, suporta expressões regulares:
# cook-wok list # lista pacotes no wok (filtrado por ARCH) # cook-wok search libssh # busca nomes de pacotes # cook-wok uncook # inventário completo de pacotes sem tazpkg # cook-wok wanted gtk # tarefas do cooker para receipts gtk* (incremental) # cook-wok build_depends # idem guiado por BUILD_DEPENDS
Funções de receipt
Muitos pacotes fornecem o mesmo tipo de arquivos, como pacotes *-dev com
bibliotecas estáticas, arquivos pkgconfig e cabeçalhos include. O cook
fornece uma função para ser usada no genpkg_rules de um receipt:
get_dev_files : Instala /usr/lib/{lib.*a,pkgconfig} /usr/include
Lista de BD de pacotes
cook-pkgdb gera o banco de dados de pacotes para o diretório
$PKGS e atualiza o split.db e maint.db
de todo o wok. Isso permite criar um repositório local de pacotes com
bastante facilidade e é usado para criar a lista oficial de pacotes do
SliTaz encontrada nos mirrors. Para criar uma lista de pacotes e os
arquivos de flavors Live:
# cook-pkgdb # reconstrução completa # cook-pkgdb --flavors # reconstrução completa + regenera flavors do TazLiTo # cook-pkgdb --rmpkg # reconstrução completa + remove arquivos tazpkg obsoletos # cook-pkgdb --splitdb # atualiza apenas $cache/split.db # cook-pkgdb --maintdb # atualiza apenas $cache/maint.db
Quando chamado via --flavors, o cook-pkgdb verifica um
repositório de flavors em /home/slitaz/flavors e empacota todos os flavors
usando a lista de pacotes mais recente disponível.
Compilações em lote
cook-all compila pacotes listados em um arquivo de texto puro,
um por linha. Linhas começando com # e linhas em branco são
ignoradas. Sem argumento de arquivo, ./cookorder é tentado
primeiro, depois /etc/slitaz/cookorder:
# cook-all # usa o cookorder padrão # cook-all my.list # compila de uma lista personalizada # cook-all --resume # reinicia uma reconstrução completa interrompida
A flag --resume pula pacotes que já possuem um diretório
taz/, o que permite continuar após uma reconstrução
interrompida sem recompilar o que já foi feito.
Dependências em tempo de execução
cook-deps analisa as dependências em tempo de execução de um
pacote compilado, lendo seu files.list e resolvendo cada
referência de binário, biblioteca compartilhada, pkg-config ou libtool
de volta ao pacote que a fornece:
# cook-deps libssh # saída bonita por sub-pacote # cook-deps libssh -q # uma linha por sub-pacote, amigável a máquinas # cook-deps libssh --incl # também mostra glibc-base / gcc-lib-base
O Cooker
O Cooker é um Robô de Compilação, sua primeira função é verificar commits em um wok, criar uma cooklist ordenada e compilar todos os pacotes modificados. Ele também pode ser usado como interface para o cook, já que ambos usam os mesmos arquivos. O Cooker também pode ser usado para compilar uma grande lista de pacotes de uma vez, como todos os pacotes de um flavor. O Cooker fornece uma boa interface CGI/Web que funciona por padrão em qualquer sistema SliTaz, já que fornece suporte a CGI via o servidor web Busybox httpd.
O Cooker fornece uma pequena ajuda de uso embutida e opções curtas de comando. Por exemplo, para exibir o uso você pode usar:
# cooker usage # cooker -u
Configuração do Cooker
Assim como o cook, o Cooker precisa de um ambiente de trabalho antes de começar a usá-lo. A principal diferença com o ambiente do cook é que o Cooker precisa de 2 woks. Um wok Hg limpo como referência e um wok de compilação. Desta forma é fácil comparar ambos os woks e obter modificações. Se você já tem um ambiente de cook, deve mover seu wok antes de configurar o Cooker ou ele reclamará. O setup também instalará um conjunto de pacotes de desenvolvimento que podem ser configurados no arquivo de configuração cook.conf e na variável SETUP_PKGS. Para configurar seu ambiente do cooker:
# cooker setup
Se tudo correr bem, você agora tem 2 woks, pacotes de desenvolvimento base instalados e todos os arquivos necessários criados. O comportamento padrão é verificar por commits, você pode executar um teste:
# cooker
Cook do Cooker
Novamente, 2 formas de trabalhar agora: fazer alterações no wok Hg limpo e lançar o cooker sem nenhum argumento ou compilar pacotes manualmente. O cooker permite compilar um único pacote ou todos os pacotes de uma categoria ou um flavor. Você também pode tentar compilar todos os pacotes não compilados, mas esteja ciente de que o Cooker não foi projetado para lidar com milhares de pacotes.
Para compilar um único pacote, que é o mesmo que cook pkgname
mas com mais logs:
# cooker pkg pkgname
Para compilar mais de um pacote de uma vez, você tem diferentes tipos de escolhas. Você pode usar um pacote existente como usado para flavors Live, você também pode usar uma lista personalizada usando os nomes de pacotes listados linha por linha. Finalmente, você pode compilar todos os pacotes de uma categoria.
# cooker flavor [nome] # cooker list [/caminho/para/cooklist] # cooker cat [categoria]
O Cooker também permite recompilar uma revisão Hg específica. É útil em produção, para que se o Robô de Compilação foi interrompido enquanto compilava commits, você possa então compilar pacotes manualmente:
# cooker rev 9496
Pacotes bloqueados
O Cook e o Cooker lidam com um arquivo com uma lista de pacotes bloqueados, então eles não compilarão quando commits acontecerem ou se uma cooklist for usada. Isso é muito útil para um Robô de Compilação do Cooker em produção. Quando você bloqueia ou desbloqueia um pacote, pode adicionar uma nota às cooknotes. Exemplo de bloqueio de pacotes:
# cook pkgname --block # cooker block pkgname # cooker -n "Nota sobre bloqueio do pkgname"
A lista de pacotes bloqueados também é exibida na interface web do Cooker. Para desbloquear um pacote você deve usar o comando unblock ou a opção cook --unblock:
# cook pkgname --unblock # cooker unblock pkgname
CGI/Web do Cooker
Para permitir que você visualize arquivos de log de uma forma agradável, mantenha rastro de atividade e ajude a encontrar erros, você pode usar a interface web do Cooker localizada por padrão na pasta /var/www/cooker. Se você não usa um chroot e o servidor web Busybox httpd está rodando, a interface web funcionará sem configuração e deve ser acessível em: http://localhost/cooker/cooker.cgi
Se você usou um ambiente chroot, deve também instalar o cookutils no seu host e modificar a variável de caminho SLITAZ. Uma forma padrão de trabalho é ter um chroot em:
/home/slitaz/cooking/chroot
Com /etc/slitaz/cook.conf modificado como abaixo:
SLITAZ="/home/slitaz/cooking/chroot/home/slitaz"
Nota: Não é obrigatório instalar o cookutils no host para usar a interface web. Se você usa Lighttpd, também pode copiar os arquivos cooker.cgi e style.css, por exemplo, para seu diretório ~/Public e usar um cook.conf personalizado com ele. A vantagem de instalar o cookutils no host é obter atualizações regulares via o gerenciador de pacotes Tazpkg. Digamos que você clonou ou baixou o cookutils:
$ cp -a cookutils/web ~/Public/cgi-bin/cooker $ cp -f cookutils/configs/cook.conf ~/Public/cgi-bin/cooker
Edite o arquivo de configuração: ~/Public/cgi-bin/cooker/cook.conf para definir seu caminho SLITAZ e pronto!
Cooknotes
O recurso cooknotes permite escrever pequenas notas pessoais sobre empacotamento e é útil para colaboração. O cooknotes foi codificado para permitir que os mantenedores do Robô de Compilação SliTaz compartilhem notas entre si e outros contribuidores. O Cooker pode bloquear a compilação de um pacote ou recompilar pacotes manualmente, por exemplo, é bom fazer uma nota se um pacote está bloqueado para que o mantenedor saiba por que o admin fez isso. As cooknotes são exibidas na interface web e podem ser verificadas a partir da linha de comando:
# cooker note "Pacote pkgname bloqueado devido à alta carga de CPU" # cooker notes
Cooker como Robô de Compilação
O Cooker é projetado para ser um Robô de Compilação para o SliTaz, isso significa que ele monitora 2 woks, atualiza o wok Hg, obtém as diferenças e compila todos os pacotes que foram commitados. A forma mais segura e limpa de executar o Cooker como Robô de Compilação com cron é usar um ambiente chroot, mas ele pode rodar diretamente no host se você quiser.
Para executar o Cooker automaticamente você deve usar cron do chroot e adicionar uma única linha aos crontabs do root em /var/spool/cron/crontabs. Digamos que você gostaria de executar o Cooker a cada 2 horas:
* */2 * * * /usr/bin/cooker
Cooker BB iniciado no boot
O ambiente do Cooker e a tarefa cron podem ser iniciados automaticamente ao ligar. Você deve ter o cookutils-daemon instalado no host e usar uma instalação padrão do SliTaz para que funcione corretamente (cooking fica em /home/slitaz/cooking). O script daemon montará quaisquer sistemas de arquivos virtuais se necessário, assim como fontes e pacotes. Os arquivos fonte estão em /home/slitaz/src e montados no chroot para que você possa compartilhar fontes de pacotes entre várias versões (stable, cooking, undigest). Se o pacote ainda não está instalado:
# tazpkg get-install cookutils-daemon
Para iniciar o daemon você deve ter uma definição de arquivo cron para o root no chroot, o script daemon funciona como todos os outros daemons do sistema e pode ser manipulado com:
# /etc/init.d/cooker [start|stop|restart]