Différences
Ci-dessous, les différences entre deux révisions de la page.
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 11/09/2022, 12:17] moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== 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 15: | ||
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 49: | ||
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 => 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 | ||
+ | <code>wget http://www.ibiblio.org/pub/linux/system/emulators/wine/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 avec le script de wine | ||
+ | |||
+ | <code>wget http://winezeug.googlecode.com/svn/trunk/install-wine-deps.sh</code> | ||
+ | |||
+ | |||
+ | |||
+ | <code>sudo sh http://winezeug.googlecode.com/svn/trunk/install-wine-deps.sh</code> | ||
+ | |||
+ | |||
+ | |||
+ | Ensuite, il est nécessaire d'éditer 3 fichiers | ||
+ | |||
+ | <code>gedit libs/wine/config.c</code> | ||
+ | <code>gedit dlls/ntdll/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 ! ^^** |