Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
integrer-applications-windows-dans-paquets-logiciels [Le 18/08/2011, 14:15]
billou créée
integrer-applications-windows-dans-paquets-logiciels [Le 30/01/2024, 20:21] (Version actuelle)
89.86.155.3
Ligne 1: Ligne 1:
 +{{tag>​Bionic Xenial Focal Jammy tutoriel wine}}
 +
 ====== Intégrer une application Windows dans un paquet logiciel ====== ====== Intégrer une application Windows dans un paquet logiciel ======
  
-<note important>​Page en cours de construction,​ veuillez ​notez que cette manipulation peut différer partiellement en fonction des applications visées, et sera donc à adapter ​aux besoins ​requis.</​note>​+<note important>​Veuillez ​notez que cette manipulation peut différer partiellement en fonction des applications visées, et sera donc à adapter ​à vos besoins.</​note>​
  
-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.+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 ​fini 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é. 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.+Ainsi, le programme en question sera installable en seulement ​quelques ​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 ===== ===== Étape 1 : Récupérer le préfixe Wine =====
Ligne 15: Ligne 17:
 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**"​ 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 le copier dans /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme+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
  
 <note tip>​Concernant les catégories de programmes, afin que la hiérarchie des dossiers reste homogène pour tout le monde et en cas d'​échange de paquets, je vous conseille de diviser les possibilités en 7 catégories (comme le menu Gnome), avec le nom anglais. (Par exemple "​accessories,​ games, internet, etc...)</​note>​ <note tip>​Concernant les catégories de programmes, afin que la hiérarchie des dossiers reste homogène pour tout le monde et en cas d'​échange de paquets, je vous conseille de diviser les possibilités en 7 catégories (comme le menu Gnome), avec le nom anglais. (Par exemple "​accessories,​ games, internet, etc...)</​note>​
 +
 +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
 +
 +<​code>​cd ​ /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​prefix</​code>​
 +<​code>​rm harddiskvolume0 && rm dosdevices/​c:</​code>​
 +
 +Il ne reste plus qu'à recréer les bons liens :
 +
 +<​code>​ln -s drive_c/ harddiskvolume0</​code>​
 +<​code>​ln -s drive_c/ dosdevices/​c:</​code>​
 +
 +Ensuite on transfère tous les propriétés de dossiers, sous dossiers, et fichiers à root
 +
 +<​code>​sudo chown root:root /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​prefix -R</​code>​
 +
 +Et pour les droits, on les accorde à tous les utilisateurs
 +
 +<​code>​sudo chmod 777  /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​prefix -R</​code>​
 +
 +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 ===== ===== Étape 2 : Modifier ​ puis compiler Wine =====
Ligne 23: Ligne 51:
 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. 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 ! :-) 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 => https://​dl.winehq.org/​wine/​source/​
 +
 +
 +Dans mon cas, je choisit donc de télécharger wine-1.3.26.tar.bz2,​ dernière version en date
 +<​code>​wget https://​dl.winehq.org/​wine/​source/​1.3/​wine-1.3.26.tar.bz2</​code>​
 +
 +Ensuite je décompresse
 +<​code>​bsdtar -xf wine-1.3.26.tar.bz2</​code>​
 +
 +Et je me place dans le dossier des sources de wine
 +<​code>​cd wine-1.3.26</​code>​
 +
 +
 +installation des dépendance de wine
 +
 +<​code>​sudo apt-get -y build-dep wine</​code>​
 +
 +<​code>​sudo apt-get -y build-dep wine-stable</​code>​
 +
 +<​code>​sudo apt-get -y build-dep winehq-stable</​code>​
 +
 +Ensuite, il est nécessaire d'​éditer 3 fichiers
 +
 +<​code>​gedit libs/​wine/​config.c</​code>​
 +
 +<​note>​a partir de wine 8.3 le fichier libs/​wine/​config.c ​ a étais supprimer</​note>​
 +
 +<​code>​gedit dlls/​ntdll/​server.c</​code>​
 +
 +<​note>​si le fichier dlls/​ntdll/​server.c éssayez dlls/​ntdll/​unix/​server.c</​note>​
 +
 +<​code>​gedit dlls/​ntdll/​unix/​server.c</​code>​
 +
 +<​code>​gedit server/​request.c</​code>​
 +
 +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
 +
 +<code c>if (st.st_mode & 077) printf( "'​%s'​ must not be accessible by other users\n",​ serverdir );</​code>​
 +
 +Une fois ceci fait, nous pouvons enfin passer à la compilation.
 +
 +<note important>​Dans l'​exemple ci dessous, vous devez adapter la commande au chemin choisit du dossier qui contiendra votre préfixe wine, vous pouvez également y rajouter l'​option ​ --disable-win16 s'il ne s'​agira pas d'un vieux programme 16bits, et  pour le "​make"​ l'​option -j3 si votre processeur dispose de 2 cœurs, -j8 s'il en a 7, etc... Ça permettra d'​exploiter pleinement ce dernier pour compiler plus vite ;​-)</​note>​
 +
 +<​code>​./​configure --prefix="/​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​.wine/​version-choisie-de-wine"</​code>​
 +
 +Premièrement,​ on lance la compilation des dépendances propres au fonctionnement de wine
 +
 +<​code>​make depend</​code>​
 +
 +Ensuite on lance la compilation de wine
 +
 +<​code>​make</​code>​
 +
 +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
 +
 +<​code>​sudo make install</​code>​
 +
 +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...)
 +<​code>​mkdir /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​scripts</​code>​
 +
 +<​code>​
 +#!/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" ​ $@
 +</​code>​
 +
 +Voici un exemple similaire, pour lancer simplement wineconfig sur ce préfixe avec la version de wine modifiée
 +
 +<​code>​
 +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" ​ $@
 +</​code>​
 +
 +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 !
 +
 +<​code>​sudo chmod u+x /​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​scripts/​nom-du-script</​code>​
 +
 +Q
 +===== É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)
 +
 +<​code>​gksudo gedit /​usr/​bin/​nom-de-votre-programme</​code>​
 +
 +<​code>​
 +#!/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
 + ;;
 +
 +#À 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
 +</​code>​
 +
 +
 +
 +Pour moi Billou ce script ne fonctionne pas aussi pourquoi créer un autre script avant si ont peut métre les variable dans le zenity un example qui fonctionne
 +
 +<​code>#​!/​bin/​bash
 +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"​
 +
 +programme=`zenity --list \
 +  --title="​faite votre choix dnas la liste" \
 +  --column="​Choix"​ \
 +    "​lancer nom de votre programme"​ \
 +    "​winecfg"​`
 +if [ "​$programme"​ == "​winecfg"​ ]
 +then
 +# commande pour lancer winecfg
 +wine winecfg
 +elif [ "​$programme"​ == "​lancer nom de votre programme"​ ]
 +then
 +# commande pour lancer votre programme
 +wine "​c:​\Program Files\chemin-du-dossier-de-l'​executable-windows-de-votre-programme\executable.exe"​
 +else
 +exit 1
 +fi
 +exit 0</​code>​
 +
 +
 +===== Étape 5 : Créer votre paquet logiciel =====
 +
 +<note important>​Attention,​ comme pour beaucoup de programmes Linux, il est conseiller de divisier votre paquet en deux parties, l'un contenant les données "​simples",​ l'​autre des données plus lourdes, afin de faciliter la mise à jour d'une partie des fichiers, sans devoir tout re-télécharger / réinstaller !
 +Par exemple, pour un jeu, un paquet contenant tout les fichiers sauf **/​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​prefix/​drive_c/​Program Files/​chemin-du-dossier-de-votre-programme-windows**,​ et l'​autre contenant ce dossier, ainsi, si vous mettez à jour le premier petit paquet, vous n'​aurez pas à vous soucier de l'​autre vu que les données ne devraient pas changer.</​note>​
 +
 +En fait, créer un paquet est très simple, il suffit de créer un dossier contenant l'​arborescence complète des fichiers qui seront copiés.
 +
 +Ainsi, vous retrouverez le plus souvent dans le dossier créé, ​ un dossier opt, un dossier usr, etc... L'​important étant d'y copier tel que présents sur le systèmes, tous les fichiers concernés jusque là, tout doit correspondre ! (vous comprendrez facilement ce que je veux dire, en décompressant n'​importe quel paquet *.deb ;) )
 +
 +Il faudra juste rajouter les fichiers nécessaires pour qu'un raccourci apparaisse dans votre menu Applications :
 +
 +__Dans votre dossier, créez les dossiers suivant cette arborescence :__
 +
 +**/​usr/​share/​applications**
 +
 +**/​usr/​share/​pixmaps**
 +
 +Dans le dossier applications,​ vous devez créer le fichier de configuration du raccourci dans le menu :
 +
 +<​code>​cd usr/​share/​applications</​code>​
 +<​code>​gksudo gedit nom-du-programme.desktop</​code>​
 +
 +<​code>​
 +#​!/​usr/​bin/​env xdg-open
 +
 +[Desktop Entry]
 +Version=version du programme
 +Encoding=UTF-8
 +Name=
 +GenericName=
 +Comment=
 +Name[fr_FR]=
 +Comment[fr_FR]=
 +Commen[fr_FR]t=
 +Exec="/​usr/​bin/​nom-de-l'​executable-du-script-zenithy-du-programme"​
 +Icon=nom-de-l'​icone-du-dossier-pixmaps
 +Terminal=false
 +Type=Application
 +Categories=Game/​Internet/​Accesories/​etc-au-choix
 +</​code>​
 +
 +Concernant "​**usr/​share/​pixmaps**",​ le dossier doit contenir l’icône du programme en question (nom-de-l'​icone-du-dossier-pixmaps) en deux formats, PNG, et XPM !
 +
 +Une fois tout ceci fait, il faudra créer le fichier de configuration du paquet debian.
 +
 +Pour celà, dans le dossier du paquet à créer, à coté de l'​arborescence habituelle ou l'on peut voir opt, et usr, vous devez créer un dossier nommé "​**DEBIAN**"​
 +
 +<​code>​mkdir DEBIAN</​code>​
 +
 +Puis dans ce dossier on crée le fichier "​**control**"​
 +
 +<​code>​gksudo gedit control</​code>​
 +
 +<​code>​
 +Package: nom-du-paquet
 +Version: version du paquet (en chiffre)
 +Section: main
 +Priority: extra
 +Architecture:​ i386
 +Depends: (séparer les dépendances du paquet par une virgule)
 +Installed-Size:​ spécifier en Ko, la taille du programme une fois installée
 +Maintainer: C'est vous, laissez votre griffe
 +Description:​ Donner la description du programme
 +</​code>​
 +
 +Voilà, vous enregistrez,​ puis on corrige une quelconque erreur de droit (au cas ou)
 +
 +<​code>​sudo chown root:root /​chemin/​nom-du-dossier-du-paquet -R</​code>​
 +<​code>​sudo chmod 755 /​chemin/​nom-du-dossier-du-paquet -R</​code>​
 +<​code>​sudo chmod 777 /​chemin/​opt/​catégorie-de-votre-programme/​nom-de-votre-programme/​prefix/​drive_c/​ -R</​code>​
 +
 +Et maintenant, il ne reste plus... Qu'à créer le/les paquets (à refaire avec chaque paquet créé évidemment,​ si vous avez dissocié les fichiers et dossiers en plusieurs paquets)
 +
 +<​code>​cd ..
 +dpkg --build nom-du-dossier-du-paquet nom-du-paquet.deb
 +</​code>​
 +
 +Selon la taille de votre paquet, ça sera plus ou moins long, attention toutefois, les paquets de plusieurs Go ne sont pas pris en charge par les outils graphiques d'​Ubuntu et Debian à l'​installation (synaptic, gdebi...), il faudra les installer avec un sudo dpkg -i nom-du-paquet.deb ! :)
 +
 +Voilà, ce tutoriel est terminé, en l'​état,​ il n'​appartient plus qu'à vous d'​améliorer tout ça, je vous ai donné les bases de l'​écosystème pour vous en sortir, libre à vous d'​adapter à vos besoin, de créer des gui  ou scripts simplifiant la transposition préfixe => paquet, etc ! =D
 +
 +**Billou, du forum ubuntu-fr, à votre service ! ^^**
  • integrer-applications-windows-dans-paquets-logiciels.1313669717.txt.gz
  • Dernière modification: Le 15/12/2011, 15:19
  • (modification externe)