Packaging

Les propositions de correctifs ou d'exercices pour Pyromaths.

Modérateur : Développeurs

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 05 mai 2013, 11:04

Je ne crois pas: du moins, j'ai beaucoup plus de mal à le légitimer que pour setenv

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 05 mai 2013, 11:18

Au cas où, voilà ce que ça donnerait. Cela permettrait de supprimer standalone.sh . Le seul fichier spécifique à Mac OS X serait l'icône pyromaths.icns. Qu'est ce que tu en penses ?
# -*- coding: utf-8 -*-
import sys,os
from glob import glob
from setuptools import setup, find_packages

sys.path.append('../../src')
from pyromaths.Values import VERSION

plist = dict(
        CFBundleIdentifier = "org.pyromaths.pyromaths",
        CFBundleName = "Pyromaths",
        CFBundlePackageType = "APPL",
        CFBundleShortVersionString = "%s" % VERSION,
        CFBundleVersion = "%s" % VERSION,
        NSHumanReadableCopyright = u"© Jérôme Ortais",
        CFBundleIconFile = "pyromaths",
        CFBundleDevelopmentRegion = "French",
        CFBundleExecutable = "pyromaths",
        CFBundleDisplayName = "pyromaths",
        CFBundleSignature = "PYTS"
        )

qt_unused = ['QtDBus', 'QtDeclarative', 'QtDesigner', 'QtHelp', 'QtMultimedia',
             'QtNetwork', 'QtOpenGL', 'QtScript', 'QtScriptTools', 'QtSql',
             'QtSvg', 'QtTest', 'QtWebKit', 'QtXml', 'QtXmlPatterns', 'phonon']
OPTIONS = dict(
        plist=plist,
        argv_emulation=True,
        iconfile='pyromaths.icns',
        includes=['gzip'],
        excludes=['PyQt4.%s'%f for f in qt_unused],
        dylib_excludes=qt_unused,
)

setup(
    app         = ['../../src/pyromaths.py'],
    packages    = find_packages('../../src'),
    package_dir = {'': '../../src'},
    data_files  = [('data', glob('../../data/*'))],
    options={'py2app': OPTIONS},
    setup_requires=['py2app>=0.7.3', 'lxml>=2.2.2'],
)

# Current working directory
path = os.getcwd()

# Clean-up unnecessary files/folders
# /: delete PkgInfo (type and creator codes already in Info.plist)
os.chdir(path + "/dist/Pyromaths.app/Contents/")
os.system("rm PkgInfo")
# /Resources: delete unnecessary files
os.chdir(path + "/dist/Pyromaths.app/Contents/Resources")
os.system("rm -rf include lib/python2.*/config lib/python2.*/site.pyc")
# /Resources/data: delete linux folder and unnecessary images
os.chdir(path + "/dist/Pyromaths.app/Contents/Resources/data")
os.system("rm -rf linux/ images/pyromaths-banniere.png images/pyromaths.ico")
# /Resources/lib: delete unnecessary .so files
os.chdir(path + "/dist/Pyromaths.app/Contents/Resources/lib/python2.7/lib-dynload")
os.system("rm _AE.so _codecs_cn.so _codecs_hk.so _codecs_iso2022.so _codecs_jp.so _codecs_kr.so _codecs_tw.so _Evt.so _File.so _hashlib.so _heapq.so _locale.so _multibytecodec.so _Res.so _ssl.so array.so bz2.so cPickle.so datetime.so gestalt.so MacOS.so pyexpat.so resource.so strop.so unicodedata.so PyQt4/Qt.so")
# /Frameworks: delete unnecessary files
os.chdir(path + "/dist/Pyromaths.app/Contents/Frameworks")
os.system("rm -rf *.framework/Contents *.framework/Versions/4.0 *.framework/Versions/Current *.framework/*.prl QtCore.framework/QtCore QtGui.framework/QtGui")
os.chdir(path + "/dist/Pyromaths.app/Contents/Frameworks/Python.framework/Versions/2.7")
os.system("rm -rf include lib Resources")

