Page 1 sur 2
[makepkg] Modification : cleanlocales
Publié : ven. 05 janv. 2007, 01:04
par mimas
J'ai commencé à faire des modifications légères sur makepkg car, même si j'arrive à lire plus ou moins correctement plusieurs langues, avoir les localisations des programmes en chinois simplifié ou slovaque ne semble pas judicieux. Je me suis donc résolu à faire des paquets uniquement franco-français pour gagner de la place sur le disque de la machine qui me sert de plateforme de test. Ainsi est né cleanlocales un hack un peu crade et chauvin.
Je vais présenter les modifs sous la forme d'un "patch" pour ne pas à avoir à recopier l'intégralité. Les lignes ajoutées commencent par "+"
On initialise une variable qui servira à définir si oui ou non on veut supprimer les locales. Dans ce cas c'est non par défaut.
Code : Tout sélectionner
echo " -j <jobs> Set MAKEFLAGS to \"-j<jobs>\" before building"
+ echo " -l, --cleanlocales Delete unwanted locales"
echo " -m, --nocolor Disable colorized output messages"
On affiche les informations sur les options disponibles.
Code : Tout sélectionner
--cleancache) CLEANCACHE=1 ;;
+ --cleanlocales) CLEANLOCALES=1 ;;
--syncdeps) DEP_BIN=1 ;;
et
Code : Tout sélectionner
- while getopts "bBcCdefghij:lmnop:rsSw:-" opt; do
+ while getopts "bBcCdefghij:mnop:rsSw:-" opt; do
et
Code : Tout sélectionner
j) export MAKEFLAGS="-j$OPTARG" ;;
+ l) CLEANLOCALES=1 ;;
m) USE_COLOR="n" ;;
C'est ici que les paramètres de la ligne de commande sont traités. On voit que CLEANLOCALES est mise à un, donc que l'on veut nettoyer les locales.
Code : Tout sélectionner
# build
msg "Starting build()..."
build 2>&1
if [ $? -gt 0 ]; then
error "Build Failed. Aborting..."
exit 2
fi
+if [ ! "`check_option CLEANLOCALES`" -a "$CLEANLOCALES" = "1" ]; then
+ msg "Removing unwanted locales..."
+ cd $startdir/pkg/
+ for i in `find . -type d | grep -e "locale/[a-z_A-Z@.1-9]*$" | grep -v "fr"`;
+ do rm -rf $i
+ plain $i
+ done
+fi
C'est ici que c'est le plus crade, mais aussi le plus important. Je supprime tous les répertoires locales/<lang> qui ne contiennent pas "fr". Il y a des modifications à faire à ce niveau là mais ça semble faire son travail correctement.
Pour que le "nettoyage" se fasse automatiquement, il faut ajouter une ligne export CLEANLOCALES="1" dans /etc/makepkg.conf.
Il va de soit que l'utilisation de cette option n'est pas recommandée pour la diffusion de paquets.
Edit: Modification des regexp pour prendre en compte des locales avec des "@", "." et des chiffres.
Edit: Oubli de l'argument l dans getopts.
Publié : ven. 05 janv. 2007, 09:44
par wain
Alors ça c'est grandiose !
Je suis impatient de tester pour voir le gain de place sur les grosses applications.

Publié : ven. 05 janv. 2007, 22:20
par marc[i1]
Salut
il n'y a aucun risque à virer les locales
en ? car j'ai pris l'habitude de les virer ( à la main ! ) mais en conservant les locales "originales" en anglais ...
Publié : sam. 06 janv. 2007, 00:38
par mimas
marc[i1] a écrit :il n'y a aucun risque à virer les locales en ? car j'ai pris l'habitude de les virer ( à la main ! ) mais en conservant les locales "originales" en anglais ...
Hum... bonne question.
Il ne doit pas y avoir de problème puisque dans le code source il y a un texte , le plus souvent en anglais, qui sert de référence à la localisation. Sans locales on tombe donc sur ce texte par défaut.
Je n'ai pas rencontré de problème pour ma part, mais cette modification est récente.
Publié : ven. 25 mai 2007, 10:02
par marc[i1]
Publié : ven. 25 mai 2007, 23:41
par mimas
C'est la fame !!!
Merci d'avoir mis en page ma petite astuce. J'aurais justement quelques modification a y apporter depuis peu : exécution de scripts avant et après la compilation .

Publié : sam. 26 mai 2007, 13:26
par wain
Tes modifs sont les bienvenues mimas
Avec marc[i1], on se demandait si on allait pas carrément créer un paquetage pacman3-fr qui contiendrait ces améliorations, ainsi que les mirroirs français par défaut, voir les traductions. Ainsi, le plus grand nombre pourrait en profiter

