Repository 32bit  Forum
Repository 64bit  Wiki

BASH - script per pacchettizzare in serie ;)

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

BASH - script per pacchettizzare in serie ;)

Messaggioda danix » ven mag 28, 2010 10:30

Ciao a tutti, eccomi qui con l'ennesimo thread su bash :)
Questa volta vorrei portare alla vostra attenzione uno script che ho preparato per compilare in sequenza ordinata una serie di slackbuild, ovviamente non prescinde dal lavoro del packager che dovrà comunque preparare le directory con dentro i vari Slackbuild, slack-desc, sorgenti (opzionale), ecc.

Questo script si offre però di facilitare il lavoro in quanto non richiede al packager di lanciare manualmente ogni slackbuild e poi installare, se necessario, i pacchetti creati uno ad uno per soddisfare di volta in volta le dipendenze del pacchetto successivo.

Prendiamo ad esempio mplayer, che per come lo si compila di solito su slacky ha una bella lista di dipendenze, con questo script basterà creare un file ".queue" e mettere in sequenza i pacchetti così come dovranno essere compilati. Poi bisognerà organizzare una directory contenente una subdir per ogni pacchetto che si vorrà creare, dentro ogni subdir andremo a mettere tutti i files necessari alla compilazione di quel pacchetto (così come sono nel repo di slacky), ritoccheremo lo slackbuild e saremo pronti a lanciare lo script.
Una volta finita la compilazione ci ritroveremo in $OUTPUT i pacchetti creati, e nella dir principale un log per ogni pacchetto con tutte le fasi della compilazione.

Questo è lo script multibuilder:
Codice: Seleziona tutto
#! /bin/bash

# multiBuilder - script che consente l'esecuzione di una serie di SlackBuild
#        contenuti in varie subdirectory della dir in cui viene
#       lanciato. Consente la modifica al volo di alcuni parametri
#
# Copyright 2010 Danilo 'danix' Macrì  < danix@danixland.net  >
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software for any purpose
# with or without fee is hereby granted, provided that the above copyright
# notice and this permission notice appear in all copies.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# AUTHORS AND COPYRIGHT HOLDERS AND THEIR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

### VARIABILI
CWD=$(pwd)
E_QUEUEFILE_UNKNOWN=71
E_NO_QUEUEFILE_FOUND=72
E_QUEUEFILE_DONT_EXISTS=73
E_NO_SB_OR_SD=74
E_QUEUE_NO_DIR=75

### FUNZIONI

check_reqs ()
{
  if [ ! -r ./$PROGRAM.SlackBuild ] || [ ! -r ./slack-desc ];then
    echo "DIRECTORY $PROGRAM DOESN'T CONTAIN (AT LEAST) A SLACKBUILD SCRIPT"
    echo "AND A SLACK-DESC FILE. CANNOT CONTINUE - EXITING"
    exit $E_NO_SB_OR_SD
  fi
}




### se esiste un argomento prendo quello come file coda, altrimenti
### controllo nella directory corrente, oppure esco con errore.
if [ ! -z $1 ];then
  if [ -r $1 ];then
    if [[ $1 == *".queue" ]] && [[ -r $1 ]];then
      echo "Using $1 as queue file"
      . $1
    else
      echo "FILE $1 UNKNOWN OR NOT READABLE - QUEUE FILES MUST END WITH .queue - EXITING"
      exit $E_QUEUEFILE_UNKNOWN
    fi
  else
    echo "QUEUE FILE $1 DOES NOT EXISTS - EXITING"
    exit $E_QUEUEFILE_DONT_EXISTS
  fi
elif [ -r $CWD/PKGS.queue ];then
  QUEUEFILE=$CWD/PKGS.queue
  echo "using $CWD/PKGS.queue as queue file"
  . $QUEUEFILE
else
  echo "QUEUE FILE NOT FOUND - EXITING"
  exit $E_NO_QUEUEFILE_FOUND
fi

### verifico che tutti i pacchetti in coda abbiano una directory
### propria, all'interno di questa ci siano: uno slackbuild e uno
### slack-desc come requisito minimo.
### Se è tutto ok lancio gli SlackBuild
for PROGRAM in $PROGRAMS;
do
  echo "Checking directory $PROGRAM"
  if [ -d $PROGRAM ];then
    cd $PROGRAM
    check_reqs
    sleep 2
    ARCH=$ARCH VERSION=$VERSION BUILD=$BUILD sh $PROGRAM.SlackBuild |tee $CWD/$PROGRAM-sb.log
    cd ..
  else
    echo "$PROGRAM IS NOT A DIRECTORY - EXITING"
    exit $E_QUEUE_NO_DIR
  fi
done

Questo è un file .queue:
Codice: Seleziona tutto
#! /bin/bash

