Scroll to navigation

PKGBUILD(5) Manual do pacman PKGBUILD(5)

NOME

PKGBUILD - Arquivo de descrição de compilação de pacotes do Arch Linux

SINOPSE

PKGBUILD

DESCRIÇÃO

Esta página do manual descreve as regras gerais sobre PKGBUILDs. Uma vez que um PKGBUILD é escrito, o pacote real é compilado usando makepkg e instalado com pacman.


Nota

Um exemplo de PKGBUILD, útil para referência, está localizado em /usr/share/pacman junto com outros arquivos de exemplo, como um script de instalação. Você pode copiar o arquivo PKGBUILD.proto fornecido para um novo diretório de compilação de pacote e fazer personalizações para atender às suas necessidades.

OPÇÕES E DIRETIVAS

A seguir está uma lista de opções e diretivas padrão disponíveis para uso em um PKGBUILD. Todos eles são compreendidos e interpretados pelo makepkg, e a maioria deles será transferida diretamente para o pacote compilado. Os campos obrigatórios para um PKGBUILD minimamente funcional são pkgname, pkgver, pkgrel e arch.

Se você precisar criar qualquer variável personalizada para uso em seu processo de compilação, é recomendado prefixar seu nome com um _ (sublinhado). Isso evitará qualquer conflito de nome possível com variáveis internas do makepkg. Por exemplo, para armazenar a versão base do kernel em uma variável, use algo semelhante a $_basekernver.

pkgname (array)

O nome do pacote ou um array de nomes para pacotes divididos. Os caracteres válidos para membros deste array são alfanuméricos e qualquer um dos seguintes caracteres: “@ . _ + -”. Além disso, os nomes não podem começar com hífenes ou pontos.

pkgver

A versão do software conforme lançada pelo autor (por exemplo, 2.7.1). A variável não pode conter dois pontos, barras, hífenes ou espaços em branco.

A variável pkgver pode ser atualizada automaticamente fornecendo uma função pkgver() no PKGBUILD que produz a nova versão do pacote. Isso é executado após o download e a extração de fontes e a execução da função prepare() (se houver), para que possa usar esses arquivos para determinar o novo pacote. Isso é mais útil quando usado com fontes de sistemas de controle de versão (veja abaixo).

pkgrel

Este é o número de lançamento específico para a distribuição. Isso permite que os mantenedores do pacote façam atualizações nos sinalizadores de configuração do pacote, por exemplo. Isso normalmente é definido como 1 para cada nova versão de software upstream e incrementado para atualizações intermediárias de PKGBUILD. A variável é positiva inteiro, com um nível de sub-lançamento opcional especificado pela adição de outro inteiro positivo separado por um ponto (ou seja, na forma x.y).

epoch

Usado para forçar o pacote a ser visto como mais novo do que qualquer versão anterior com uma época inferior, mesmo se o número da versão normalmente não acionaria tal atualização. Este valor deve ser um número inteiro positivo; o valor padrão se não for especificado é 0. Isso é útil quando o esquema de numeração de versão de um pacote muda (ou é alfanumérico), quebrando a lógica de comparação de versão normal. Veja pacman(8) para mais informações sobre comparações de versão.

pkgdesc

Esta deve ser uma breve descrição do pacote e sua funcionalidade. Tente manter a descrição em uma linha de texto e não usar o nome do pacote.

url

Este campo contém uma URL que está associado ao software sendo empacotado. Normalmente é o site do projeto .

license (array)

Este campo especifica a(s) licença(s) que se aplicam ao pacote. As licenças comumente usadas podem ser encontradas em /usr/share/licenses/common. Se você vir a licença do pacote lá, simplesmente faça referência a ela no campo de licença (por exemplo, license=('GPL')). Se o pacote fornecer uma licença não disponível em /usr/share/licenses/common, você deve incluí-la no próprio pacote e definir license=('custom') ou license=('custom:LicenseName'). A licença deve ser colocada em $pkgdir/usr/share/licenses/$pkgname/ ao compilar o pacote. Se várias licenças forem aplicáveis, liste todas elas: license=('GPL' 'FDL').

install