# Improve french localization"
# Extract strings from qt_menu.nib
os.chdir(path + "/dist")
os.system("ibtool --generate-strings-file qt_menu.strings Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib")
# Convert qt_menu.strings from UTF-16 to UTF-8
os.system("iconv -f utf-16 -t utf-8 qt_menu.strings > qt_menu_tmp.strings")
os.system("mv -f qt_menu_tmp.strings qt_menu.strings")
# Replace the english strings with the french string
os.system("sed -i '' 's/Hide/Masquer/g' qt_menu.strings")
os.system("sed -i '' 's/Others/les autres/g' qt_menu.strings")
os.system("sed -i '' 's/Show All/Tout afficher/g' qt_menu.strings")
os.system("sed -i '' 's/Quit/Quitter/g' qt_menu.strings")
# Import french strings
os.chdir(path + "/dist/")
os.system("ibtool --strings-file qt_menu.strings --write Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu_french.nib Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib")
# Clean-up
os.chdir(path + "/dist/Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources/")
os.system("rm -rf qt_menu.nib")
os.system("mv qt_menu_french.nib qt_menu.nib")
os.chdir(path + "/dist/")
os.system("rm qt_menu.strings")

# Remove all architectures but x86_64
os.chdir(path)
os.system("ditto --rsrc --arch x86_64 dist/Pyromaths.app dist/Pyromaths-x86_64.app")

# setenv.sh hack
# Define a custom executable in order to pass an updated path
# with the location of several LaTeX distributions
os.chdir(path + "/dist")
file = open('Pyromaths-x86_64.app/Contents/MacOS/setenv.sh', 'w')
file.write('#!/bin/sh\n\n# Path to several LaTeX distributions\nMACTEX="/usr/texbin:/usr/local/bin"\nMACPORTS="/opt/local/bin:/opt/local/sbin"\nFINK="/sw/bin"\n\n# Launch Pyromaths with updated path\nPWD=$(dirname "$0")\n/usr/bin/env PATH="$PATH:$MACTEX:$MACPORTS:$FINK" $PWD/pyromaths\n')
os.system("chmod +x Pyromaths-x86_64.app/Contents/MacOS/setenv.sh")
os.system("sed -i '' '23s/pyromaths/setenv.sh/' Pyromaths-x86_64.app/Contents/Info.plist")

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 07 mai 2013, 19:14

À propos du Quit qui n'est pas traduit dans le menu Pyromaths: en modifiant interface.py, pour ne plus prendre en compte self.actionQuitter sur OS X, c'est bien Quitter qui s'affiche. Ce qui est curieux, c'est que ni ce hack, ni les modifications de qt_menu.nib n'étaient nécessaires avec mon ancient environnement de développement, les menus de la version 13.03 sont bien en français…
--- a/interface.py	2013-05-07 20:01:27.000000000 +0200
+++ b/interface.py	2013-05-07 20:05:21.000000000 +0200
@@ -312,7 +312,8 @@
 
         self.menuFichier.addAction(self.actionTous_les_exercices)
         self.menuFichier.addSeparator()
-        self.menuFichier.addAction(self.actionQuitter)
+        if sys.platform != "darwin":  #Cas de Mac OS X.
+            self.menuFichier.addAction(self.actionQuitter)
         self.menu_propos.addAction(self.actionAcceder_au_site)
         self.menu_propos.addSeparator()
         self.menu_propos.addAction(self.action_a_propos)

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 08 mai 2013, 15:31

Bizarre cette histoire de Quit… Mais bon, je ne suis pas un expert Qt! :)
Elle sert à quoi cette self.actionQuitter, si tu peux t'en passer? On peut pas tous s'en débarrasser?

Pour ce qui est de supprimer standalone.sh, de voir le résultat tend à confirmer mon sentiment initial: je trouve cette série de commandes shell assez disgracieuse et pas très opportune…
Si on veut vraiment inclure tout ça dans setup.py, autant laisser ces commandes dans un script shell (à la standalone.sh), qu'on appelle depuis setup.py, non? De toute manière, on a besoin d'un dossier avec quelques fichiers spécifiques à telle ou telle plateforme (comme scripts/...).

