[makepkg] Modification : cleanlocales

Mise à jour / Création /debug de paquetages
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

[makepkg] Modification : cleanlocales

Message 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 "+"

Code : Tout sélectionner

RMDEPS=0

+CLEANLOCALES=0

PACMAN_OPTS=
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.
Dernière modification par mimas le ven. 05 janv. 2007, 13:47, modifié 3 fois.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

Alors ça c'est grandiose !
Je suis impatient de tester pour voir le gain de place sur les grosses applications. 8)
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message 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 ...
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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.
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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 . :)
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

Tes modifs sont les bienvenues mimas :D
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 :D
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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é.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

ah oué qand même :shock:
Attends... laisses-moi reprendre mes esprits.


C'est ENORME !

Voilà qui va ouvrir beaucoup de perspectives. Bravo mimas !
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

Ne serais t'il pas possible de modifier le comportement de façon à pouvoir lancer makepkg avec l'option CLEANLOCALE, genre :

Code : Tout sélectionner

makepkg LANG=fr
ce qui va imposer le nettoyage des locales, sauf fr* …

Sinon … pareil que wain !
j'en suis encore sur le cul !!! :shock:
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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 :

Code : Tout sélectionner

makepkg LANG=fr
ce qui va imposer le nettoyage des locales, sauf fr* …
Avec une petite modif on peut arriver à selectionner en ligne de commande avec

Code : Tout sélectionner

PKGLOCALE=fr makepkg
(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 ?
Anarchy for the triple A.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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.

Code : Tout sélectionner

zlib
lua
...
Facile. :)
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message 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 ?
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message 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.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message 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 :-D
J'ai pas encore testé ta modif, et je me demandais si l'envoi du log pourrait s'implémenter facilement.
Avatar de l’utilisateur
Skunnyk
Maître du Kyudo
Messages : 1137
Inscription : mer. 06 sept. 2006, 21:31
Localisation : IRC
Contact :

Message 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
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message 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
:cheveux:
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

Message 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 ?
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

pourquoi pas, mais faut pas non plus que ça perturbe pacman de toucher aux pkg installé !
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message 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.
Répondre