Especifica um script de instalação especial que deve ser incluído no pacote. Este arquivo deve residir no mesmo diretório que o PKGBUILD e será copiado para o pacote por makepkg. Não precisa ser incluído no array de fontes (por exemplo, install=$pkgname.install).

changelog

Especifica um arquivo changelog que deve ser incluído no pacote. O arquivo changelog deve terminar com uma única nova linha. Este arquivo deve residir no mesmo diretório que o PKGBUILD e será copiado para o pacote pelo makepkg. Não precisa ser incluído no array de fontes (por exemplo, changelog=$pkgname.changelog).

source (array)

Um array de arquivos fonte necessários para compilar o pacote. Os arquivos fonte devem residir no mesmo diretório que o PKGBUILD ou ser uma URL totalmente qualificada que o makepkg pode usar para baixar o arquivo. Para simplificar a manutenção de PKGBUILDs, use as variáveis $pkgname e $pkgver ao especificar o local do download, se possível. Os arquivos compactados serão extraídos automaticamente, a menos que sejam encontrados no array noextract descrito abaixo.

Fontes adicionais específicas da arquitetura podem ser adicionadas anexando um sublinhado e o nome da arquitetura, como, por exemplo, source_x86_64=(). Deve haver uma array de integridade correspondente com somas de verificação, por exemplo, cksums_x86_64=().

Também é possível alterar o nome do arquivo baixado, o que é útil com URLs estranhas e para lidar com vários arquivos fonte com o mesmo nome. A sintaxe é: source=('nomedoarquivo::url').

makepkg também oferece suporte à compilação de versões de desenvolvimento de pacotes usando fontes baixadas de sistemas de controle de versão (VCS). Para obter mais informações, consulte Usando fontes VCS abaixo.

Os arquivos no array fonte com extensões .sig, .sign ou .asc são reconhecidos pelo makepkg como assinaturas PGP e serão usados automaticamente para verificar a integridade do arquivo fonte correspondente.

validpgpkeys (array)

Um array de impressões digitais PGP. Se este array não estiver vazio, makepkg só aceitará assinaturas das chaves listadas aqui e irá ignorar os valores de confiança do chaveiro. Se o arquivo fonte foi assinado com uma subchave, makepkg ainda usará a chave primária para comparação.

Somente impressões digitais completas são aceitas. Elas devem estar em maiúsculas e não devem conter caracteres de espaço em branco.

noextract (array)

Um array de nomes de arquivos correspondentes aos do array fonte. Os arquivos listados aqui não serão extraídos com o restante dos arquivos fonte. Isso é útil para pacotes que usam dados compactados diretamente.

cksums (array)

Este array contém somas de verificação CRC para cada arquivo fonte especificado no array de fontes (na mesma ordem). makepkg usará isso para verificar a integridade do arquivo fonte durante as compilações subsequentes. Se SKIP for colocado no array no lugar de um hash normal, a verificação de integridade desse arquivo fonte será ignorada. Para gerar facilmente cksums, execute “makepkg -g >> PKGBUILD”. Se desejar, mova a linha ck5sums para um local apropriado. Note que somas de verificação gerados por "makepkg -g" devem ser verificados usando valores de soma de verificação fornecido pelo desenvolvedor do software.

md5sums, sha1sums, sha224sums, sha256sums, sha384sums, sha512sums, b2sums (arrays)

Verificações de integridade alternativas aceitas pelo makepkg; todos elas se comportam de forma semelhante à opção cksums descrita acima. Para habilitar o uso e geração dessas somas de verificação, certifique-se de configurar a opção INTEGRITY_CHECK em makepkg.conf(5).

groups (array)

Um array de nomes simbólicos que representam grupos de pacotes, permitindo que você instale vários pacotes solicitando um único destino. Por exemplo, pode-se instalar todos os pacotes do KDE instalando o grupo kde.

arch (array)

Define em quais arquiteturas o pacote fornecido está disponível (por exemplo, arch=('i686' 'x86_64')). Pacotes que não contêm arquivos específicos de arquitetura deve usar arch=('any'). Os caracteres válidos para membros desta matriz são alfanuméricos e “_”.

backup (array)