Publié : sam. 26 mai 2007, 14:11
par mimas
Ok, merci. Youpi un pacman-fr
Pour la modif c'est nettement plus simple. Le fichier patch à appliquer
Code : Tout sélectionner
--- makepkg.orig 2007-05-08 06:45:43.000000000 +0200
+++ makepkg 2007-05-26 13:48:51.000000000 +0200
@@ -877,6 +877,18 @@
export MAKEFLAGS=""
fi
+ #execute precompilation scripts
+ if [ "$(check_option prescripts)" = "y" ]; then
+ msg "Executing precompilation scripts"
+ if [ -d /etc/makepkg.d/pre ]; then
+ for option in `ls /etc/makepkg.d/pre/*`; do
+ if [ -x $option ]; then
+ source $option
+ fi
+ done
+ fi
+ fi
+
# build
msg "Starting build()..."
@@ -983,6 +995,18 @@
find -depth -type d -empty -delete;
fi
+#execute postcompilation scripts
+if [ "$(check_option postscripts)" = "y" ]; then
+ msg "Executing postcompilation scripts"
+ if [ -d /etc/makepkg.d/post ]; then
+ for option in `ls /etc/makepkg.d/post/*`; do
+ if [ -x $option ]; then
+ source $option
+ fi
+ done
+ fi
+fi
+
# get some package meta info
builddate=$(LC_ALL= ; LANG= ; date -u "+%a %b %e %H:%M:%S %Y")
if [ "$PACKAGER" != "" ]; then
comment ça fonctionne ?
dans les options de makepkg.conf (OPTIONS=(..)) il faut ajouter
prescripts et
postscripts pour exécuter les scripts de pré ou post compilation.
Ces scripts sont simple commes des modifications de makepkg.

Et peuvent prendre en charge les options spécifique de chaques paquets puisqu'ils sont executés dans le même environnement que makepkg.
Chaque type de scripts (post ou pre) se trouvent dans un répertoire distinct /etc/makepkg.d/post et /etc/makepkg.d/pre.
Pour ma modif précèdente avec cleanlocales on se retrouve avec un script qui a cette tête :
Code : Tout sélectionner
# remove unwanted locales
if [ "$(check_option cleanlocales)" = "y" ]; then
msg2 "Removing unwanted locales..."
cd $startdir/pkg/
for i in `find . -type d | grep -e "locale/[a-z_A-Z@.1-9]*$" | grep -v "fr"`; do
rm -rf $i
plain $i
done
fi
Pour être exécuté il doit y avoir deux conditions (hormis l'option postcripts obligatoire pour ce script de postcompilation) :
- y avoir l'option cleanlocales dans makepkg.conf ou le pkgbuild
- le script doit être exécutable (+x).
On peut bien sûr supprimer la condition 1 en ne faisant pas de vérification d'option (check_option).
On peut faire pas mal de choses, comme mettre une ligne dans le PKGBUILD pour changer l'optimisation de compilation du paquet (-O3 au lieu de -O2, à la manière de #optimization : ok (de mémoire) dans frugalware pour les programmes que ça ne dérange pas).
On peut supprimer les locales inutiles (déjà fait

), optimiser les images avec des outils comme optipng ou compresser des programmes avec le nouvel upx-lzma)... On peut tout faire et comme on est dans l'environnement de makepkg, on peut vraiment tout faire.
PS : Il n'y a plus besoin de gérer les flags -march et -mtune avec gcc 4.2.0, il y a possibilité d'utiliser 'generic' ou 'native' pour avoir des optimisations (ou non) en fonction du processeur utilisé.
Publié : sam. 26 mai 2007, 15:07
par wain
ah oué qand même
Attends... laisses-moi reprendre mes esprits.
C'est
ENORME !
Voilà qui va ouvrir beaucoup de perspectives. Bravo mimas !
Publié : sam. 26 mai 2007, 15:26
par marc[i1]
Ne serais t'il pas possible de modifier le comportement de façon à pouvoir lancer makepkg avec l'option CLEANLOCALE, genre :
ce qui va imposer le nettoyage des locales, sauf fr* …
Sinon … pareil que wain !
j'en suis encore sur le cul !!!