Bon, je vais essayer de publier le setup.py unique sur une nouvelle branche 'pack", comme prévu, pour qu'on puisse avoir quelque chose de concret à tester/améliorer. Dans l'état actuel des choses, je ne pense pas que ça vaille le coup d'être publié dans 'develop'.
Dans l'ensemble les choses ont l'air de fonctionner, mais je butte toute fois sur le packaging debian -- sans rapport semble-t-il avec l'unicité de setup.py:
building_pyromaths/src/pyromaths.py
dpkg-source: erreur: abandon suite à des modifications amont inattendues, voir /tmp/pyromaths_13.05-01.diff.lmFz5v
dpkg-source: info: vous pouvez intégrer les modifications locales dans dpkg-source --commit
J'ai remarqué que dans notre précédent paquet source il manquait des fichiers (notamment tout le dossier scripts/) -- c'est un peu génant quand par ailleurs il n'existe pas de dépôt git public; Par contre, il inclut le dossier debian (copié de scripts/linux/debian par scripts/creer_packages.sh). Cela est dû semble-t-il au fait que l'archive source publiée est celle servant à construire le paquet debian. Je pense que notre paquet source devrait être plus complet.
C'est ce que fait par défaut (commande sdist) le nouveau setup.py. En revanche, il faut contrôler qu'il n'inclue pas des fichiers inutiles dans d'autres paquets. Par exemple, sous linux les commandes bdist et bdist_egg incluent également les fichiers sources *.py en plus des *.pyc.

Pour l'instant, setup.py se contente de rassembler le code contenu dans le setup.py de chaque plateforme, en conditionnant son exécution à la plateforme utilisée. Cela permet de factoriser notamment tout le travail autour des metadata du projet. Cela rassemble également dans un fichier les déclarations liées à l'arborescence des sources, et de factoriser simplement un maximum de ressources communes.
Pour autant, il faudrait vérifier dans différentes situations que son comportement est conforme à ce qui est attendu. Je pense par exemple aux eggs python: ne doivent-ils pas être génériques, alors qu'ici ils dépendent de la plateforme qui a servi à les fabriquer?

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 09 mai 2013, 09:42

djinn a écrit :Bon, je vais essayer de publier le setup.py unique sur une nouvelle branche 'pack'
Publié et mis à jour (2 nouveaux patchs). Les paquets semblent désormais se construire normalement…
Note: Les paquets sont construits dans build/ et publiés dans dist/.

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 09 mai 2013, 15:05

djinn a écrit :Bizarre cette histoire de Quit… Mais bon, je ne suis pas un expert Qt! :)
Elle sert à quoi cette self.actionQuitter, si tu peux t'en passer? On peut pas tous s'en débarrasser?
Elle permet de disposer de l'action Quitter dans les menus de la barre de menus, mais sur OS X, il y a un comportement particulier pour respecter les standards du système.

De même, si on modifie self.action_a_propos.setText(u"À propos") par self.action_a_propos.setText(u"About"), le menu À propos se retrouve bien dans le menu Pyromaths, comme on peut s'y attendre sur OS X. Mais à nouveau il n'est pas traduit (par QObject::tr() si j'ai bien compris).

Même en ajoutant un fichier locversion.plist dans Pyromaths-x86_64.app/Contents/Resources/fr.lproj/, avec le contenu suivant, comme préconisé ici, le menu Pyromaths n'est pas traduit:

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
     <key>LprojCompatibleVersion</key>
     <string>123</string>
     <key>LprojLocale</key>
     <string>fr</string>
     <key>LprojRevisionLevel</key>
     <string>1</string>
     <key>LprojVersion</key>
     <string>123</string>
 </dict>
 </plist>

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 09 mai 2013, 17:06

Arf. Je n'ai toujours pas d'environnement Mac fonctionnel et, quitte à devoir en réinstaller un, je vais essayer avec une version d'OSX 10.8 -- même si c'est pas gagné de la booter sous Virtual Box.
Je crains de ne pas pouvoir beaucoup t'aider à ce stade. À moins qu'un spécialiste Qt/Mac passe dans le coin? :)

