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.
Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

BASH - script per pacchettizzare in serie ;)

Messaggio da danix »

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 ;)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da ZeroUno »

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
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da Blallo »

è 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)

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da ZeroUno »

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
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da Blallo »

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

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da danix »

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 ;)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da ZeroUno »

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
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da danix »

meno male che Matteo capisce di sed ;) io stavo per passare la mano...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da Blallo »

@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

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da Blallo »

però così stampa pkg="..."
come metterli in una variabile?

Avatar utente
ponce
Iper Master
Iper Master
Messaggi: 3022
Iscritto il: mer 5 mar 2008, 16:45
Nome Cognome: Matteo Bernardini
Slackware: slackware64-current
Kernel: 6.6.16
Desktop: lxde
Località: Pisa
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da ponce »

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
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da danix »

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...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da ZeroUno »

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
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da danix »

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...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: BASH - script per pacchettizzare in serie ;)

Messaggio da conraid »

lo guardi dagli slack-required precedenti, che non sempre sono esatti (magari un programma cambia dipendenze).

Rispondi