# multiBuilder - script che consente l'esecuzione di una serie di SlackBuild
#        contenuti in varie subdirectory della dir in cui viene
#       lanciato. Consente la modifica al volo di alcuni parametri
#
# Copyright 2010 Danilo 'danix' Macrì  < danix@danixland.net  >
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software for any purpose
# with or without fee is hereby granted, provided that the above copyright
# notice and this permission notice appear in all copies.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# AUTHORS AND COPYRIGHT HOLDERS AND THEIR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

### PKGS.queue - in questo script vengono impostati in sequenza i pacchetti da
###              compilare nell'ordine in cui sono scritti.
###              Vengono impostate anche le variabili di compilazione.

### EXAMPLE
### La variabile PROGRAMS contiene i nomi dei pacchetti da compilare
#PROGRAMS=" \
#  sb01 \
#  sb02 \
#  sb03 \
#  sb04 \
#  sb05 "

### VARIABILI
### Si tratta delle stesse variabili presenti negli SB di Slacky.
### Queste variabili hanno valore rispetto a quelle negli SB.
ARCH=1486
VERSION=1555
BUILD=3


L'ho preparato ieri senza testarlo molto, quindi ditemi che ne pensate ;)
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda ZeroUno » ven mag 28, 2010 10:50

E se alla coda aggiungi una funzioncina che da una occhiata agli slack-required così io gli do una lista di pacchetti e l'ordine di compilazione se lo imposta lui?

E se gestisse bene le dipendenze, gli si potrebbe anche far lanciare le compilazioni in parallelo.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4387
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda Blallo » ven mag 28, 2010 10:52

è quello che pensavo anche io
magari gli SB ce li vedrei bene impacchettati che so in tar.bz2, se li scompatta in una temp, analizza il required e ricorsivamente compila le dipendenze (a due a due magari, troppe in parallelo non mi sembra il caso)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3222
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda ZeroUno » ven mag 28, 2010 11:00

jimmy_page_89 ha scritto:è quello che pensavo anche io
magari gli SB ce li vedrei bene impacchettati che so in tar.bz2, se li scompatta in una temp, analizza il required e ricorsivamente compila le dipendenze (a due a due magari, troppe in parallelo non mi sembra il caso)

gli SB io non ce li vedo impacchettati perchè sono soggetti a modifiche
per il numero in parallelo beh, si mette parametrico (come il -jX di make)
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4387
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda Blallo » ven mag 28, 2010 11:16

chi capisce di sed: come estrapoliamo in due variabili diverse nome e versione di un pacchetto da slack-required?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3222
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda danix » ven mag 28, 2010 11:28

ZeroUno ha scritto:E se alla coda aggiungi una funzioncina che da una occhiata agli slack-required così io gli do una lista di pacchetti e l'ordine di compilazione se lo imposta lui?

E se gestisse bene le dipendenze, gli si potrebbe anche far lanciare le compilazioni in parallelo.

ma gli slack-required le dipendenze le elencano in ordine per come andranno poi compilate?? In ogni caso nello slack-required elenca anche dipendenze che sono già installate nella slackware stabile, quindi facendo in questo modo dovrei pure scremare la coda dai pacchetti ufficiali di slackware... o non ho capito qualcosa io??

jimmy_page_89 ha scritto:chi capisce di sed: come estrapoliamo in due variabili diverse nome e versione di un pacchetto da slack-required?

adesso provo a scrivere qualcosa, ma io sono tutto meno qualcuno che capisce di sed ;)
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda ZeroUno » ven mag 28, 2010 11:29

jimmy_page_89 ha scritto:chi capisce di sed: come estrapoliamo in due variabili diverse nome e versione di un pacchetto da slack-required?


Codice: Seleziona tutto
# cat slack-required |sed -r 's/^([^ ]+)( +([^ ]+) +([^ |]+))?/pkg="\1"    ---   op="\3"   ---   ver="\4"/'
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4387
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda danix » ven mag 28, 2010 11:31

meno male che Matteo capisce di sed ;) io stavo per passare la mano...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda Blallo » ven mag 28, 2010 11:32

@ZeroUno
funziona, ma non per quei pacchetti con |
esempio:
Codice: Seleziona tutto
linuxdoc-tools >= 0.9.66-i486-2|python >= 2.6.4-i486-1

mi sputa
Codice: Seleziona tutto
pkg="linuxdoc-tools"    ---   op=">="   ---   ver="0.9.66-i486-2"|python >= 2.6.4-i486-1
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3222
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda Blallo » ven mag 28, 2010 11:35

però così stampa pkg="..."
come metterli in una variabile?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3222
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda ponce » ven mag 28, 2010 11:39

