Gerando pacotes do Slackware

Publicado por Douglas Giorgio Fim (última atualização em 14/07/2011)

[ Hits: 6.111 ]

Homepage: http://freebsdwallpapers.blogspot.com/

Download dgfpacote

Download 1299662236.dgfpacote (versão 2)

Download 1299958911.dgfpacote (versão 3)




Este script foi desenvolvido para gerar pacotes .txz "Slackware" diretamente do código fonte.

Para saber as opções do script use o parâmetro -h:

./dgfpacote -h

  



Versões atualizadas deste script

Versão 2 - Enviado por Douglas Giorgio Fim em 09/03/2011

Changelog: Agora com bugs corrigidos e script mais completo

suporte da compilação do kernel foi removido, o suporte será novamente adicionado assim que essa função estiver 100% funcional e sem bugs

Download 1299662236.dgfpacote


Versão 3 - Enviado por Douglas Giorgio Fim em 12/03/2011

Changelog: Agora com diversos bugs resolvidos e mais funcional

criticas e sugestões, por favor, faça um comentário

duvidas, consulte o help do script

./dgfpacote -h

Download 1299958911.dgfpacote


Esconder código-fonte

#!/bin/bash
# -----------------------------------------------------------------------
# - Feito por: Douglas Giorgio Fim               -
# - E-mail: dgf_skt@hotmail.com                  -
# - MSN: dgf_skt@hotmail.com                  -
# - Programa: dgfpacote                     -
# - Versao: 2.0                        -
# -                           -
# - Este script pode ser alterado e distribuido por qualquer pessoa,   -
# - desde que este quadro se mantenha inalterado!         -
# -                            -
# - Obs.: Este script foi desenvolvido para gerar pacotes .txz "Slackware" diretamente do codigo fonte   -
# -----------------------------------------------------------------------


PWD=`pwd`
ARCH=`arch`
DGFBASETMP=/tmp/DGF/TMP
DGFBASE=/tmp/DGF/PKG
PKG=""
DIR=""

if [ ! -z $DGFBASE ]; then
  mkdir -p "$DGFBASE"
fi

if [ ! -z $DGFBASETMP ]; then
  mkdir -p "$DGFBASETMP"
fi

if [ "$ARCH" = "x86_64" ]; then
  if [ -d /usr/lib64 ]; then
    LIB=/usr/lib64
  else
    LIB=/usr/lib
  fi
else
  LIB=/usr/lib
fi

#########################################
# Inicio das Funções
#########################################

