Ceci est une ancienne révision du document !
Intégrer une application Windows dans un paquet logiciel
Pour la petite histoire, cette manipulation me trottait dans la tête depuis un petit moment, et à force d'aide et de recherches, j'ai finit par trouver quelques réponses sur le forum PlayOnLinux, je remercie d'ailleurs Tinou de m'avoir donné quelques indications, n'étant pas développeur pour deux sous.
Très clairement, le but recherché est l'intégration d'une application Windows au sein d'un environnement Linux, telle une application Linux, pas question donc de devoir avoir un menu wine, ou playonlinux, ou de dépendre de l'installation de ces programmes pour exécuter les logiciels ciblés, on recherchera donc à installer le programme et son environnement d’exécution dans son propre répertoire, et à avoir un fichier caché dans le dossier utilisateur qui contiendra fichiers de configurations, sauvegarde & cie du programme ciblé.
Ainsi, le programme en question sera installable en seulement quelque clics, ne nécessitera pas la réinstallation ou certaines reconfiguration d’exécutables, base de registres, ou librairies, du prêt à l'emploi, pour faire simple.
Étape 1 : Récupérer le préfixe Wine
C'est une condition obligatoire pour créer le paquet prêt à l'emploi, vous devez déjà disposer d'un préfixe wine (propre) sur votre machine dédié exclusivement au logiciel/jeu ciblé, et ce dernier devra déjà être pleinement fonctionnel (dépendances du logiciel windows installées, exécutable patché, etc…) et ça fonctionnera aussi bien pour les préfixes issus de wine, accessibles dans /home/votre-user/.wine, que dans /home/votre-user/PlayOnLinux/wineprefix
Plus généralement, un préfixe contient généralement les dossiers "dosdevices" "drive_c" "harddiskvolume0" , les fichiers "system.reg" "user.reg" "userdef.reg", et un fichier caché ".update-timestamp"
Une fois que vous avez trouvé son dossier d'origine, vous allez copier son contenu dans /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefixe
Il faudra ensuite recréer les liens symboliques harddiskvolume0 et dosdevices/c: ceux ci ne pointant pas vers le bon dossier, car ils devront désormais pointer vers /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c ;)
Pour ça, on supprime d'abord ces deux derniers
cd /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix
rm harddiskvolume0 && rm dosdevices/c:
Il ne reste plus qu'à recréer les bons liens :
ln -s drive_c/ harddiskvolume0
ln -s drive_c/ dosdevices/c:
Ensuite on transfère tous les propriétés de dossiers, sous dossiers, et fichiers à root
sudo chown root:root /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix -R
Et pour les droits, on les accorde à tous les utilisateurs
sudo chmod 777 /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix -R
Puis on supprime votre nom d'utilisateur dans votre dossier personnel, situé généralement dans /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/users (je parlerais de la possibilité de le déplacer automatiquement dans votre dossier personnel plus loin.)
Par ailleurs, vous pouvez également modifier les fichiers reg à votre convenance, en supprimant toute élocution de votre nom d'utilisateur et en le remplaçant par root par exemple.
Et voilà une bonne chose de faite. ;)
Étape 2 : Modifier puis compiler Wine
Nous accédons désormais à une autre étape importante, de base, wine ne permet pas à tous les utilisateurs d'un système de pouvoir exécuter un préfixe dont les droits appartiennent à un autre utilisateur. La modification proposée va permettre d'outrepasser cette limite, afin que tous les utilisateurs puissent y avoir accès ensuite !
Tout d'abord, vous devrez récupérer les sources de wine, de la version désirée, ici ⇒ http://www.ibiblio.org/pub/linux/system/emulators/wine/
Dans mon cas, je choisit donc de télécharger wine-1.3.26.tar.bz2, dernière version en date
wget http://www.ibiblio.org/pub/linux/system/emulators/wine/wine-1.3.26.tar.bz2
Ensuite je décompresse
bsdtar -xf wine-1.3.26.tar.bz2
Et je me place dans le dossier des sources de wine
cd wine-1.3.26
Ensuite, il est nécessaire d'éditer 3 fichiers
gedit libs/wine/config.c
gedit dlls/ntdll/server.c
gedit server/request.c
Dans ces 3 fichiers, vous devez rechercher les termes "is not owned by you" contenant peu avant l'occurence "fatal_error" que vous devrez à chaque fois remplacer par "printf", dans mon cas, j'ai aussi pris la précaution de remplacer la valeur "fatal_error" des allocutions "must not be accessible by other users", cette dernière faisant référence aux droits des utilisateurs
if (st.st_mode & 077) printf( "'%s' must not be accessible by other users\n", serverdir );
Une fois ceci fait, nous pouvons enfin passer à la compilation.
./configure --prefix="/opt/catégorie-de-votre-programme/nom-de-votre-programme/.wine/version-choisie-de-wine"
Premièrement, on lance la compilation des dépendances propres au fonctionnement de wine
make depend
Ensuite on lance la compilation de wine
make
Une fois celle ci terminée (ce qui devrait prendre un peu de temps), il n'y a plus qu'à installer les fichiers dans le répertoire choisit précédemment
make install
Vous devriez maintenant retrouver tous les fichiers liés à cette version de wine modifié dans "/opt/catégorie-de-votre-programme/nom-de-votre-programme/.wine/version-choisie-de-wine/"
Étape 3 : Script bash pour lancer le programme
Et oui… Faudra bien lancer le logiciel en question, et pour le coup, j'ai un petit script à vous proposer, à adapter en fonction de vos besoins :
D'abord on crée le dossier qui contiendra le/les script(s) (car rien ne vous empêche d'intégrer divers programmes exécutables complémentaires à votre programme après tout…)
mkdir /opt/catégorie-de-votre-programme/nom-de-votre-programme/scripts
#!/bin/bash #Vérification de la présence du répertoire personnel de l'utilisateur, si non, création du dossier VerifHOME() { if [ ! -d "$HOME/.nom-de-votre-programme" ]; then mkdir "$HOME/.nom-de-votre-programme" fi } #Vérification de la présence du répertoire personnel de l'utilisateur dans le préfixe wine de l'application windows, si non, création du dossier VerifUSER() { if [ ! -d " /opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/users/$USER" ]; then mkdir "/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/users/$USER" fi } #Vérification de la présence du dossier "Mes documents" dans le dossier personnel de l'utilisateur voulant exécuter l'application, création du lien symbolique vers le dossier personnel s'il n'existe pas VerifMyDoc() { if [ ! -d "/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/users/$USER/Mes documents" ]; then ln -s "$HOME/.nom-de-votre-programme" "/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/users/$USER/Mes documents" fi } #Exécution des vérifications VerifHOME VerifUSER VerifMyDoc PATH="/opt/catégorie-de-votre-programme/nom-de-votre-programme/.wine/version-choisie-de-wine/bin/:$PATH" export WINEPREFIX="/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/" export WINEDEBUG="-all" #Forcer la langue FR pour l'environnement et les applications export LANG="fr.FR-utf8" cd "/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/drive_c/Program Files/chemin-du-dossier-de-l'executable-windows-de-votre-programme" #Conserver ci dessous une syntaxe des dossiers propre à windows, avec \ et non / wine "c:\Program Files\chemin-du-dossier-de-l'executable-windows-de-votre-programme\executable.exe" $@
Voici un exemple similaire, pour lancer simplement wineconfig sur ce préfixe avec la version de wine modifiée
PATH="/opt/catégorie-de-votre-programme/nom-de-votre-programme/.wine/version-choisie-de-wine/bin/:$PATH" export WINEPREFIX="/opt/catégorie-de-votre-programme/nom-de-votre-programme/prefix/" export WINEDEBUG="-all" #Forcer la langue FR pour l'environnement et les applications export LANG="fr.FR-utf8" wine "winecfg" $@
Bref, à vous de modifier ces exemples en fonction des besoins, des répertoires de configuration/sauvegardes utilisés par les applications concernées ! ;)
Pour pouvoir utiliser ces scripts, n'oubliez pas de les rendre exécutables !
cd chmod u+x /opt/catégorie-de-votre-programme/nom-de-votre-programme/scripts/nom-du-script
Étape 4 : Script python zenity (gui GTK) pour lancer votre script d'application
Parce que si vous avez plusieurs exécutables à lancer, ça sera quand même plus pratique ! (au moins avoir le choix entre l'application à lancer, et wineconfig)
gksudo gedit /usr/bin/nom-de-votre-programme
#!/bin/bash # Affichage de l'avertissement choix=$(zenity --list --radiolist \ #À compléter selon vos besoins : --text="[Choisir le texte d'avertissement" \ --column "" --column "Choix" --column "Description" \ #À compléter selon vos besoins : TRUE "nom-de-votre-programme" "Lancer nom-de-votre-programme" \ FALSE "Winecfg" "Configuration de l'environnement Windows"); case ${choix} in #À compléter selon vos besoins : "nom-de-votre-programme") # L'utilisateur a choisit nom-de-votre-programme sh "/opt/catégorie-de-votre-programme/nom-de-votre-programme/scripts/nom-du-script" exit ;; "Trainer") #À compléter selon vos besoins : "Winecfg") # L'utilisateur a choisit de configurer Wine sh "/opt/catégorie-de-votre-programme/nom-de-votre-programme/scripts/nom-du-script" exit ;; *) #L'utilisateur n'a pas validé (soit cliqué sur "fermer" ou a fermé la fenêtre) exit ;; esac