Um array de nomes de arquivo, sem barras no início, cujo backup deve ser feito se o pacote for removido ou atualizado. Isso é comumente usado para pacotes que colocam arquivos de configuração em /etc. Veja "Manipulação de Arquivos de Configuração" em pacman(8) para mais informações.

depends (array)

Um array de pacotes dos quais este pacote depende para executar. As entradas nesta lista devem ser colocadas entre aspas simples e conter pelo menos o nome do pacote. As inscrições também podem incluir um requisito de versão no formato nome<>versão, onde <> é uma das cinco comparações: >= (maior ou igual a), <= (menor ou igual a), = (igual a), > (maior que) ou < (menor que).

Se o nome da dependência parece ser uma biblioteca (termina com .so), makepkg tentará encontrar um binário que dependa da biblioteca no pacote compilado e anexará a versão necessária para o binário. Anexar você mesmo a versão desativa a detecção automática.

Dependências específicas da arquitetura adicionais podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por exemplo, depends_x86_64=().

makedepends (array)

Um array de pacotes dos quais este pacote depende para compilar, mas não são necessários em tempo de execução. Os pacotes nesta lista seguem o mesmo formato que o array depends.

Outros makedepends específicos de arquitetura podem ser adicionados anexando um sublinhado e o nome da arquitetura, por exemplo, makedepends_x86_64=().

checkdepends (array)

Um array de pacotes dos quais este pacote depende para executar seu conjunto de testes, mas não são necessários em tempo de execução. Os pacotes nesta lista seguem o mesmo formato que depends. Essas dependências são consideradas apenas quando a função check() está presente e deve ser executada por makepkg.

Outros checkdepends específicos da arquitetura podem ser adicionados anexando um sublinhado e o nome da arquitetura, por exemplo, checkdepends_x86_64=().

optdepends (array)

Um array de pacotes (e os motivos que os acompanham) que não são essenciais para a funcionalidade básica, mas podem ser necessários para fazer uso completo do conteúdo deste pacote. optdepends são atualmente apenas para fins informativos e não são utilizados pelo pacman durante a resolução de dependência. Os pacotes nesta lista seguem o mesmo formato que depende, com uma descrição opcional anexada. O formato para especificar as descrições optdepends é:

optdepends=('python: for library bindings')

Opções adicionais específicas da arquitetura podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por exemplo, optdepends_x86_64=().

conflicts (array)

Um array de pacotes que entrarão em conflito com este pacote (ou seja, eles não podem ser instalados ao mesmo tempo). Esta diretiva segue o mesmo formato que depends. Conflitos versionados são suportados usando os operadores conforme descrito em depends.

Conflitos específicos de arquitetura adicionais podem ser adicionados anexando um sublinhado e o nome da arquitetura, por exemplo, conflicts_x86_64=().

provides (array)

Um array de “provisões virtuais” que este pacote oferece. Isso permite que um pacote forneça dependências diferentes de seu próprio nome de pacote. Por exemplo, o pacote dcron pode fornecer cron, que permite que os pacotes dependam do cron em vez de dcron OU fcron.

Provisões versionadas também são possíveis, no formato nome=versão. Por exemplo, dcron pode fornecer cron=2.0 para satisfazer a dependência cron>=2.0 de outros pacotes. As disposições que envolvem os operadores > e < são inválidas, pois apenas versões específicas de um pacote podem ser fornecidas.

Se o nome da provisão parecer uma biblioteca (termina com .so), makepkg tentará encontrar a biblioteca no pacote compilado e anexar a versão correta. Anexar você mesmo a versão desativa a detecção automática.

Provisões específicas de arquitetura adicionais podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por exemplo, provides_x86_64=().

replaces (array)

Um array de pacotes que este pacote deve substituir. Isso pode ser usado para lidar com pacotes renomeados/combinados. Por exemplo, se o pacote j2re for renomeado para jre, esta diretiva permite que atualizações futuras continuem conforme o esperado, mesmo que o pacote tenha sido movido. Há suporte a substituições versionadas ao usar os operadores conforme descrito em depends.

O sysupgrade é atualmente a única operação pacman que utiliza este campo. Uma sincronização ou atualização normal não usará seu valor.

Substituições específicas de arquitetura adicionais podem ser adicionadas anexando um sublinhado e o nome da arquitetura, por exemplo, replaces_x86_64=().