Par contre, de ton côté, si tu pouvais checker la branche "pack" et vérifier que pkg/mac/make_standalone.sh fonctionne toujours, ça me rendrait bien service… :-P

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 09 mai 2013, 21:56

Sur la branche pack, pkg/mac/make_standalone.sh fonctionne bien, c'est du beau travail :)

Sans être un expert Qt, avec un regard neuf et tes compétences, je suis sûr que tu peux faire avancer la traduction de la barre de menu (avec une machine virtuelle avec OS X 10.7 ou 10.8 ;) )

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 11 mai 2013, 18:16

Yves a écrit :Sur la branche pack, pkg/mac/make_standalone.sh fonctionne bien, c'est du beau travail :)
Super, merci! :)
Désormais ce n'est plus pkg/mac/make_standalone.sh mais tout simplement: make app. J'espère que ça fonctionne encore… :P
Yves a écrit :Sans être un expert Qt, avec un regard neuf et tes compétences, je suis sûr que tu peux faire avancer la traduction de la barre de menu (avec une machine virtuelle avec OS X 10.7 ou 10.8 ;) )
Je galère avec mes installs d'OSX:
  • Mon ancienne version d'OSX 10.7.3 a un environnement de développement cassé. Je n'arrivais pas à produire une appli 64 bits (des libs 32 bits seulement se faisaient stripper en chemin). J'ai essayé de réparer, d'upgrader… en vain. J'ai fini par l'effacer pour gagner de la place, car…
  • J'avais commencé par ré-installer un OSX 10.7.3 afin d'utiliser les "instantanés" pour avoir un environnement de développement et plusieurs environnements de test au sein de la même machine virtuelle. Toujours pas réussi à remettre en place un environnement de dév fonctionnel dessus, cela dit.
  • Du coup, j'ai essayé une version 10.8 iAtkos, en suivant ce tuto. Peine perdue: ça plante avant la fin de l'install et je n'ai pas de système installé au reboot (pas de bootloader en fait).
  • Du coup, j'ai essaye une version 10.8 "vanilla" plus Hackboot, en suivant ce tuto. Même résultats qu'au-dessus.
Tout ça pour dire que j'ai vraiment essayé mais que je fais fasse à une certaine résistance de la part de l'ennemi… ;-)
Comme je ne considère pas ce Quit dans les menus Mac comme un gros problème en soi, je préfère me concentrer sur d'autres questions -- que je peux par ailleurs faire avancer sur mon système. J'ai l'impression d'être plus productif. :)

À ce sujet, j'en suis arrivé à un point intéressant sur pack. Pour aller vite: je crois qu'on peut tester intensivement et envisager l'intégration dans develop.
Finalement, je me repose sur GNU Make, un outil toujours aussi efficace pour ce genre de choses (et qui présente l'avantage d'être probablement déjà installé sur toutes nos machines).
Tout tient dans un Makefile relativement sobre (200 lignes, commentaires et aide compris), que l'on invoque comme ceci:
$ make help
#
# Build pyromaths packages in several formats.
#
# Usage (Unix):
#	$ make src          # Make full-source archive(s)
#	$ make egg          # Make python egg
#	$ make rpm          # Make RPM package
#	$ make deb          # Make DEB package
#	$ make [all]        # Make all previous archives/packages
#
# Usage (Mac):
#	$ make app          # Make standalone application
#
# Usage (Windows):
#	$ make exe          # Make standalone executable (experimental)
#
# And also:
#	$ make version      # Apply target $VERSION [13.03] to sources
# 	$ make clean        # Clean-up build/dist folders and source tree
#	$ make repo         # Make debian repository
#
# Notes:
#	- Notice the source achive $FORMATS produced [bztar,zip].
#	- Mangle with $OUT to make it quieter/verbose/log to output file.
Le processus de génération d'archives/paquets a été rationalisé, de sorte que dans la plupart des cas, quelques lignes suffisent:
rpm: version
	# Make RPM package
	$(CLEAN)
	echo "$(MANIFEST-unix)" > MANIFEST.in
	python setup.py bdist --formats=rpm -b $(BUILD) -d $(DIST) $(OUT)
