Britney Gopherspace, 01 juillet 2008,
illovæ
— J'avais déjà fait un article sur le sujet concernant
Gentoo. Nous allons voir comment faire cela sur tout autre
distribution que Gentoo (si vous êtes sous Gentoo, la combine est
beaucoup plus simple que ce qui suit, il vous suffit d'éditer
l'ebuilds de votre version de coreutils et de décommenter les lignes
qui concerne le patch
???_all_coreutils-gen-progress-bar.patch
et d'émerger les
coreutils ; je n'ai plus de Gentoo sous la main, mais c'est pas dur,
donc je vous laisse faire ;)).
Nous allons implémenter à notre cp
et à
notre mv
une option -g
qui va nous donner
une barre de progression de ce style :
$ cp mongrosfichier.file ~/dossier mongrosfichier.file | 40% | 703 MiB | 17 MiB/s | ETA 00:00.25
Et pour faire cela, nous allons récupérer les sources de la dernière
version stable des coreutils (qui vous permet d'avoir cp
,
mv
, touch
, ls
et j'en passe) de
lui appliquer un patch, de compiler et de l'installer. À noter que
vous allez avoir plusieurs choix : on peut installer dans les
répertoires des binaires systèmes ce qui aura pour effet d'écraser
votre version des coreutils présentes sur votre système. De plus, lors
d'une mise a jour des coreutils par votre distribution, il y a de
fortes chances pour qu'elle écrase votre installation des coreutils à
vous donc il faudra réinstaller votre version. Mais ici nous allons
agir autrement.
Ce que nous allons faire est plus sûr en cas de bêtise et vous évitera
des désagrément au cas où ça foire à cause d'une erreur d'inattention
de votre part ;) On va faire en sorte d'installer tout ca
dans /usr/local/
et de rajouter un préfixe aux binaires,
comme ça pas de problèmes, si vous avez un soucis, votre système de
base sera préservé (vous aurez donc un /bin/cp
et un
/usr/local/bin/patch-cp
par exemple et il suffira de
faire un alias pour que ça vous soit transparent, on verra ça à la
fin). Mais si vous avez envie de faire autrement, libre à vous, il
suffit de jouer avec ./configure
.
Question dépendances, vous avez besoin de bash, glibc et de pam si vous en activez l'option (les *-dev compris, car oui nous compilons).
Allons d'abord récupérer les sources de coreutils de la derniere version stable, soit la 6.9 (si vous préférez une version antérieure, il y a un patch correspondant pour chaque version mais nous allons ici travailler avec la version 6.9). Je vous laisse donc extraire l'archive où bon vous semble.
Dans un second temps nous allons récupérer le patch pour notre version
sur le site de développement de Gentoo. Prenez
bien le patch correspondant à la version de vos sources. Pour la 6.9
le dernier est : coreutils-6.9-patches-1.3.tar.bz2
; de
même décompressez ça où bon vous semble. Un répertoire patch va être
extrait, dedans récupérer le patch du nom de
001_all_coreutils-gen-progress-bar.patch
dans le
dossier generic/
. Déplacez ce patch à la racine du
dossier de coreutils (dans le dossier coreutils-6.9/
donc).
Nous allons devoir maintenant modifier un peu ce patch en enlevant la
définition du répertoire coreutils/
dans les entrées (en
effet on est déjà dans le dossier de coreutils) :
$ sed 's/ coreutils\// /g' 001_all_coreutils-gen-progress-bar.patch > acgpb.patch
Il ne nous reste plus qu'à appliquer notre version de patch (je
rappelle que vous devez être dans le
dossier coreutils-6.9/
) et voir le résultat suivant :
$ patch -p0 < acgpb.patch patching file src/copy.c Hunk #3 succeeded at 59 (offset 3 lines). Hunk #4 succeeded at 93 (offset 1 line). Hunk #5 succeeded at 253 with fuzz 1 (offset 53 lines). Hunk #6 succeeded at 335 (offset 48 lines). Hunk #7 succeeded at 485 (offset 81 lines). Hunk #8 succeeded at 568 (offset 97 lines). Hunk #9 succeeded at 771 (offset 95 lines). patching file src/copy.h Hunk #1 succeeded at 172 (offset -3 lines). patching file src/cp.c Hunk #1 succeeded at 82 (offset 1 line). Hunk #2 succeeded at 129 (offset 1 line). Hunk #3 succeeded at 186 (offset 1 line). Hunk #4 succeeded at 773 (offset 57 lines). Hunk #5 succeeded at 884 (offset 57 lines). Hunk #6 succeeded at 944 (offset 57 lines). patching file src/mv.c Hunk #1 succeeded at 44 (offset -1 lines). Hunk #2 succeeded at 82 (offset -1 lines). Hunk #3 succeeded at 112 (offset -1 lines). Hunk #4 succeeded at 146 with fuzz 2 (offset -12 lines). Hunk #5 succeeded at 311 (offset -14 lines). Hunk #6 succeeded at 379 (offset -14 lines). Hunk #7 succeeded at 392 (offset -14 lines). patching file src/remove.h Hunk #1 succeeded at 60 (offset 12 lines).
Par défaut, cela va s'installer dans /usr/local
donc on a juste à
spécifier un préfixe de cette façon (notez que vous pouvez aussi rajouter
un suffixe avec --program-suffix=
) :
$ ./configure --program-prefix=patch-
Puis vient le temps de compiler tout ça :
$ make
Ça prend un peu de temps et pour finir (en root/avec sudo) :
# make install
Cette dernière opération vous donnera donc l'occasion de voir tout ce
que contient comme binaire les coreutils ;) À noter que si vous avez
pas envie d'installer toutes les binaires, vous pouvez simplement
déplacer à la main nos deux binaires mv
et cp
qui sont dans le dossier src/
vers /usr/local/bin
(pensez cependant à rajouter un
préfixe histoire d'éviter les conflits)). Je vous conseille de garder
tel quel votre dossier de sources, le jour où vous voulez désinstaller
cette version patchée des coreutils, il suffira de vous mettre dedans
et de faire un simple (en root/avec sudo) :
# make uninstall
Histoire de rendre les choses transparentes, dans
votre .profile
, .bashrc
,
.zshrc
, .whatever_rc
, créer des alias du
genre :
alias cp='/usr/local/bin/patch-cp -g' alias mv='/usr/local/bin/patch-mv -g'
Pour que ça prenne effet immédiatement faîtes un source
~/.bashrc
(ou ~/.zshrc
ou autre) ou alors
redémarrer votre shell. Ainsi, quand vous ferez un cp
ou
un mv
, vous utiliserez naturellement
l'option -g
sans avoir à le spécifier à chaque fois.
Have fun !