diff --git a/data/gajim-remote.desktop.in.in b/data/gajim-remote.desktop.in similarity index 100% rename from data/gajim-remote.desktop.in.in rename to data/gajim-remote.desktop.in diff --git a/data/org.gajim.Gajim.desktop.in.in b/data/org.gajim.Gajim.desktop.in similarity index 100% rename from data/org.gajim.Gajim.desktop.in.in rename to data/org.gajim.Gajim.desktop.in diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..9a774deb4 --- /dev/null +++ b/setup.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 + +import os +import sys + +if sys.version_info[0] < 3: + sys.exit('Tried to install with Python 2, gajim only supports Python 3.') + +import codecs + +from setuptools import setup, find_packages +# from distutils.core import setup +from distutils import log +from distutils.command.build import build as _build +#from distutils.command.install import install as _install +#from setuptools.command.build_py import build_py as _build # build_dir is unknown +from distutils.util import convert_path, newer + +import gajim + +pos = [x for x in os.listdir('po') if x[-3:] == ".po"] +ALL_LINGUAS = sorted([os.path.split(x)[-1][:-3] for x in pos]) + +def build_trans(build_cmd): + ''' + Translate the language files into gajim.mo + ''' + data_files = build_cmd.distribution.data_files + for lang in ALL_LINGUAS: + po_file = os.path.join('po', lang + '.po') + mo_file = os.path.join(build_cmd.build_base, 'mo', lang, 'LC_MESSAGES', + 'gajim.mo') + mo_file_unix = (build_cmd.build_base + '/mo/' + lang + + '/LC_MESSAGES/gajim.mo') + mo_dir = os.path.dirname(mo_file) + if not(os.path.isdir(mo_dir) or os.path.islink(mo_dir)): + os.makedirs(mo_dir) + + if newer(po_file, mo_file): + cmd = 'msgfmt %s -o %s' % (po_file, mo_file) + if os.system(cmd) != 0: + os.remove(mo_file) + msg = 'ERROR: Building language translation files failed.' + ask = msg + '\n Continue building y/n [n] ' + reply = input(ask) + if reply in ['n', 'N']: + raise SystemExit(msg) + log.info('Compiling %s >> %s', po_file, mo_file) + + #linux specific piece: + target = 'share/locale/' + lang + '/LC_MESSAGES' + data_files.append((target, [mo_file_unix])) + +def build_man(build_cmd): + ''' + Compresses Gajim manual files + ''' + data_files = build_cmd.distribution.data_files + for man in ['gajim.1', 'gajim-history-manager.1', 'gajim-remote.1']: + filename = os.path.join('data', man) + newdir = os.path.join(build_cmd.build_base, 'man') + if not(os.path.isdir(newdir) or os.path.islink(newdir)): + os.makedirs(newdir) + + import gzip + man_file_gz = os.path.join(newdir, man + '.gz') + if os.path.exists(man_file_gz): + if newer(filename, man_file_gz): + os.remove(man_file_gz) + else: + filename = False + + if filename: + #Binary io, so open is OK + with open(filename, 'rb') as f_in,\ + gzip.open(man_file_gz, 'wb') as f_out: + f_out.writelines(f_in) + log.info('Compiling %s >> %s', filename, man_file_gz) + + src = build_cmd.build_base + '/man' + '/' + man + '.gz' + target = 'share/man/man1' + data_files.append((target, [src])) + +def build_intl(build_cmd): + ''' + Merge translation files into desktop and mime files + ''' + data_files = build_cmd.distribution.data_files + base = build_cmd.build_base + + merge_files = (('data/org.gajim.Gajim.desktop', 'share/applications', '-d'), + ('data/gajim-remote.desktop', 'share/applications', '-d'), + ('data/org.gajim.Gajim.appdata.xml', 'share/metainfo', '-x')) + + for filename, target, option in merge_files: + filenamelocal = convert_path(filename) + newfile = os.path.join(base, filenamelocal) + newdir = os.path.dirname(newfile) + if not(os.path.isdir(newdir) or os.path.islink(newdir)): + os.makedirs(newdir) + merge(filenamelocal + '.in', newfile, option) + data_files.append((target, [base + '/' + filename])) + +def substitute_variables(filename_in, filename_out, subst_vars): + ''' + Substitute variables in a file. + ''' + f_in = codecs.open(filename_in, encoding='utf-8') + f_out = codecs.open(filename_out, encoding='utf-8', mode='w') + for line in f_in: + for variable, substitution in subst_vars: + line = line.replace(variable, substitution) + f_out.write(line) + f_in.close() + f_out.close() + + +def merge(in_file, out_file, option, po_dir='po', cache=True): + ''' + Run the intltool-merge command. + ''' + option += ' -u' + if cache: + cache_file = os.path.join('po', '.intltool-merge-cache') + option += ' -c ' + cache_file + + if (not os.path.exists(out_file) and os.path.exists(in_file)): + if sys.platform == 'win32': + cmd = (('set LC_ALL=C && perl -S intltool-merge %(opt)s %(po_dir)s %(in_file)s ' + '%(out_file)s') % + {'opt' : option, + 'po_dir' : po_dir, + 'in_file' : in_file, + 'out_file' : out_file}) + else: + cmd = (('LC_ALL=C intltool-merge %(opt)s %(po_dir)s %(in_file)s ' + '%(out_file)s') % + {'opt' : option, + 'po_dir' : po_dir, + 'in_file' : in_file, + 'out_file' : out_file}) + if os.system(cmd) != 0: + msg = ('ERROR: %s was not merged into the translation files!\n' % + out_file) + raise SystemExit(msg) + log.info('Compiling %s >> %s', in_file, out_file) + + +class build(_build): + def run(self): + build_trans(self) + if not sys.platform == 'win32': + build_man(self) + build_intl(self) + _build.run(self) + + +package_data_emoticons = ['data/emoticons/*/emoticons_theme.py', + 'data/emoticons/*/*.png', + 'data/emoticons/*/LICENSE'] +package_data_gui = ['data/gui/*.ui'] +package_data_icons = ['data/icons/hicolor/*/*/*.png'] +package_data_iconsets = ['data/iconsets/*/*/*.png'] +package_data_style = ['data/style/gajim.css'] +package_data = (package_data_emoticons + + package_data_gui + + package_data_icons + + package_data_iconsets + + package_data_style) + + +# only install subdirectories of data +data_files_app_icon = [ + ("share/icons/hicolor/64x64/apps", ["icons/hicolor/64x64/apps/org.gajim.Gajim.png"]), + ("share/icons/hicolor/128x128/apps", ["icons/hicolor/128x128/apps/org.gajim.Gajim.png"]), + ("share/icons/hicolor/scalable/apps", ["icons/hicolor/scalable/apps/org.gajim.Gajim.svg"]) + ] + +data_files = data_files_app_icon + + +setup( + name = "gajim", + description = 'TODO', + version=gajim.__version__, + url = 'https://gajim.org', + cmdclass = { + 'build': build, # if setuptools use "'build_py': build" + }, + # TODO fix tests + # TODO configure_file defs.py.in + # TODO #install plugins + scripts = [ + 'scripts/gajim', + 'scripts/gajim-history-manager', + 'scripts/gajim-remote' ], + packages = find_packages(), + package_data = {'gajim': package_data}, + data_files = data_files, +)