Outre le fait qu'il ne s'agit finalement que d'un wrapper autour de setup.py (appel en ligne 5), on remarque qu'il suffit d'un nettoyage standard des sources (ligne 3) et de générer un MANIFEST.in à partir d'un modèle (ligne 4).

En effet, pour contrôler finement quel fichier setup.py incluera (ou non) je n'ai trouvé que le mécanisme distutils du fichier MANIFEST.in. On définit notamment un manifeste par plateforme, en héritant éventuellement d'autres manifestes (dans l'exemple suivant: MANIFEST-min):
# Unix:
MANIFEST-unix := $(MANIFEST-min)\
	exclude data/images/pyromaths.icns           \n\
	exclude data/images/pyromaths.ico            \n\
# Mac app:
MANIFEST-mac := $(MANIFEST-min)\
	prune data/linux                             \n\
	exclude data/images/pyromaths.ico            \n\
	exclude data/images/pyromaths-banniere.png   \n\
On note au passage que l'icône Mac (pyromaths.icns) a pu être déplacé dans data/images, sans s'inviter dans les paquets Unix par exemple. De même, data/linux ne figurera pas dans les paquets Mac, par exemple.

Du coup, sans make-scripts ni data-files dans le dossier pkg/, il n'a plus de raison d'être: debian/ peut être déplacé à la racine et les deux fichiers utilitaires restant dans utils/.
On obtient donc à la racine:
$ ls -l
-rw-rw-r--  AUTHORS
-rw-rw-r--  COPYING
drwxrwxr-x  data
drwxrwxr-x  debian
-rw-rw-r--  Makefile
-rw-rw-r--  NEWS
-rwxrwxr-x  pyromaths
-rw-rw-r--  README
-rwxrwxr-x  setup.py
drwxrwxr-x  src
drwxrwxr-x  test
drwxrwxr-x  utils
Note: Tous les paquets/archives sont construits dans build/ et aboutissent dans dist/ (non-représentés ici).

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 11 mai 2013, 23:36

djinn a écrit :Mon ancienne version d'OSX 10.7.3 a un environnement de développement cassé. Je n'arrivais pas à produire une appli 64 bits (des libs 32 bits seulement se faisaient stripper en chemin).
Es-tu sûr que ta machine virtuelle émule bien un processeur 64 bits ? La commande suivante affiche 1 si c'est le cas et 0 sinon:
sysctl hw |grep 64bit
djinn a écrit :Désormais ce n'est plus pkg/mac/make_standalone.sh mais tout simplement: make app. J'espère que ça fonctionne encore… :P
Pas pour l'instant.

J'ai deux correctifs à proposer:
  • Sur OS X, ce n'est pas GNU sed mais un sed issu de BSD et l'option i requiert un paramètre pour préciser l'extension d'un fichier backup et si on ne souhaite pas de backup il faut utiliser une chaîne vide:
    sed -i '' "s/VERSION\s*=\s*'.*'/VERSION = '$(VERSION)'/" src/pyromaths/Values.py
  • Il manque les parenthèses autour de $APP dans une commande; il faut écrire :
    ibtool --generate-strings-file qt_menu.strings $(APP)/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib &&\
Une fois ces deux correctifs appliqué, ça ne fonctionne pas encore:
$ make app
# Apply target version (13.03) to sources
sed -i '' "s/VERSION\s*=\s*'.*'/VERSION = '13.03'/" src/pyromaths/Values.py
# Make standalone Mac application
rm -f MANIFEST.in && rm -rf src/*.egg-info && rm -rf /Users/administrateur/pyromaths/build/app && find . -name '*~' | xargs rm -f && find . -iname '*.pyc' | xargs rm -f
echo "include AUTHORS COPYING NEWS                 \n exclude MANIFEST.in                          \n recursive-include data *                     \n  prune test                                   \n  prune data/linux                             \n exclude data/images/pyromaths.ico            \n exclude data/images/pyromaths-banniere.png   \n " > MANIFEST.in
python setup.py py2app -b /Users/administrateur/pyromaths/build -d /Users/administrateur/pyromaths/dist > /dev/null       
/usr/bin/strip: can't process non-object and non-archive file: /Users/administrateur/pyromaths/dist/Pyromaths.app/Contents/Frameworks/pyromaths
# ..Improve french localization..."
# ....Extract strings from qt_menu.nib
cd /Users/administrateur/pyromaths/dist                                                         &&\
		ibtool --generate-strings-file qt_menu.strings /Users/administrateur/pyromaths/dist/Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib &&\
		iconv -f utf-16 -t utf-8 qt_menu.strings > qt_menu_tmp.strings &&\
		mv -f qt_menu_tmp.strings qt_menu.strings                      &&\
		sed -i '' 's/Hide/Masquer/g' qt_menu.strings                   &&\
		sed -i '' 's/Others/les autres/g' qt_menu.strings              &&\
		sed -i '' 's/Show All/Tout afficher/g' qt_menu.strings         &&\
		sed -i '' 's/Quit/Quitter/g' qt_menu.strings
# ....Import french strings
cd /Users/administrateur/pyromaths/dist/Pyromaths.app/Contents/Frameworks/QtGui.framework/Versions/4/Resources          &&\
		ibtool --strings-file IST/qt_menu.strings --write qt_menu_french.nib qt_menu.nib &&\
	# ....Clean-up
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [app] Error 2
L'erreur se trouve dans cette section; le reste du code est fonctionnel. Une idée ?
ibtool --strings-file $(DIST)/qt_menu.strings --write qt_menu_french.nib qt_menu.nib &&\
# ....Clean-up
rm -rf qt_menu.nib && mv qt_menu_french.nib qt_menu.nib

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 12 mai 2013, 07:33

Yves a écrit :Es-tu sûr que ta machine virtuelle émule bien un processeur 64 bits ?
$ sysctl hw | grep 64bit
hw.cpu64bit_capable: 1
Yves a écrit :J'ai deux correctifs à proposer:
Merci: correctifs acceptés (et commités). :-)
Yves a écrit :L'erreur se trouve dans cette section; le reste du code est fonctionnel. Une idée ?
Enlever la ligne de commentaire située après le && ? En passant, si tu pull, je l'ai enlevée…

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 12 mai 2013, 09:53

Sans le commentaire, effectivement ça fonctionne. Aurais-tu une explication ?

Il manque également des parenthèses autour de la variable DIST; il faut écrire:
ibtool --strings-file $(DIST)/qt_menu.strings
En appelant py2app avec l'option -O2, on optimise la taille de l'application et on gagne quelques centaines de ko:
python setup.py py2app -O2
Deux problèmes subsistent:
  • les images images/pyromaths-banniere.png, images/pyromaths.ico et le dossier linux sont présents dans le dossier Pyromaths.app/Contents/Resources/data
  • un fichier exécutable pyromaths se retrouve dans Pyromaths.app/Contents/Frameworks/ et py2app affiche l'avertissement suivant:
    /usr/bin/strip: can't process non-object and non-archive file: /Users/administrateur/pyromaths/dist/Pyromaths.app/Contents/Frameworks/pyromaths

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 12 mai 2013, 12:47

Yves a écrit :Sans le commentaire, effectivement ça fonctionne. Aurais-tu une explication ?
Le commentaire se trouvait entre deux commandes liées par un &&, et censées être sur la même ligne (\ final).
Make exécute chaque ligne dans un shell séparé, afin de stopper à la première erreur (i.e. dès qu'un shell retourne une valeur différente de zéro). Cela permet de s'assurer que les commandes précédentes ont fonctionné avant d'exécuter la suite.
Ça peut être gênant, par contre, quand on veut enchaîner plusieurs commandes: par exemple, lorsqu'on se déplace dans un dossier pour y effectuer une série de commandes. Dans ce cas, on enchaîne ces différentes commandes avec &&.
Comme dans un shell, pour sectionner une ligne trop longue en plusieurs plus courte, on utilise le caractère \ en bout de pseudo-ligne.
Yves a écrit :Il manque également des parenthèses autour de la variable DIST
Corrigé et commité. :)
Yves a écrit :Deux problèmes subsistent:
  • les images images/pyromaths-banniere.png, images/pyromaths.ico et le dossier linux sont présents dans le dossier Pyromaths.app/Contents/Resources/data
  • un fichier exécutable pyromaths se retrouve dans Pyromaths.app/Contents/Frameworks/ (...)
On dirait que py2app ne suit pas le directives du MANIFEST.in… À creuser. :(
L'exécutable est le pyromaths situé à la racine du projet. Inutilisé dans le contexte py2app, il est voué à disparaître -- ou du moins à bouger.

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 12 mai 2013, 14:10

OK, merci pour tes explications sur le fonctionnement de Make :)

Tu n'as pas souhaité commiter l'option d'optimisation -O2 de py2app que j'avais évoqué dans mon post précédent ?
$(setup) py2app -O2 -b $(BUILD) -d $(DIST) $(OUT)

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 12 mai 2013, 15:52

Yves a écrit :OK, merci pour tes explications sur le fonctionnement de Make :)
Je ne sais pas si c'est ironique, mais dans le doute je vais quand-même en rajouter une couche… Ça peut toujours servir à quelqu'un, ou au moins servir à mon objectif de faire accepter cette solution au reste des développeurs du projet. ;)

En gros, un Makefile a une syntaxe similaire à celle d'un shell script. Il se compose de deux parties:
  • Une partie "configuration": définition de variables et macros, qui seront utilisées ensuite par le code de construction proprement dit. Extrait:
    ### ENVIRONMENT VARIABLES
    #
    # Path
    PYRO    := $(PWD)
    DIST    := $(PYRO)/dist
    BUILD   := $(PYRO)/build
    
    ### MACROS
    #
    # Remove manifest file, egg-info dir and target build dir, clean-up sources.
    clean = rm -f MANIFEST.in && rm -rf src/*.egg-info && rm -rf $(BUILDIR) &&\
            find . -name '*~' | xargs rm -f && find . -iname '*.pyc' | xargs rm -f
    Chaque instance de $(VAR) sera remplacée par la valeur de la variable VAR (par substitution de texte, façon macro pré-processeur).
  • Une partie "règles de construction": code détaillé pour chaque cible et dépendances entre ces cibles. L'exemple suivant définit trois cibles: version, src et all; all dépend de egg, rpm, deb et src (ligne 11), et src dépend à son tour de version (ligne 5):
    version:
    	# Apply target version ($(VERSION)) to sources
    	$(sed-i) "s/VERSION\s*=\s*'.*'/VERSION = '$(VERSION)'/" src/pyromaths/Values.py
    
    src: version
    	# Make full-source archive(s) (formats=$(FORMATS))
    	$(clean)
    	echo "$(MANIFEST-all)" > MANIFEST.in
    	$(setup) sdist --formats=$(FORMATS) -d $(DIST) $(OUT)
    
    all: egg rpm deb src
    Make résoud les dépendances tout seul, de sorte qu'un 'make all' aura pour effet d'appeler version (duquel dépendent les autres cibles) en premier et une seule fois, puis les cibles egg, rpm, deb et src.
Plus généralement, une cible peut également être un fichier, ce qui rend make particulièrement puissant. Par exemple, la vignette d'un exercice peut dépendre du code source de cet exercice, de sorte qu'à la construction, la vignette est régénérée automatiquement si le code de l'exercice à changé. :D
Yves a écrit :Tu n'as pas souhaité commiter l'option d'optimisation -O2 de py2app que j'avais évoqué dans mon post précédent ?
$(setup) py2app -O2 -b $(BUILD) -d $(DIST) $(OUT)
En effet. J'ai lu pas mal de trucs préconisant la prudence avec -O. Du coup, j'ai considéré que ce n'était pas ma responsabilité de prendre cette décision.
Maintenant, si tu préfères utiliser -O2 pour l'application Mac, je n'y vois aucun inconvénient. Je t'invites même à le commiter directement toi-même… :)

Répondre