Publié : sam. 26 mai 2007, 16:08
par mimas
Héhé, je savais bien que ça allait vous plaire.
marc[i1] a écrit :Ne serais t'il pas possible de modifier le comportement de façon à pouvoir lancer makepkg avec l'option CLEANLOCALE, genre :
ce qui va imposer le nettoyage des locales, sauf fr* …
Avec une petite modif on peut arriver à selectionner en ligne de commande avec
(ou PKGLOCALE défini dans les variables d'environnement avec makepkg.conf ou autre)
Code : Tout sélectionner
# remove unwanted locales
if [ "$(check_option cleanlocales)" = "y" ]; then
msg2 "Removing unwanted locales..."
if [ "x$PKGLOCALE" != "x" ]; then
cd $startdir/pkg/
for i in `find . -type d | grep -e "locale/[a-z_A-Z@.1-9]*$" | grep -v $PKGLOCALE`; do
rm -rf $i
plain $i
done
fi
fi
Je suis pas très content de mon utilisation de
grep -v, ça fonctionne mais c'est pas très flexible. Des suggestions ?
Publié : sam. 26 mai 2007, 16:57
par mimas
Autre possibilité : uitlisation automatique du flag -O3 sur des paquets présents dans une liste blanche
Code : Tout sélectionner
res=`grep "^$pkgname$" /etc/makepkg.d/o3_whitelist`
if [ "$?" -eq 0 ]; then
CFLAGS="`echo $CFLAGS | sed 's#-O.#-O3#'`"
fi
Le fichier
/etc/makepkg.d/o3_whitelist n'est qu'une simple liste de nom.
Facile.

Publié : dim. 27 mai 2007, 23:18
par wain
mimas a écrit :Je suis pas très content de mon utilisation de grep -v, ça fonctionne mais c'est pas très flexible. Des suggestions ?
Non je vois pas. grep -v c'est super utile et hyper pas pratique. Impossible d'exclure plusieurs expressions en même temps par exemple :-/
Sinon, tu crois qu'on pourrait utiliser "postcompilation" pour lancer par exemple une sauvegarde du log dans un quoi, puis proposer à l'utilisateur de l'envoyer sur pastebin.archlinux.fr grâce au logiciel pastebin ?
Publié : lun. 28 mai 2007, 17:46
par mimas
Modif du script. Il y a possibilité de conserver plus d'une locale.
Code : Tout sélectionner
# À mettre dans son makepkg.conf pour conserver certaines locales
# KEEPLOCALES=(fr eo)
# Si cela n'est pas configuré alors on conserve toutes les locales.
if [ "$(check_option cleanlocales)" = "y" ]; then
if [ ${#KEEPLOCALES[@]} -ne 0 ]; then
msg2 "Removing unused locales."
cd $startdir/pkg
find . -type d | grep -e "locale/[a-z_A-Z@.1-9]*$" > .LOCALES
# 1ère passe : on détermine les locales que l'on doit supprimer
for locale in ${KEEPLOCALES[@]}; do
cat .LOCALES | grep -v $locale > .LOCALES
done
# 2ème passe : on supprime les locales
for locale in `cat .LOCALES`; do
rm -rf $locale
done
rm .LOCALES
fi
fi
# vim: set ts=2 sw=2 noet:
J'ai fais deux trois tests et cela ne semble pas poser de problèmes.
Wain, je comprends pas tout. Tu veux envoyer le log de quoi ? Oui, je ne vois pas pourquoi on ne pourrait pas appeler d'autres programmes.
Publié : lun. 28 mai 2007, 19:39
par wain
mimas a écrit :Wain, je comprends pas tout. Tu veux envoyer le log de quoi ? Oui, je ne vois pas pourquoi on ne pourrait pas appeler d'autres programmes.
L'idée m'est venue hier soir alors que sur le chan archlinux-fr, quelqu'un nous a dit "j'arrive pas à installer fbdesk depuis aur, la compilation plante". Sachant que nous possédons un utilitaire pour envoyer le log de la compilation sur pastebin.archlinux.fr, et que nous sommes capables avec ta modif d'exécuter un traitement post compilation, il ne restait plus qu'à relier les deux

J'ai pas encore testé ta modif, et je me demandais si l'envoi du log pourrait s'implémenter facilement.
Publié : lun. 28 mai 2007, 20:48
par Skunnyk
Par contre il faudrais que l'utilisateur puisser gerer si il veux que ca envoie, pas que ca se fasse en auto :p
D'ailleurs ya un .yaourtrc (ou equivalent) de prevu ? Genre desactiver certains emssages et tout, parce que ca deviens usine a gaz :p
Publié : lun. 28 mai 2007, 22:36
par wain
Skunnyk a écrit :Par contre il faudrais que l'utilisateur puisser gerer si il veux que ca envoie, pas que ca se fasse en auto :p
D'ailleurs ya un .yaourtrc (ou equivalent) de prevu ? Genre desactiver certains emssages et tout, parce que ca deviens usine a gaz :p

Publié : mar. 29 mai 2007, 12:15
par gyo
C'est une très bonne idée ça de faire des paquets « chauvins » via makepkg.
Mais je pense qu'il serait bon aussi de faire un script qui jarte les locales non fr des paquets installés, il faudrait que ce script vire en même temps une partie de la liste des fichiers contenus dans la BDD de pacman (à savoir dans /var/lib/pacman/local/<paquet>/files) au moins, pour faire propre...
Qu'en pensez-vous ?
Publié : mar. 29 mai 2007, 13:23
par marc[i1]
pourquoi pas, mais faut pas non plus que ça perturbe pacman de toucher aux pkg installé !
Publié : mar. 29 mai 2007, 18:24
par wain
c'est vrai que virer les locales c'est bon pour alléger le dur. Cette manip se fait très souvent sur les autres distros (debian, frugalware) grâce à localepurge.
Par contre, elles ne mettent pas pour autant à jour la liste des fichiers fournits par les paquetages nettoyés. c'est un point à discuter.