options (array)

Este array permite que você substitua alguns dos comportamentos padrão do makepkg ao compilar pacotes. Para definir uma opção, apenas inclua o nome da opção na array de opções. Para reverter o comportamento padrão, coloque um “!” na frente da opção. Especifique apenas as opções que deseja substituir, o resto será obtido de makepkg.conf(5). NOTA: force é uma opção agora removida em favor da variável de nível superior epoch.

strip

Retira símbolos de binários e bibliotecas. Se você usa frequentemente um depurador em programas ou bibliotecas, pode ser útil desabilitar esta opção.

docs

Armazena diretórios de documentação. Se você deseja excluir diretórios doc, especifique !docs no array.

libtool

Deixa arquivos libtool (.la) nos pacotes. Especifique !libtool para removê-los.

staticlibs

Deixa os arquivos de biblioteca estática (.a) nos pacotes. Especifique !staticlibs para removê-los (se eles tiverem uma contraparte compartilhada).

emptydirs

Deixa diretórios vazios nos pacotes.

zipman

Comprime páginas man e info com gzip.

ccache

Permite o uso de ccache durante o build(). Mais útil em sua forma negativa !ccache com pacotes selecionados que têm problemas de compilação com ccache.

distcc

Permite o uso de distcc durante o build(). Mais útil em sua forma negativa !distcc com pacotes selecionados que têm problemas de compilação com distcc.

buildflags

Permite o uso de buildflags específicos do usuário (CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS) durante o build() conforme especificado no makepkg.conf(5). Mais útil em sua forma negativa !buildflags com pacotes selecionados que têm problemas de compilação com buildflags personalizados.

makeflags

Permite o uso de makeflags específicos do usuário durante o build() conforme especificado no makepkg.conf(5). Mais útil em sua forma negativa !makeflags com pacotes selecionados que têm problemas para compilar com makeflags personalizados como -j2 (ou superior).

debug

Adiciona os sinalizadores de depuração especificados pelo usuário (DEBUG_CFLAGS, DEBUG_CXXFLAGS) aos seus buildflags correspondentes, conforme especificado em makepkg.conf(5). Quando usado em combinação com a opção ‘strip’, um pacote separado contendo os símbolos de depuração é criado.

lto

Habilita compilação de pacotes usando otimização em tempo de vinculação (link time optimization). Adiciona -flto a CFLAGS e CXXFLAGS.

FUNÇÕES DE EMPACOTAMENTO

Além das diretivas acima, PKGBUILDs exigem um conjunto de funções que fornecem instruções para compilar e instalar o pacote. No mínimo, o PKGBUILD deve conter uma função package() que instala todos os arquivos do pacote no diretório de empacotamento, com funções opcionais prepare(), build() e check() sendo usadas para criar esses arquivos a partir do código-fonte.

Ele é obtido e executado diretamente pelo makepkg, portanto, qualquer coisa que o Bash ou o sistema tenha disponível está disponível para uso aqui. Certifique-se de que quaisquer comandos exóticos usados ​​sejam cobertos pelo array makedepends.

Se você criar qualquer variável própria em qualquer uma dessas funções, é recomendável usar a palavra-chave local do Bash para definir o escopo da variável dentro da função.

Função package()

A função package() é usada para instalar arquivos no diretório que se tornará o diretório raiz do pacote compilado e é executada após todas as funções opcionais listadas abaixo. O estágio de empacotamento é executado usando fakeroot para garantir as permissões de arquivo corretas no pacote resultante. Todas as outras funções serão executadas como o usuário chamando makepkg.

Função prepare()

Uma função opcional prepare() pode ser especificada na qual operações para preparar fontes para compilação, como aplicação de patches, são realizadas. Esta função é executada após a extração de fonte e antes da função build(). A função prepare() é ignorada quando a extração de fonte é ignorada.

Função build()

A função opcional build() é usada para compilar e/ou ajustar os arquivos fontes na preparação para serem instalados pela função package().

Função check()

Uma função opcional check() pode ser especificada na qual um conjunto de testes do pacote pode ser executado. Esta função é executada entre as funções build() e package(). Certifique-se de que todos os comandos exóticos usados ​​sejam cobertos pelo array checkdepends.

Todas as variáveis ​​acima, como $pkgname e $pkgver, estão disponíveis para uso nas funções de empacotamento. Além disso, makepkg define as seguintes variáveis:

srcdir

Contém o diretório onde makepkg extrai, ou copia, todos os arquivos fonte.

Todas as funções de empacotamento definidas acima são executadas de dentro de $srcdir

pkgdir

Contém o diretório onde makepkg empacota o pacote instalado. Este diretório se tornará o diretório raiz do seu pacote compilado. Esta variável deve ser usada apenas na função package().

startdir

Contém o caminho absoluto para o diretório onde o PKGBUILD está localizado, que normalmente é a saída de $(pwd) quando o makepkg é iniciado. O uso desta variável foi descontinuado e fortemente desencorajado.

DIVISÃO DE PACOTES

makepkg oferece suporte à compilação de múltiplos pacotes de um único PKGBUILD. Isso é obtido atribuindo um array de nomes de pacotes à diretiva pkgname. Cada pacote dividido usa uma função de empacotamento correspondente com o nome package_foo(), onde foo é o nome do pacote dividido.

Todas as opções e diretivas para os pacotes divididos são padronizados para os valores globais fornecidos no PKGBUILD. No entanto, os seguintes podem ser substituídos dentro da função de empacotamento de cada pacote dividido: pkgdesc, arch, url, license, groups, depends, optdepends, provides, conflicts, replaces, backup, options, install e changelog.

Note que makepkg não considera as dependências de um pacote dividido específico ao verificar se as dependências estão instaladas antes da compilação do pacote e com --syncdeps. Todos os pacotes necessários para compilar o pacote devem ser especificados nos arrays globais depends e makedepends.

Uma diretiva global opcional está disponível ao compilar um pacote dividido:

pkgbase

O nome usado para se referir ao grupo de pacotes na saída do makepkg e na nomenclatura de tarballs apenas com o código-fonte. Se não for especificado, o primeiro elemento no array pkgname é usado. Os caracteres válidos para esta variável são alfanuméricos e qualquer um dos seguintes caracteres: “@ . _ + -”. Além disso, a variável não pode começar com hífenes ou pontos.

SCRIPT DE INSTALAÇÃO/ATUALIZAÇÃO/REMOÇÃO

Pacman tem a capacidade de armazenar e executar um script específico do pacote ao instalar, remover ou atualizar um pacote. Isso permite que um pacote se configure após a instalação e execute uma ação oposta na remoção.

A hora exata em que o script é executado varia com cada operação e deve ser autoexplicativa. Observe que durante uma operação de atualização, nenhuma das funções de instalação ou remoção será chamada.

Os scripts são passados ​​por uma ou duas “strings de versão completa”, onde uma string de versão completa é pkgver-pkgrel ou epoch:pkgver-pkgrel, se epoch for diferente de zero.

pre_install

Executa imediatamente antes dos arquivos serem extraídos. Um argumento é passado: string de versão completa do pacote novo.

post_install

Executa imediatamente após os arquivos serem extraídos. Um argumento é passado: string de versão completa do pacote novo.

pre_upgrade

Executa imediatamente antes dos arquivos serem extraídos. Dois argumentos são passados ​​nesta ordem: string da versão completa do pacote novo, string da versão completa do pacote antigo.

post_upgrade

Executa após os arquivos serem extraídos. Dois argumentos são passados ​​nesta ordem: string da versão completa do pacote novo, string da versão completa do pacote antigo.

pre_remove

Executa imediatamente antes dos arquivos serem removidos. Um argumento é passado: string de versão completa do pacote antigo.

post_remove

Executa logo após os arquivos serem removidos. Um argumento é passado: string de versão completa do pacote antigo.

Para usar esse recurso, crie um arquivo como pkgname.install e coloque-o no mesmo diretório do script PKGBUILD. Em seguida, use a diretiva de instalação:

install=pkgname.install

O script de instalação não precisa ser especificado no array de fontes. Um arquivo de instalação de modelo está disponível em /usr/share/pacman como proto.install para referência com todas as funções disponíveis definidas.

USANDO FONTES VCS

