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.
In ogni caso, mi spiegheresti meglio che genere di funzione intendevi per leggere gli slack-required??
funzionalità che legge gli slack-required, li mette assieme per determinare da solo quali pacchetti compilare e in che ordine. e magari anche a determinare se può compilarne qualcuno in parallelo.
che poi vorrei capire una cosa, ma lo slack-required non viene creato dopo che è stato compilato il programma??
teoricamente si, ma al 90% dei casi già ce l'hai, se stai semplicemente ricompilando il repository slacky o altri stabellini-based
ok, mi ricollegavo alla domanda di prima di estrarre anche la versione, quella molto probabilmente non sarà esatta, magari per il nome del file si può anche fare, ma mi chiedevo prima (senza ricevere risposta), nello slack-required le dipendenze sono elencate in che ordine??
ok, ma in questo modo non rispetteranno l'ordine corretto e si rischia che una dipendenza venga compilata dopo del pacchetto a cui serve...
questo compito lo deve svolgere lo script:
1) raccogliere tutti slack-required
2) pulirli di tutti i pacchetti già installati
3) verificare che dei rimanenti siano presenti tutti gli slackbuild (e slack-desc ecc) in una direcory
4) determinare l'ordine di compilazione.
5) lanciare la compilazione.
più o meno ho capito cosa intendi, ma non credo di essere in grado di scrivere una funzione che estragga l'ordine esatto dai vari required...
In ogni caso l'ho provato or ora così com'è (tranne un paio di particolari che mi erano sfuggiti) e sembra funzionare... ho provato con rtorrent e ha funzionato (beh, sulla mia current64 non compila rtorrent, ma questo è un altro discorso, però lo script va benone)
non credo serva un ordine delle dipendenze
si può fare che ad ogni dipendenza legga a sua volta il required (e così via ricorsivamente, prima o poi arriverà ad un pacchetto senza dipendenze extra)
così al controllo successivo quella dipendenza poi risulterà comunque installata
La mia idea è che tu come parametro gli passi solo UN pacchetto da compilare, il resto se li trova lui.
Comunque per ora ho tirato fuori questo (mi sto allargando molto più del necessario)
#!/bin/bash
if [ -z "$1" ];then
echo "usage: $0 <nomesoftware>"
exit
fi
# Cerca il path di un software
# output=path del software, retcode: 0=ok, 1=dup, 2=non esiste
function findsw(){
PT=$(find -name $1.SlackBuild 2>/dev/null)
if [ -z "$PT" ];then
return 2
fi
if [ $(echo $PT|wc -w) -ne 1 ];then
return 1
fi
echo $(dirname $PT)
return 0
}
# Determina se un software è installato (non verifica versione)
# output=niente, retcode: 0=installato, >0 non installato
function isinst(){
if [ -z "$1" ];then
echo "errore interno:parametro non specificato a isinst" >&2
exit 1
fi
(cd /var/log/packages/;ls|sed 's/^\(.*\)-[^\-]*-[^\-]*-[^\-]*$/\1/')|grep -q ^$1$
return $?
}
# rimuove dipenze già soddisfatte da uno slack-required
# se il file non esiste viene considerato come vuoto
# output=lista dip non sodd, retcode: 0=tutte soffisfatte, >0 no
function striprequired(){
if [ ! -e $1 ];then
return 0
fi
R=0
for DEP in $(cat $1|sed -r 's/^([^ ]+)( +([^ ]+) +([^ |]+))?( *\| *([^ ]+)( +([^ ]+) +([^ |]+))?)?.*$/\1|\6/'|sed 's/|$//');do
D=$(echo $DEP|cut -f1 -d"|")
if isinst $D;then continue;fi
D=$(echo $DEP|cut -f2 -d"|")
if [ ! -z "$D" ];then if isinst $D;then continue;fi;fi
echo "$DEP"
R=1
done
return $R
}
# aggiunge alla lista da compilare
# outcode: 2=il pacchetto non è presente, 1=il pacchetto è duplicato, 0=ok o già presente
function addtolist(){
echo $TOCOMPILE|grep -q " $1 "
if [ $? -eq 0 ];then
return 0
else
findsw $1 >/dev/null
ERR=$?
if [ $ERR -ne 0 ];then
return $ERR
fi
TOCOMPILE=" $1$TOCOMPILE "
return 0
fi
}
# aggiunge il pacchetto e le dipendenze
# abortisce se il pacchetto non esiste o se è duplicato
function addpackage(){
local ND
if addtolist $1;then
for ND in $(striprequired $(findsw $1)/slack-required|cut -f1 -d"|");do
addpackage $ND $1
done
else
findsw $1 # >/dev/null
if [ $? -eq 1 ];then
echo "'$1' è presente due o più volte nella directory. ABORT"
else
if [ ! -z "$2" ];then
echo "la dipendenza '$1' richiesta da '$2' non è stata trovata. ABORT"
else
echo "'$1' non trovato. ABORT"
fi
fi
exit 1
fi
}
CWD=$(pwd)
TOCOMPILE=""
for PKG in $*;do
addpackage $PKG
done
echo $TOCOMPILE
La cosa buona di questo script è che trova i pacchetti anche in una ramificazione (io sul mio hd rispecchio la struttura di slacky)
# ./finddep.sh bar kmid clamav
la dipendenza 'gus-patches' richiesta da 'timidity++' non è stata trovata. ABORT
# ./finddep.sh bar kmid clamav
clamav gus-patches timidity++ drumstick kmid bar
ho provato lo script e funziona come da aspettative (Matteo sei un grande), però automatizzando il tutto, si presuppone che gli slackbuild siano già allineati allo standard e così non è, nel senso che bisogna sempre metterci mano prima di lanciarli...
Secondo voi questa è la strada giusta??
Lo script come l'ho postato non va a leggere dentro lo SlackBuild, quindi funziona (unico difetto è se il nome del pacchetto e il nomefile dello slackbuild non coincidono. Se il pacchetto si chiama pippo e PKGNAME è pluto non è importante, l'importante è che il txz finale sia pippo-123-...
La parte che sto elaborando è più complicata e presume alcuni requisiti da parte dello slackbuild e dello slack-desc (per ora), ma effettua un check per vedere se lo SB sia un minimo standard o meno e ne sfrutta le feature in caso positivo.
Allo stato di sviluppo (non sufficiente per essere postato), i controlli non sono molti, infatti mi ha fallito i test sugli slackbuild con nomefile<>$PKGNAME (accetta anche $NAME o $PRGNAM)