perdonatemi se mi intrometto: anch'io me n'ero fatto uno, basato su quello usato da Pat per kde, che ho riciclato per lxde giusto per fare qualcosa di specifico, ma da quando ho scoperto sbopkg e la possibilita' di definire dei repository custom, locali o remoti anche con git, uso/modifico quasi solo quello (sempre di uno script bash si tratta).

tra l'altro gli sviluppatori (chess, mauro e slakmagik) sono persone disponibilissime e accettano idee per miglioramenti :)
Avatar utente
ponce
Linux 3.x
Linux 3.x
 
Messaggi: 1485
Iscritto il: mer mar 05, 2008 16:45
Località: limbo
Nome Cognome: Matteo Bernardini
Slackware: slackware64-current
Kernel: 3.17-rc3
Desktop: lxde

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda danix » ven mag 28, 2010 11:49

ponce io ero partito con l'idea di usare proprio sbopkg (da cui la mia domanda di qualche giorno fa in PM), ma il fatto che si tratti di un programma molto grande mi ha un po' spaventato perchè non so se sarò in grado di adattarlo al template di slacky... magari provo a dare un'occhiata...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda ZeroUno » ven mag 28, 2010 11:59

jimmy_page_89 ha scritto:però così stampa pkg="..."
come metterli in una variabile?

era un esempio semplicistico da modificare opportunatamente.
Se ne vuoi uno completo:
Codice: Seleziona tutto
DIP="openssl >= 0.9.8n-i486-1 | openssl-solibs >= 0.9.8n-i486-1"

SPLIT=$(echo "$DIP"|sed -r 's/^([^ ]+)( +([^ ]+) +([^ |]+))?( *\| *([^ ]+)( +([^ ]+) +([^ |]+))?)?.*$/\1 \3 \4 \6 \8 \9/')

PKG1=$(echo $SPLIT|awk '{print $1}')
OP1=$(echo $SPLIT|awk '{print $2}')
VER1=$(echo $SPLIT|awk '{print $3}')

PKG2=$(echo $SPLIT|awk '{print $1}')
OP2=$(echo $SPLIT|awk '{print $2}')
VER2=$(echo $SPLIT|awk '{print $3}')

echo "Il pacchetto dipende da '$PKG1' che sia $OP2 della versione $VER1"
if [ ! -z "$PKG2" ];then
  echo "o, alternativamente, da '$PKG2' che sia $OP2 della versione $VER2"
fi
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4387
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda danix » ven mag 28, 2010 13:29

ZeroUno ha scritto:
jimmy_page_89 ha scritto:però così stampa pkg="..."
come metterli in una variabile?

era un esempio semplicistico da modificare opportunatamente.
Se ne vuoi uno completo:
Codice: Seleziona tutto
DIP="openssl >= 0.9.8n-i486-1 | openssl-solibs >= 0.9.8n-i486-1"

SPLIT=$(echo "$DIP"|sed -r 's/^([^ ]+)( +([^ ]+) +([^ |]+))?( *\| *([^ ]+)( +([^ ]+) +([^ |]+))?)?.*$/\1 \3 \4 \6 \8 \9/')

PKG1=$(echo $SPLIT|awk '{print $1}')
OP1=$(echo $SPLIT|awk '{print $2}')
VER1=$(echo $SPLIT|awk '{print $3}')

PKG2=$(echo $SPLIT|awk '{print $1}')
OP2=$(echo $SPLIT|awk '{print $2}')
VER2=$(echo $SPLIT|awk '{print $3}')

echo "Il pacchetto dipende da '$PKG1' che sia $OP2 della versione $VER1"
if [ ! -z "$PKG2" ];then
  echo "o, alternativamente, da '$PKG2' che sia $OP2 della versione $VER2"
fi

Matteo, il tuo script restituisce:
Codice: Seleziona tutto
Il pacchetto dipende da 'openssl' che sia >= della versione 0.9.8n-i486-1
o, alternativamente, da 'openssl' che sia >= della versione 0.9.8n-i486-1

quindi non mi sembra vada bene...
In ogni caso, mi spiegheresti meglio che genere di funzione intendevi per leggere gli slack-required?? Che poi vorrei capire una cosa, ma lo slack-required non viene creato dopo che è stato compilato il programma?? come faccio ad averlo prima di iniziare la coda di compilazione?? Ad esempio prendo sempre mplayer, come faccio ad avere il suo slack-required se sarà l'ultimo pacchetto da compilare (per poter includere tutte le dipendenze di slacky)??
Fatemi capire questa cosa e vedo di svilupparla...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: BASH - script per pacchettizzare in serie ;)

Messaggioda conraid » ven mag 28, 2010 13:34

lo guardi dagli slack-required precedenti, che non sempre sono esatti (magari un programma cambia dipendenze).
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12002
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti