Como recriar um arquivo de pacote do pacote instalado?

4

Eu usei o yaourt para criar e instalar com sucesso um pacote AUR, infelizmente perdendo o fato de que, em sua configuração padrão, o pacote compilado é removido após a instalação. Como a compilação demorou cerca de 24 horas e ter o pacote disponível para mais tarde pode ser útil, existe alguma maneira de reconstruir o pacote dos binários instalados em vez de ter que makepkg novamente? Ou, mais geralmente, como isso não é necessariamente yaourt -tied:

How to retrieve a makepkg generated package from the installation and source without having to recompile?

    
por Tobias Kienzler 21.12.2012 / 09:05

3 respostas

1

Graças às dicas na resposta do warl0ck eu escrevi este script fakepkg :

#!/bin/bash
set -e

OLDDIR=$PWD

NEWDIR=$(mktemp -dt fakepack.XXX)
cd $NEWDIR

yaourt -G $1
cd $1

#TODO this can probably be retrieved from the pacman desc file
while true; do
  read -p "Edit PKGBUILD? [yn]" -n1 yn
  case $yn in
    [Yy]* ) $EDITOR PKGBUILD; break;;
    [Nn]* ) echo; break;;
    * ) echo ;;
  esac
done

. PKGBUILD
srcdir=$NEWDIR/$1/src
# In case you are wondering: this tries to compensate for packages not using
# a simple src/packagename-pkgver/ structure. It will probably still break...
PKSUB=$(eval "echo $(grep -o '\${\?srcdir.*pkgver}\?' PKGBUILD | head -n1 )")
SRC=${PKSUB##$NEWDIR/$1/}
echo "Putting the $1 source to $SRC"

PKG=$pkgname-$pkgver
# SRC="src/$PKG/"
FILES="/var/lib/pacman/local/$PKG-$pkgrel/files"

if [ ! -f $FILES ]; then
  echo "$FILES not found, is $1 actually installed?"
  exit 1
fi

#TODO use existing sources or skip this entirely
#     but it's the easiest way to later use makepkg -R
echo "Reloading source"
makepkg -o

echo "Collecting $1 files"
mkdir -p $SRC/files/
while IFS= read -r line; do
  if [ -f "/$line" ]; then
    mkdir -p $SRC/files/$(dirname $line)
    rsync -a /$line $SRC/files/$line
  fi
done < $FILES

echo "Creating fake Makefile"
echo 'install:' > $SRC/Makefile
echo '  mv files/* $(DESTDIR)' >> $SRC/Makefile
rm -f $SRC/GNUmakefile

echo "Creating package"
makepkg -R
mv *.xz $OLDDIR
cd $OLDDIR
rm -rf $NEWDIR

Execute fakepkg packagename , adapte PKGBUILD se necessário e espere por um package---.pak.tar.xz em seu diretório atual.

Há muito espaço para melhorias, claro, por exemplo modificando automaticamente PKGBUILD de acordo com a instalação desc e não baixando a fonte inteira. Mas por enquanto funciona bem o suficiente.

    
por 21.12.2012 / 17:34
4

Há um script que faz parte do pacote pacman chamado bacman que recria um pacote usando o banco de dados do pacman e os arquivos em seu sistema.

Note, entretanto, que tal abordagem deve ser usada apenas como último recurso, já que, por um lado, o pacote possivelmente será diferente devido a modificações nos arquivos após a instalação.

    
por 17.04.2015 / 19:15
2

Eu duvido, mas aqui estão algumas dicas que funcionam para você,

Dependências e arquivos são armazenados em /var/lib/pacman/local/XX-Version/{desc, files} , então não é difícil compactá-los.

A hierarquia no pacote xz deve ser assim:

O .PKGINFO e o .INSTALL (script de pós-instalação) podem ser convertidos do PKGBUILD (que pode ser recuperado por abs ou yaourt).

    
por 21.12.2012 / 09:35