Je développe principalement sous Linux. Comme mon employeur ne supporte officiellement que les applications Windows, la plupart de mes application doivent rouler sous Windows. Puisque j'utilise des librairies multiplateformes (tel que Boost ou Qt), je peux tout de même développer mes applications sous Linux. Malheureusement, je dois éventuellement passer à Windows pour compiler et tester mon code.

Sous Linux, j'utilise principalement Vim et tmux. Je suis très familier avec ces outils. J'ai une configuration de sessions, fenêtres et panneaux tmux que j'aime bien. J'ai également une configuration de Vim avec des extensions et des raccourcis clavier qui me conviennent. J'aimerais vraiment conserver ces outils et leur configuration lorsque je travaille sous Windows. Et je le peux grâce à Cygwin.

D'après Wikipedia:

Cygwin est une collection de logiciels libres à l'origine développés par Cygnus Solutions permettant à différentes versions de Windows de Microsoft d'émuler un système Unix. Il vise principalement l'adaptation à Windows de logiciels qui fonctionnent sur des systèmes POSIX (tels que les systèmes GNU/Linux, BSD, et Unix). Cygwin simule un environnement Unix sous Windows, rendant possible l'exécution de ces logiciels après une simple compilation. 1

Cygwin est une outil incroyable. On peut utiliser Vim et tmux sans problème. Toutes les extensions ainsi que les fichiers de configuration que j'utilise sous Linux fonctionne à la perfection sous Cygwin.

À mon travail, j'ai accès à plusieurs ordinateurs différents. Je voudrais utiliser Cygwin sur chacun d'entre eux afin d'avoir accès à tous mes outils de développement. Le problème est que Cygwin peut être long et fastidieux à installer et configurer. J'aimerais avoir une version que puisse rouler à partir d'une clef USB.

Il existe plusieurs projets sur GitHub qui modifie une installation locale de Cygwin pour la rendre portable. Certains de ces projets sont plutôt vieux et semblent abandonnés. D'autres me semblent trop complexes pour mes besoins. Voici donc les modifications que j'ai faites pour rendre Cygwin portable.

Installez Cygwin sur votre disque dur. Peu importe dans quel répertoire vous décidez de l'installer. J'ai choisi de l'installer dans c:CygwinX86.

Cygwin Root Install Dir

Fixez le répertoire des paquets téléchargés comme un sous-répertoire de votre répertoire d'installation. Ici, j'utilise le sous-répertoire packages.

Cygwin Packages Install Dir

Suivez la procédure d'installation jusqu'à la fin. Il n'y a rien de spécial à effectuer d'ici la fin de la procédure d'installation.

Une fois la procédure d'installation terminée, ajoutez un fichier nommé PortableCygwin.bat 2 au répertoire d'installation de Cygwin.

Cygwin Portable Batch File

Le fichier devrait contenir les lignes suivantes:

@echo off
"%~dp0\bin\mintty.exe" -i /Cygwin-Terminal.ico -

Ce fichier va démarrer la console de Cygwin à partir du répertoire dans laquelle elle se retrouve.

Cygwin va créer une dossier d'accueil utilisant votre nom d'usager Windows. Mon nom d'usager change d'ordinateur à ordinateur. Ceci signifie que mon dossier d'accueil change également d'ordinateur à ordinateur. Nous devons donc fixer le nom du dossier d'accueil afin de rendre notre installation portable. Ceci peut être facilement accompli en modifiant le fichier /etc/nsswitch.conf. Il suffit de modifier la ligne contenant db-home pour y écrire le nom du dossier d'accueil désiré:

# /etc/nsswitch.conf
#
#    This file is read once by the first process in a Cygwin process tree.
#    To pick up changes, restart all Cygwin processes.  For a description
#    see https://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-mapping-nsswitch
#
# Defaults:
# passwd:   files db
# group:    files db
# db_enum:  cache builtin
db_home:  /home/foo
# db_shell: /bin/bash
# db_gecos: <empty>

Dans l'exemple ci-haut, Cygwin fixera toujours son dossier d'accueil à /home/foo. Redémarrez la console et vérifiez que le dossier d'accueil est bien celui désiré.

$ cygpath -w ~
c:\CygwinX86\home\foo

Maintenant, nous devons modifier le chemin du répertoire de sauvegarde des paquets. Ce chemin se retrouve dans le fichier /etc/setup/setup.rc.

last-cache
        c:\CygwinX86\packages
mirrors-lst
        http://cygwin.mirror.constant.com/;cygwin.mirror.constant.com;United States;New Jersey
        http://cygwin.mirror.hoobly.com/;cygwin.mirror.hoobly.com;United States;Pennsylvania
        http://mirrors.koehn.com/cygwin/;mirrors.koehn.com;United States;Missouri
        http://mirrors.metapeer.com/cygwin/;mirrors.metapeer.com;United States;Washington
        ...

Nous devons remplacer la seconde ligne avec le chemin du répertoire de sauvegarde des paquets sur notre clef USB. L'ajout de la ligne suivante à notre fichier .profile fera l'affaire.

sed -i '2s|.*|\t'$(cygpath -m /)'/packages|' /etc/setup/setup.rc

Il est important de bien spécifier le bon sous-répertoire dans cette commande. Ici, nous spécifions packages puisqu'il s'agit du sous-répertoire que nous avons utilisé lors de la procédure d'installation effectuée plus tôt. À partir de maintenant, à chaque fois que nous démarrerons Cygwin, le fichier .profile sera exécuté et le fichier setup.rc sera mis à jour avec le chemin actuel du répertoire de sauvegarde des paquets.

Les modifications sont terminées. Copiez le répertoire d'installation au complet sur votre clef USB. Utilisez PortableCygwin.bat pour démarrer Cygwin et apprécier votre environnement POSIX portable.

  1. https://fr.wikipedia.org/wiki/Cygwin
  2. Vous pouvez le nommer comme vous le voulez.