A compilação de uma versão de desenvolvimento de um pacote usando fontes de um sistema de controle de versão (VCS) é habilitada especificando a fonte no formato:

source=('diretório::url#fragmento?consulta')

Atualmente, o makepkg tem suporte aos sistemas de controle de versão Bazaar, Git, Subversion, Fossil e Mercurial. Para outros sistemas de controle de versão, a clonagem manual dos repositórios upstream deve ser feita na função prepare().

O URL de fonte é dividido em quatro componentes:

diretório

(opcional) Especifica um nome de diretório alternativo para makepkg para baixar o código-fonte de VCS.

url

A URL para o repositório VCS. Isso deve incluir o VCS no protocolo de URL para makepkg para reconhecê-lo como uma fonte VCS. Se o protocolo não incluir o nome VCS, ele pode ser adicionado prefixando a URL com vcs+. Por exemplo, usar um repositório Git sobre HTTPS teria uma URL de fonte no formato: git+https://....

fragmento

(opcional) Permite especificar um número de revisão ou branch para makepkg para checkout do VCS. Um fragmento tem o formato tipo=valor.Por exemplo, para fazer o checkout de uma determinada revisão, a linha de fonte teria o formato source=(url#revision=123). Os tipos disponíveis dependem do VCS sendo usado:

bzr

revisão (veja 'bzr help revisionspec' para detalhes)

fossil

branch, commit, tag

git

branch, commit, tag

hg

branch, revisão, tag

svn

revisão

consulta

(opcional) Permite especificar se um checkout VCS deve ser verificado para revisões assinadas por PGP. A linha de origem deve ter o formato source=(url#fragmento?assinada) ou source=(url?assinada#fragmento). Atualmente há suporte apenas para Git.

EXEMPLO

A seguir está um exemplo de PKGBUILD para o pacote com patch. Para mais exemplos, dê uma olhada nos arquivos de compilação dos pacotes de sua distribuição. Para quem está usando Arch Linux, consulte a árvore do Sistema de Compilação do Arch (ABS).

# Maintainer: João Usuário <joao.usuario@example.com>
pkgname=patch
pkgver=2.7.1
pkgrel=1
pkgdesc="A utility to apply patch files to original sources"
arch=('i686' 'x86_64')
url="https://www.gnu.org/software/patch/patch.html"
license=('GPL')
groups=('base-devel')
depends=('glibc')
makedepends=('ed')
optdepends=('ed: for "patch -e" functionality')
source=("ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz"{,.sig})
md5sums=('e9ae5393426d3ad783a300a338c09b72'

'SKIP') build() {
cd "$srcdir/$pkgname-$pkgver"
./configure --prefix=/usr
make } package() {
cd "$srcdir/$pkgname-$pkgver"
make DESTDIR="$pkgdir/" install }

VEJA TAMBÉM

makepkg(8), pacman(8), makepkg.conf(5)

Consulte o site do pacman em https://archlinux.org/pacman/ para obter informações atuais sobre o pacman e suas ferramentas relacionadas.

BUGS

Bugs? Você deve estar brincando; não há erros neste software. Mas se por acaso estivermos errados, envie um relatório de erro com o máximo de detalhes possível no rastreador de erros do Arch Linux na seção Pacman.

AUTORES

Atuais mantenedores:

•Allan McRae <allan@archlinux.org>

•Andrew Gregory <andrew.gregory.8@gmail.com>

•Eli Schwartz <eschwartz@archlinux.org>

•Morgan Adamiec <morganamilo@archlinux.org>

Principais colaboradores anteriores:

•Judd Vinet <jvinet@zeroflux.org>

•Aurelien Foret <aurelien@archlinux.org>

•Aaron Griffin <aaron@archlinux.org>

•Dan McGee <dan@archlinux.org>

•Xavier Chantry <shiningxc@gmail.com>

•Nagy Gabor <ngaba@bibl.u-szeged.hu>

•Dave Reisner <dreisner@archlinux.org>

Para outros contribuidores, use git shortlog -s no repositório pacman.git.

TRADUÇÃO

A tradução para português brasileiro desta página man foi criada por Rafael Fontenelle <rafaelff@gnome.org>

Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.

Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores.

29 outubro 2024 Pacman 6.0.2