HELP() {
echo -e "
Este script foi desenvolvido para gerar pacotes .txz \"Slackware\" diretamente do codigo fonte. Ele é compativel com os seguintes pacotes:
.tar.gz
.tgz
.tar.bz2
.tar
.bz2
.rar
.zip

Formas de uso:
  dgfpacote pacote.tar.gz

Caso ja tenha o pacote descompactado, você pode escolher uma <opções> para setar o diretorio e dar sequencia na criação do pacote, compilar kernel e limpar os restos.

  dgfpacote <opções> \"diretorio\pacote\"

<opções>
  \e[1;01m-c\e[0m - da sequencia na criação do pacote a partir do \e[1;01m./configure\e[0m
  \e[1;01m-m\e[0m - da sequencia na criação do pacote a partir do \e[1;01mmake\e[0m
  \e[1;01m-mi\e[0m - da sequencia na criação do pacote a partir do \e[1;01mmake install\e[0m
  \e[1;01m-mp\e[0m - da sequencia na criação do pacote a partir do \e[1;01mmakepkg\e[0m
  \e[1;01m-mk\e[0m - gera um pacote do kernel a partir do fonte \e[1;01m\"USE SOMENTE PACOTES DO FONTE\"\e[0m 
  \e[1;01m-l\e[0m - limpa/remove os arquivos temporarios
  \e[1;01m-lp\e[0m - limpa/remove o os pacotes criados
  \e[1;01m-h\e[0m - HELP!

É necessário estar logado como root para o funcionamento perfeito do script

Douglas Giorgio Fim
"
}

AVISO() {
echo -e "\e[1;01m############################################################\e[0m"
echo -e "\e[1;01m$1\e[0m"
echo -e "\e[1;01m############################################################\e[0m"
}

ERRO() {
  echo "[ERRO!] O script foi interrompido no processo: $1"
  exit 1
}

DESCOMPACTA() {
  VERIFICA(){
    if [ -d "$DGFBASETMP/$DIRETORIO" ]; then
      echo -n "O diretório já existe, deseja continuar a extração? [N/y] " ; read -n 1 RESPOSTA_VERIFICA
      if [ "$RESPOSTA_VERIFICA" = "" ]; then
   RESPOSTA_VERIFICA=n
      fi
     else
      RESPOSTA_VERIFICA=y
    fi
    RESPOSTA_VERIFICA=`echo $RESPOSTA_VERIFICA | tr [A-Z] [a-z]`
  }
case $PKG in
  *.tar.gz) COMPACTACAO=.tar.gz ; DIRETORIO=`tar -tvf $DIR/$PKG | awk 'NR == 1{print $6}' | sed 's/\(.*\)\/\(.*\)/\1/'` ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then tar -xzvf $DIR/$PKG -C $DGFBASETMP ; fi ;;
  *.tgz) COMPACTACAO=.tar.gz ; DIRETORIO=`tar -tvf $DIR/$PKG | awk 'NR == 1{print $6}' | sed 's/\(.*\)\/\(.*\)/\1/'` ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then tar -xzvf $DIR/$PKG -C $DGFBASETMP ; fi ;;
  *.tar.bz2) COMPACTACAO=.tar.bz2 ; DIRETORIO=`tar -tvf $DIR/$PKG | awk 'NR == 1{print $6}' | sed 's/\(.*\)\/\(.*\)/\1/'` ; VERIFICA ; if [ "$RESPOSTA_VERIFICA" = y ]; then tar -xjvf $DIR/$PKG -C $DGFBASETMP ; fi ;;
  *.tar) COMPACTACAO=.tar ; DIRETORIO=`tar -tvf $DIR/$PKG | awk 'NR == 1{print $6}' | sed 's/\(.*\)\/\(.*\)/\1/'` ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then tar -xvf $DIR/$PKG -C $DGFBASETMP ; fi ;;
  *.bz2) COMPACTACAO=.bz2 ; DIRETORIO=`echo $DIR/$PKG | sed -e 's/'$COMPACTACAO'//g'` ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then bunzip $DIR/$PKG $DGFBASETMP || bunzip2 $pkg ; fi ;;
  *.rar) COMPACTACAO=.rar ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then unrar x $DIR/$PKG $DGFBASETMP ; fi ;;
  *.zip) COMPACTACAO=.zip ; VERIFICA ; if [ $RESPOSTA_VERIFICA = y ]; then gunzip $DIR/$PKG $DGFBASETMP ; fi ;;
esac
}

CONFIGURE() {
  CONFIGURE2() {
    if [ -e ./configure ]; then
      ./configure --help || ./configure -help
      COMANDO="./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --libdir=$LIB "
      echo -n "Acrescente os parametros que desejar: $COMANDO" ; read PARAMETROS

      COMANDO="./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --libdir=$LIB $PARAMETROS" && 
      AVISO "$COMANDO" && 
      ./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --libdir=$LIB $PARAMETROS #|| 
#      COMANDO="./configure --prefix=/usr --libdir=$LIB $PARAMETROS" && 
#      AVISO "$COMANDO" && 
#      ./configure --prefix=/usr --libdir=$LIB $PARAMETROS || 
#      COMANDO="./configure --prefix=/usr $PARAMETROS" && 
#      AVISO "$COMANDO" && 
#      ./configure --prefix=/usr $PARAMETROS || ERRO "$COMANDO"
    fi 
  }
  if [ -e $DGFBASETMP/$DIRETORIO/configure ]; then
    cd $DGFBASETMP/$DIRETORIO
    CONFIGURE2
  elif [ -e $DGFBASETMP/$DIRETORIO/src/configure ]; then
    cd $DGFBASETMP/$DIRETORIO/src
    CONFIGURE2
  fi
}

MAKE() {
  MAKE2() {
    echo -n "Acrescente os parametros que desejar no make: " ; read PARAMETROS_MAKE
    COMANDO="make $PARAMETROS_MAKE"
    AVISO "$COMANDO"
    make $PARAMETROS_MAKE || ERRO $COMANDO
  }
  if [ -e $DIR/$DIRETORIO/Makefile ]; then
    MAKE2
  elif [ -e $DIR/$DIRETORIO/src/Makefile ]; then
    cd $DIR/src
    MAKE2
  fi
}

MAKEKERNEL() {
  MAKEKERNEL2() {
    COMANDO="make clean"
    AVISO "$COMANDO"
    make clean || ERRO $COMANDO
    COMANDO="mrproper"
    AVISO "$COMANDO"
    make mrproper || ERRO $COMANDO
    while [ ! -f "$DGFBASETMP/$DIRETORIO/.config" ]; do
      echo "[1] make menuconfig - PADRÃO!"
      echo "[2] make oldconfig "
      echo "[3] make config"
      echo "[4] make xconfig"
      echo "Escolha um modo de configuração: " ; read -n 1 ESCOLHA_CONFIG
      if [ "$ESCOLHA_CONFIG" = "" ]; then
   ESCOLHA_CONFIG=1
      fi
      case $ESCOLHA_CONFIG in
   1)COMANDO="make menuconfig"
     AVISO "$COMANDO"
     make menuconfig || ERRO $COMANDO ;;
   2)COMANDO="make oldconfig"
     AVISO "$COMANDO"
     make oldconfig || ERRO $COMANDO ;;
   3)COMANDO="make config"
     AVISO "$COMANDO"
     make config || ERRO $COMANDO ;;
   4)COMANDO="make xconfig"
     AVISO "$COMANDO"
     make xconfig || ERRO $COMANDO ;;
      esac
    done
    COMANDO="make"
    AVISO "$COMANDO"
    make || ERRO $COMANDO
    COMANDO="make bzImage"
    AVISO "$COMANDO"
    make bzImage
    COMANDO="make modules"
    AVISO "$COMANDO"
    make modules || ERRO $COMANDO
    COMANDO="make targz-pkg"
    AVISO "$COMANDO"
    make targz-pkg
    cd "$DGFBASETMP/$DIRETORIO"
    NUM=1
    NOME_PKG=$DIRETORIO-$ARCH-$NUM.tgz
    while [ -e ../$NOME_PKG ]; do
      let NUM++
      NOME_PKG=$DIRETORIO-$ARCH-$NUM.tgz
    done
    mv $DIRETORIO.tar.gz $DGFBASE/$NOME_PKG
    DIR2=`echo $DIRETORIO`-TMP
    mkdir $DGFBASETMP/$DIR2
  }
  if [ -e $DGFBASETMP/$DIRETORIO/Makefile ]; then
    cd $DGFBASETMP/$DIRETORIO
    MAKEKERNEL2
  elif [ -e $DGFBASETMP/$DIRETORIO/src/Makefile ]; then
    cd $DGFBASETMP/$DIRETORIO/src
    MAKEKERNEL2
  fi
}


MAKE_INSTALL() {
  MAKE_INSTALL2() {
    PARAMETRO_MAKE_INSTALL="INSTALL_TOP=$1 PREFIX=$1 DESTDIR=$1 INSTALL_ROOT=$1 PREFIX_ROOT=$1"
    COMANDO="make install $PARAMETRO_MAKE_INSTALL"
    AVISO "$COMANDO"
    make install ""$PARAMETRO_MAKE_INSTALL""  || ERRO "$COMANDO"
  }
  cd $DGFBASETMP/$DIRETORIO
  DIR2=`echo $DIRETORIO`-TMP
  mkdir $DGFBASETMP/$DIR2
  MAKE_INSTALL2 "$DGFBASETMP/$DIR2"
}


MAKEPKG(){
  cd $DGFBASETMP/$DIR2
  NUM=1
  NOME_PKG=$DIRETORIO-$ARCH-$NUM.txz

  while [ -e $DGFBASE/$NOME_PKG ]; do
    let NUM++
    NOME_PKG=$DIRETORIO-$ARCH-$NUM.txz
  done

  COMANDO="makepkg -l y -c n $DGFBASE/$NOME_PKG"
  AVISO $COMANDO
  makepkg -l y -c n $DGFBASE/$NOME_PKG || ERRO "$COMANDO"
  PACOTE_INSTALADO=`for i in /var/log/packages/* ; do echo $i | sed -e 's/\(.*\)-\(.*\)-\(.*\)-\(.*\)/\1/;s/[ ]//g;s/\(.*\)\/\(.*\)/\2/;s/[ ]//g' ;done`
  PACOTE_INSTALAR=`echo "$DIRETORIO" | sed -e 's/\(.*\)-\(.*\)/\1/;s/[ ]//g'`
  VERIFICACAO_PACOTE=`echo $PACOTE_INSTALADO | grep -w "$PACOTE_INSTALAR"`

  if [ "$VERIFICACAO_PACOTE" = "" ]; then
    if [ -e $DGFBASE/$NOME_PKG ]; then
      RESPOSTA="errada"
      while [ "$RESPOSTA" = "errada" ]; do
   echo -n "Deseja instalar o pacote? $DGFBASE/$NOME_PKG [S/n] : " ; read -n 1 RESPOSTA
   RESPOSTA=`echo $RESPOSTA | tr A-Z a-z`
   if [ -z $RESPOSTA ]; then
     RESPOSTA=s
   fi
   case $RESPOSTA in
     [ys]) AVISO "installpkg $DGFBASE/$NOME_PKG" ; installpkg $DGFBASE/$NOME_PKG ;;
     n) echo ;;
     *) RESPOSTA="errada" ;;
   esac
      done
    fi
  else
    if [ -e $DGFBASE/$NOME_PKG ]; then
      RESPOSTA="errada"
      while [ "$RESPOSTA" = "errada" ]; do
   echo -ne "Existe outro pacote \e[1;01m\"$PACOTE_INSTALAR\"\e[0m instalado, deseja atualizar? $DGFBASE/$NOME_PKG [S/n] : " ; read -n 1 RESPOSTA
   RESPOSTA=`echo $RESPOSTA | tr A-Z a-z`
   if [ -z $RESPOSTA ]; then
     RESPOSTA=s
   fi
   case $RESPOSTA in
     [ys]) AVISO "upgradepkg $DGFBASE/$NOME_PKG" ; upgradepkg $DGFBASE/$NOME_PKG ;;
     n) echo ;;
     *) RESPOSTA="errada" ;;
   esac
      done
    fi
  fi


}

LIMPA() {
  RESPOSTA2="errada"
  while [ "$RESPOSTA2" = "errada" ]; do
    echo "Deseja excluir os restos? "\"$DGFBASETMP/$DIRETORIO\" \"$DGFBASETMP/$DIR2\"" [S/n]" ; read -n 1 RESPOSTA2
    echo
    RESPOSTA2=`echo $RESPOSTA2 | tr A-Z a-z`
    if [ -z $RESPOSTA2 ]; then
      RESPOSTA2=s
    fi

    case $RESPOSTA2 in
      [ys]) rm -rv $DGFBASETMP/$DIRETORIO ; rm -rf $DGFBASETMP/$DIR2 ;;
      n) echo ;;
      *) RESPOSTA2="errada" ;;
    esac
  done 
}

#########################################
# Fim das Funções
#########################################

case $1 in
  -c) if [ -d $2 ]; then
   cd $2
   VAR=$2
   if [ $VAR = './' ]; then
     VAR=$PWD
   fi
      else
   echo "Diretorio invalido!" ; exit 1
      fi
      DIR=`dirname $VAR`
      PKG=`basename $VAR`
      DIRETORIO=$PKG
      CONFIGURE
      MAKE
      MAKE_INSTALL
      MAKEPKG
      LIMPA
      AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG" ;;

  -m) if [ -d $2 ]; then
   cd $2
   VAR=$2
   if [ $VAR = './' ]; then
     VAR=$PWD
   fi
      else
   echo "Diretorio invalido!" ; exit 1
      fi
      DIR=`dirname $VAR`
      PKG=`basename $VAR`
      DIRETORIO=$PKG
      MAKE 
      MAKE_INSTALL
      MAKEPKG
      LIMPA
      AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG" ;;

  -mk) if [ -n $2 ]; then
   if [ -d $2 ]; then
     DIR=`dirname $2`
     PKG=`basename $2`
     DIRETORIO=$PKG
     MAKEKERNEL ; LIMPA
   else
     DIR=`dirname $2`
     PKG=`basename $2`
     DIRETORIO=$PKG
     DESCOMPACTA 
     MAKEKERNEL 
     LIMPA
     AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG"
   fi
      fi ;;

  -mi)if [ -d $2 ]; then
   cd $2
   VAR=$2
   if [ $VAR = './' ]; then
     VAR=$PWD
   fi
      else
   echo "Diretorio invalido!" ; exit 1
      fi
      DIR=`dirname $VAR`
      PKG=`basename $VAR`
      DIRETORIO=$PKG
      MAKE_INSTALL 
      MAKEPKG 
      LIMPA
      AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG" ;;

  -mp)if [ -d $2 ]; then
   cd $2
   VAR=$2
   if [ $VAR = './' ]; then
     VAR=$PWD
   fi
      else
   echo "Diretorio invalido!" ; exit 1
      fi
      DIR=`dirname $VAR`
      DIR2=`basename $VAR`
      DIRETORIO=$PKG
      MAKEPKG 
      LIMPA
      AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG" ;;      

  -l) AVISO "rm -rf $DGFBASETMP/*" ; rm -rf $DGFBASETMP/* ;;

  -lp) AVISO "rm -rf $DGFBASE/*" ; rm -rf $DGFBASE/* ;;

  -h) HELP ;;

  *)
    DIR=`dirname $1`
    PKG=`basename $1`

    DESCOMPACTA
    CONFIGURE
    MAKE
    MAKE_INSTALL
    MAKEPKG
    LIMPA
    AVISO "O pacote permanece em: $DGFBASE/$NOME_PKG"
    exit 1 ;;
esac
exit 1

Scripts recomendados

Sincronia com o rsync

Space invaders

Alteração de Senha do Mysql (sem saber a senha anterior).

Liberar cliente SSH no firewall

Fluxbox - Slideshow de wallpapers aleatórios


  

Comentários
[1] Comentário enviado por removido em 27/08/2010 - 06:06h

Muito Bom!!!
Gostei muito

[2] Comentário enviado por Fellype em 14/07/2011 - 11:48h

A ideia é boa. É como se fosse um SlackBuild genérico. Mas é necessário especificar em que situações esse script funciona, pois não se pode aplicá-lo a todas as situações possíveis.
Aparentemente ele não funciona com programas que não geram o Makefile através do ./configure ou que não possuem um Makefile 'pré-preparado'.
Exemplos disso são os programas em que a configuração é feita com o comandos qmake e cmake. O qwt (http://qwt.sourceforge.net/) é um exemplo de programa que usa o qmake.

[3] Comentário enviado por douglas.giorgio em 14/07/2011 - 14:31h

ele não é compativel com todos os tipos de compilação, somente os mais comuns, quando não funciona, eu compilo na mão e uso ele para gerar o pacote

[4] Comentário enviado por dark777 em 28/03/2016 - 00:25h

Fera o que vc acha de incluir as funççoes para trabalhar com os tarbals .tar.xz e .zip? pois há muitos codigos fontes compactaos com esta extensão o interessante é se ele realizar dependencias no futuro assim virando um completo instalaor de pacotes com repositorio ao invés de ser apenas um gerador do mesmo ...


Contribuir com comentário