Files
tryton/setup.py
T
Phillip Heller 56e78b3259 Fix recognition of Mac OS X based systems
Previously, Mac OS X was recognized during py2app invocation, as well as runtime
by comparison of os.name with 'macos'.  The value of os.name reports as 'posix'
under more recent version of Python built on Mac OS X.  Now, the recognition is
instead done by comparing sys.platform with 'darwin'.

issue2258
review171004
(transplanted from d2d9d6ec6da433a5d7df4b07e089f21536b9e4fb)
2011-11-23 20:42:04 -05:00

368 lines
15 KiB
Python

#!/usr/bin/env python
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from setuptools import setup, find_packages
import os
import glob
import sys
import re
def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()
args = {}
try:
from babel.messages import frontend as babel
args['cmdclass'] = {
'compile_catalog': babel.compile_catalog,
'extract_messages': babel.extract_messages,
'init_catalog': babel.init_catalog,
'update_catalog': babel.update_catalog,
}
args['message_extractors'] = {
'tryton': [
('**.py', 'python', None),
],
}
except ImportError:
pass
data_files=[
('share/pixmaps/tryton', glob.glob('share/pixmaps/tryton/*.png') + \
glob.glob('share/pixmaps/tryton/*.svg')),
('share/locale/bg_BG/LC_MESSAGES',
glob.glob('share/locale/bg_BG/LC_MESSAGES/*.mo')),
('share/locale/cs_CZ/LC_MESSAGES',
glob.glob('share/locale/cs_CZ/LC_MESSAGES/*.mo')),
('share/locale/de_DE/LC_MESSAGES',
glob.glob('share/locale/de_DE/LC_MESSAGES/*.mo')),
('share/locale/es_CO/LC_MESSAGES',
glob.glob('share/locale/es_CO/LC_MESSAGES/*.mo')),
('share/locale/es_ES/LC_MESSAGES',
glob.glob('share/locale/es_ES/LC_MESSAGES/*.mo')),
('share/locale/fr_FR/LC_MESSAGES',
glob.glob('share/locale/fr_FR/LC_MESSAGES/*.mo')),
('share/locale/ru_RU/LC_MESSAGES',
glob.glob('share/locale/ru_RU/LC_MESSAGES/*.mo')),
('share/locale/sl_SI/LC_MESSAGES',
glob.glob('share/locale/sl_SI/LC_MESSAGES/*.mo')),
('share/locale/ja_JP/LC_MESSAGES',
glob.glob('share/locale/ja_JP/LC_MESSAGES/*.mo')),
]
trans_lang = ('bg', 'cs', 'de', 'es', 'fr', 'ru', 'sl', 'ja')
if os.name == 'nt':
import py2exe
args['windows'] = [{
'script': os.path.join('bin', 'tryton'),
'icon_resources': [(1, os.path.join('share', 'pixmaps', 'tryton', 'tryton.ico'))],
}]
args['options'] = {
'py2exe': {
'optimize': 0,
'bundle_files': 3, #don't bundle because gtk doesn't support it
'packages': [
'encodings',
'gtk',
'pytz',
'atk',
'pango',
'pangocairo',
'gio',
],
}
}
args['zipfile'] = 'library.zip'
data_files.append(('', ['msvcr90.dll', 'msvcp90.dll', 'msvcm90.dll']))
manifest = read('Microsoft.VC90.CRT.manifest')
args['windows'][0]['other_resources'] = [(24, 1, manifest)]
elif sys.platform == 'darwin':
import py2app
from modulegraph.find_modules import PY_SUFFIXES
PY_SUFFIXES.append('')
args['app'] = [os.path.join('bin', 'tryton')]
args['options'] = {
'py2app': {
'argv_emulation': True,
'includes': 'pygtk, gtk, glib, cairo, pango, pangocairo, atk, ' \
'gobject, gio, gtk.keysyms',
'resources': 'tryton/plugins',
'frameworks': 'librsvg-2.2.dylib',
'plist': {
'CFBundleIdentifier': 'org.tryton',
'CFBundleName': 'Tryton',
},
'iconfile': os.path.join('share', 'pixmaps', 'tryton',
'tryton.icns'),
},
}
execfile(os.path.join('tryton', 'version.py'))
dist = setup(name=PACKAGE,
version=VERSION,
description='Tryton client',
long_description=read('README'),
author='B2CK',
author_email='info@b2ck.com',
url=WEBSITE,
download_url="http://downloads.tryton.org/" + \
VERSION.rsplit('.', 1)[0] + '/',
packages=find_packages(),
data_files=data_files,
scripts=['bin/tryton'],
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: X11 Applications :: GTK',
'Framework :: Tryton',
'Intended Audience :: End Users/Desktop',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
'Natural Language :: Czech',
'Natural Language :: Dutch',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Russian',
'Natural Language :: Spanish',
'Natural Language :: Slovak',
'Natural Language :: Slovenian',
'Natural Language :: Japanese',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
],
license=LICENSE,
install_requires=[
# "pygtk >= 2.6",
"python-dateutil",
],
extras_require={
'timezone': ['pytz'],
'simplejson': ['simplejson'],
},
**args
)
if os.name == 'nt':
def find_gtk_dir():
for directory in os.environ['PATH'].split(';'):
if not os.path.isdir(directory):
continue
for file in ('gtk-demo.exe', 'gdk-pixbuf-query-loaders.exe'):
if os.path.isfile(os.path.join(directory, file)):
return os.path.dirname(directory)
return None
def find_makensis():
for directory in os.environ['PATH'].split(';'):
if not os.path.isdir(directory):
continue
path = os.path.join(directory, 'makensis.exe')
if os.path.isfile(path):
return path
return None
if 'py2exe' in dist.commands:
import shutil
import pytz
import zipfile
gtk_dir = find_gtk_dir()
dist_dir = dist.command_obj['py2exe'].dist_dir
# pytz installs the zoneinfo directory tree in the same directory
# Make sure the layout of pytz hasn't changed
assert (pytz.__file__.endswith('__init__.pyc') or
pytz.__file__.endswith('__init__.py')), pytz.__file__
zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo')
disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__))
zipfile_path = os.path.join(dist_dir, 'library.zip')
z = zipfile.ZipFile(zipfile_path, 'a')
for absdir, directories, filenames in os.walk(zoneinfo_dir):
assert absdir.startswith(disk_basedir), (absdir, disk_basedir)
zip_dir = absdir[len(disk_basedir):]
for f in filenames:
z.write(os.path.join(absdir, f), os.path.join(zip_dir, f))
z.close()
if os.path.isdir(os.path.join(dist_dir, 'plugins')):
shutil.rmtree(os.path.join(dist_dir, 'plugins'))
shutil.copytree(os.path.join(os.path.dirname(__file__), 'tryton', 'plugins'),
os.path.join(dist_dir, 'plugins'))
if os.path.isdir(os.path.join(dist_dir, 'etc')):
shutil.rmtree(os.path.join(dist_dir, 'etc'))
shutil.copytree(os.path.join(gtk_dir, 'etc'),
os.path.join(dist_dir, 'etc'))
from subprocess import Popen, PIPE
query_loaders = Popen(os.path.join(gtk_dir,'bin','gdk-pixbuf-query-loaders'),
stdout=PIPE).stdout.read()
query_loaders = query_loaders.replace(gtk_dir.replace(os.sep, '/') + '/', '')
loaders_path = os.path.join(dist_dir, 'etc', 'gtk-2.0',
'gdk-pixbuf.loaders')
with open(loaders_path, 'w') as loaders:
loaders.writelines([line + "\n" for line in
query_loaders.split(os.linesep)])
if os.path.isdir(os.path.join(dist_dir, 'lib')):
shutil.rmtree(os.path.join(dist_dir, 'lib'))
shutil.copytree(os.path.join(gtk_dir, 'lib'),
os.path.join(dist_dir, 'lib'))
for file in glob.iglob(os.path.join(gtk_dir, 'bin', '*.dll')):
if os.path.isfile(file):
shutil.copy(file, dist_dir)
for lang in trans_lang:
if os.path.isdir(os.path.join(dist_dir, 'share', 'locale', lang)):
shutil.rmtree(os.path.join(dist_dir, 'share', 'locale', lang))
shutil.copytree(os.path.join(gtk_dir, 'share', 'locale', lang),
os.path.join(dist_dir, 'share', 'locale', lang))
if os.path.isdir(os.path.join(dist_dir, 'share', 'themes', 'MS-Windows')):
shutil.rmtree(os.path.join(dist_dir, 'share', 'themes', 'MS-Windows'))
shutil.copytree(os.path.join(gtk_dir, 'share', 'themes', 'MS-Windows'),
os.path.join(dist_dir, 'share', 'themes', 'MS-Windows'))
makensis = find_makensis()
if makensis:
from subprocess import Popen
Popen([makensis, "/DVERSION=" + VERSION,
str(os.path.join(os.path.dirname(__file__),
'setup.nsi'))]).wait()
Popen([makensis, "/DVERSION=" + VERSION,
str(os.path.join(os.path.dirname(__file__),
'setup-single.nsi'))]).wait()
elif sys.platform == 'darwin':
def find_gtk_dir():
for directory in os.environ['PATH'].split(':'):
if not os.path.isdir(directory):
continue
for file in ('gtk-demo',):
if os.path.isfile(os.path.join(directory, file)):
return os.path.dirname(directory)
return None
if 'py2app' in dist.commands:
import shutil
from subprocess import Popen, PIPE
from itertools import chain
from glob import iglob
gtk_dir = find_gtk_dir()
gtk_binary_version = Popen(['pkg-config', '--variable=gtk_binary_version',
'gtk+-2.0'], stdout=PIPE).stdout.read().strip()
dist_dir = dist.command_obj['py2app'].dist_dir
resources_dir = os.path.join(dist_dir, 'Tryton.app', 'Contents', 'Resources')
gtk_2_dist_dir = os.path.join(resources_dir, 'lib', 'gtk-2.0')
pango_dist_dir = os.path.join(resources_dir, 'lib', 'pango')
if os.path.isdir(pango_dist_dir):
shutil.rmtree(pango_dist_dir)
shutil.copytree(os.path.join(gtk_dir, 'lib', 'pango'), pango_dist_dir)
query_pango = Popen(os.path.join(gtk_dir, 'bin', 'pango-querymodules'),
stdout=PIPE).stdout.read()
query_pango = query_pango.replace(gtk_dir, '@executable_path/../Resources')
pango_modules_path = os.path.join(resources_dir, 'pango.modules')
with open(pango_modules_path, 'w') as pango_modules:
pango_modules.write(query_pango)
with open(os.path.join(resources_dir, 'pangorc'), 'w') as pangorc:
pangorc.write('[Pango]\n')
pangorc.write('ModuleFiles=./pango.modules\n')
if not os.path.isdir(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'engines')):
os.makedirs(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'engines'))
shutil.copyfile(os.path.join(gtk_dir, 'lib', 'gtk-2.0', gtk_binary_version,
'engines', 'libclearlooks.so'), os.path.join(gtk_2_dist_dir,
gtk_binary_version, 'engines', 'libclearlooks.so'))
query_loaders = Popen(os.path.join(gtk_dir,'bin','gdk-pixbuf-query-loaders'),
stdout=PIPE).stdout.read()
loader_dir, = re.findall('# LoaderDir = (.*)', query_loaders)
loader_pkg = (loader_dir.replace(os.path.join(gtk_dir,'lib'), '').
split(os.path.sep)[-3])
loader_dist_dir = os.path.join(resources_dir, 'lib', loader_pkg,
gtk_binary_version, 'loaders')
if os.path.isdir(loader_dist_dir):
shutil.rmtree(loader_dist_dir)
if os.path.isdir(loader_dir):
shutil.copytree(loader_dir, loader_dist_dir)
query_loaders = query_loaders.replace(gtk_dir, '@executable_path/../Resources')
loaders_path = os.path.join(resources_dir, 'gdk-pixbuf.loaders')
with open(loaders_path, 'w') as loaders:
loaders.write(query_loaders)
if os.path.isdir(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'immodules')):
shutil.rmtree(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'immodules'))
shutil.copytree(os.path.join(gtk_dir, 'lib', 'gtk-2.0', gtk_binary_version,
'immodules'), os.path.join(gtk_2_dist_dir, gtk_binary_version, 'immodules'))
query_immodules = Popen(os.path.join(gtk_dir, 'bin', 'gtk-query-immodules-2.0'),
stdout=PIPE).stdout.read()
query_immodules = query_immodules.replace(gtk_dir, '@executable_path/../Resources')
immodules_path = os.path.join(resources_dir, 'gtk.immodules')
with open(immodules_path, 'w') as immodules:
immodules.write(query_immodules)
shutil.copy(os.path.join(gtk_dir, 'share', 'themes', 'Clearlooks',
'gtk-2.0', 'gtkrc'), os.path.join(resources_dir, 'gtkrc'))
for lang in trans_lang:
if os.path.isdir(os.path.join(resources_dir, 'share', 'locale', lang)):
shutil.rmtree(os.path.join(resources_dir, 'share', 'locale', lang))
shutil.copytree(os.path.join(gtk_dir, 'share', 'locale', lang),
os.path.join(resources_dir, 'share', 'locale', lang))
# fix pathes within shared libraries
for library in chain(
iglob(os.path.join(loader_dist_dir, '*.so')),
iglob(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'engines', '*.so')),
iglob(os.path.join(gtk_2_dist_dir, gtk_binary_version, 'immodules', '*.so')),
iglob(os.path.join(pango_dist_dir,'*','modules','*.so'))):
libs = [lib.split('(')[0].strip()
for lib in Popen(['otool', '-L', library],
stdout=PIPE).communicate()[0].splitlines()
if 'compatibility' in lib]
libs = dict(((lib, None) for lib in libs if gtk_dir in lib))
for lib in libs.keys():
fixed = lib.replace(gtk_dir + '/lib',
'@executable_path/../Frameworks')
Popen(['install_name_tool', '-change', lib, fixed,
library]).wait()
for file in ('CHANGELOG', 'COPYRIGHT', 'LICENSE', 'README', 'TODO'):
shutil.copyfile(os.path.join(os.path.dirname(__file__), file),
os.path.join(dist_dir, file + '.txt'))
doc_dist_dir = os.path.join(dist_dir, 'doc')
if os.path.isdir(doc_dist_dir):
shutil.rmtree(doc_dist_dir)
shutil.copytree(os.path.join(os.path.dirname(__file__), 'doc'),
doc_dist_dir)
dmg_file = os.path.join(os.path.dirname(__file__), 'tryton-' + VERSION
+ '.dmg')
if os.path.isfile(dmg_file):
os.remove(dmg_file)
Popen(['hdiutil', 'create', dmg_file, '-volname', 'Tryton Client ' +
VERSION, '-fs', 'HFS+', '-srcfolder', dist_dir]).wait()