URL: https://linuxfr.org/users/vejmarie/journaux/mon-premier-snap-sur-xenial Title: Mon premier snap sur Xenial Authors: vejmarie Date: 2016年06月05日T21:59:24+02:00 License: CC By-SA Tags: snap, debian, ubuntu, apparmor et seccomp Score: 44 La dernière version d'ubuntu introduit un nouveau système de packaging appelé snap. Les snaps sont globalement des systèmes de fichiers squashfs qui contiennent les binaires d'une application et sont soumis au contrôle de [apparmor](https://fr.wikipedia.org/wiki/AppArmor) et [seccomp](https://en.wikipedia.org/wiki/Seccomp) pour garantir l’intégrité du système qui exécutera le snap. Ils sont par la suite distribué par un "store" sous ubuntu ou ils peuvent être installés en ligne de commandes. Au début on se demande l'intérêt d'une telle approche alors que les paquets debian (.deb) ou RedHat (.rpm) existent depuis plus de 20 ans et semblent remplir leurs tâches. En m'impliquant dans les projets Open Hardware, je me suis retrouvé confronté à d'autres profils d'ingénieurs qui ont une vision plus basique de la flexibilité d'un système que nous pouvons avoir en tant qu'informaticiens. Disons pour être claire que globalement un ingénieur en mécanique veut installer son logiciel et ses mises à jours en cliquant sur une icône. Dès que l'on suggère une commande du type apt-get install on a un phénomène de révulsion. L'autre problème auquel nous sommes confrontés en tant que communauté c'est la disparité des bibliothèques et des versions qui peuvent exister entre les systèmes des membres d'une même communauté. Ces disparités peuvent engendrer des problèmes de compatibilité notamment lorsque les logiciels sont en développements actifs. Je me suis alors lancé dans la création de mon premier snap avec FreeCAD. En prenant un peu de recul on est assez loin du traditionnel hello world! et deux semaines plus tard, je peux dire qu'on en est très loin. snap fonctionne suivant un système de préparation, staging et création d'image. Il est ultra modulaire, et l'ensemble de la configuration s'effectue via un unique fichier snapcraft.yaml. Il existe pas mal de tutoriel sur le net plus ou moins bien faits, mais intégrer FreeCAD dans un snap relève plutôt du défi. snap reprend le principe d’intégration continue, et il est donc possible de décrire les étapes de compilation de l'application dans le fichier snapcraft.yaml. Pour être honnête et pour être "développeur" de FreeCAD j'ai omis cette étape. Compiler FreeCAD et l'ensemble de ses dépendances depuis github requiert une prise en main d'un mois environ (et une compile complète 6h sur mon laptop), alors tenter de le faire dans un outils en cours de développement ou en v1 me semblait un peu risqué. J'ai plutôt choisi une approche qui me semblait plus "simple". J'ai fait l’étape de staging dans une VM vagrant. A partir de cette VM, j'ai compilé les dépendances (libMED, [VTK](http://www.vtk.org), [OCCT](http://www.opencascade.com), [Netgen](http://www.hpfem.jku.at/netgen/), [CalculiX](http://www.calculix.de/), puis j'ai copié l'ensemble des binaires nécessaires dans le répertoire de staging de mon snap et ai créé un wrapper de lancement. Au bout d'un mois d'essai ça marche complétement. Alors qu'elles ont été les difficultés ? Qui dit snap dit pas d’accès au système de fichiers système. Donc au revoir: - Le système de configuration de GTK - Les locales - Les fontes - Les répertoires temporaires - L’accès aux fichiers de configuration systèmes Tout ceci doit être présent dans votre snap et vous devez bien entendu utiliser les variables d’environnement pour relocaliser ces fichiers (un conseil regardez toutes les variables XDG_ ...). Au final mon snap fonctionne, le temps de dev n'a pas été aussi long que ça, et si vous voulez tester c'est la https://myapps.developer.ubuntu.com/dev/click-apps/share/09951e1397a86ca9243bebcd715373197c702839fe5c5f9b8f1b5db81767306df0eb07698f8a6b3ac0c4/ Ça peut vous donner une idée de ce que l'on peut réussir à faire au travers de SNAP que j'ai trouvé au final super intéressant et surtout qui résout mon problème d’accès à FreeCAD pour les ingénieurs en mécanique sous linux !. Le paquet FreeCAD arrive ainsi au même niveau que le paquet Windows et MacOS ;) Et pour finir voici le wrapper de lancement qui peut vous servir ! ```bash if [ ! -d "SNAP_USER_DATA/.config" ] then \mkdir $SNAP_USER_DATA/.config fi export CONFIG_DIR=$SNAP_USER_DATA/.config export I18NPATH=$SNAP/usr/share/i18n export LOCPATH=$CONFIG_DIR LANG=en_US ENC=UTF-8 LOC="$LANG.$ENC" \rm -rf $CONFIG_DIR/$LOC if [ ! -e $CONFIG_DIR/$LOC ]; then ($SNAP/usr/bin/localedef --prefix=$CONFIG_DIR -f $ENC -i $LANG $CONFIG_DIR/$LOC)>& /dev/null fi export LC_ALL=$LOC export LANG=$LOC export LANGUAGE=${LANG%_*} export LIBGL_DRIVERS_PATH=$SNAP/usr/lib/x86_64-linux-gnu/dri export GTK_PATH=$SNAP/usr/lib/x86_64-linux-gnu/gtk-2.0/modules export LD_LIBRARY_PATH=$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu/gio/modules:$SNAP/usr/lib/x86_64-linux-gnu/gtk-2.0/modules:$LD_LIBRARY_PATH export GTK_DATA_PREFIX=$CONFIG_DIR export GTK_EXE_PREFIX=$SNAP/usr export GDK_PIXBUF_MODULE_FILE=$SNAP/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders.cache export PYTHONHOME="$SNAP/usr" export PYTHONPATH="$SNAP/usr" export XDG_DATA_DIR="$SNAP/usr/share/glib-2.0/schemas" export GSETTINGS_SCHEMA_DIR="$SNAP/usr/share/glib-2.0/schemas" export LANG=en_US.UTF-8 export FREECAD_USER_DATA="$SNAP_USER_DATA" export XDG_CONFIG_HOME="$CONFIG_DIR" export MATPLOTLIBDATA="$SNAP/usr/share/matplotlib/mpl-data" export GIO_EXTRA_MODULES="$SNAP/usr/lib/x86_64-linux-gnu/gio/modules" export XDG_RUNTIME_DIR="$CONFIG_DIR" export QT_QPA_FONTDIR="$SNAP/usr/share/fonts" export XDG_DATA_HOME="$SNAP/usr/share/icons" export XDG_DATA_DIRS="$SNAP/usr/share/mime" \cp -rf $SNAP/fontconfig $CONFIG_DIR if [ ! -d "$CONFIG_DIR/.cache/fontconfig" ] then ($SNAP/usr/bin/fc-cache --really-force --verbose)>& /dev/null \cp $SNAP/etc/matplotlibrc $CONFIG_DIR/matplotlibrc fi export MPLCONFIGDIR="$CONFIG_DIR" export GTK2_RC_FILES="$SNAP/usr/share/themes/Raleigh/gtk-2.0/gtkrc" exec "$SNAP/opt/local/FreeCAD-0.17/bin/FreeCAD" -u $CONFIG_DIR/user.cfg -s $CONFIG_DIR/system.cfg $@ ```

AltStyle によって変換されたページ (->オリジナル) /