poezio/setup.py

201 lines
6.7 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import subprocess
import sys
from tempfile import TemporaryFile
try:
from setuptools import setup, Extension
except ImportError:
print('\nSetuptools was not found. Install setuptools for python 3.\n')
sys.exit(1)
try:
from setuptools_rust import Binding, RustExtension
except ImportError:
print('\nsetuptools-rust was not found. Install setuptools-rust for python 3.\n')
sys.exit(1)
cmdclass = {}
try:
from sphinx.setup_command import BuildDoc
cmdclass = {'build_man': BuildDoc}
except ImportError:
print('\nSphinx not found, the build_man command will be unavailable.\n')
current_dir = os.path.dirname(__file__)
from poezio.version import __version__
def get_relative_dir(folder, stopper):
"""
Find the path from a directory to a pseudo-root in order to recreate
the filetree.
"""
acc = []
last = os.path.basename(folder)
while last != stopper:
acc.append(last)
folder = os.path.dirname(folder)
last = os.path.basename(folder)
return os.path.join(*acc[::-1]) if acc else ''
def find_doc(before, path):
_files = []
stop = os.path.basename(path)
for root, dirs, files in os.walk(os.path.join(current_dir, 'doc', path)):
files_path = []
relative_root = get_relative_dir(root, stop)
for name in files:
files_path.append(os.path.join(root, name))
_files.append((os.path.join(before, relative_root), files_path))
return _files
def check_include(library_name, header):
command = [os.environ.get('PKG_CONFIG', 'pkg-config'), '--cflags', library_name]
try:
cflags = subprocess.check_output(command).decode('utf-8').split()
except FileNotFoundError:
print('pkg-config not found.')
return False
except subprocess.CalledProcessError:
# pkg-config already prints the missing libraries on stderr.
return False
command = [os.environ.get('CC', 'cc')] + cflags + ['-E', '-']
with TemporaryFile('w+') as c_file:
c_file.write('#include <%s>' % header)
c_file.seek(0)
try:
return subprocess.call(command, stdin=c_file, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0
except FileNotFoundError:
print('%s headers not found.' % library_name)
return False
def sphinx_man():
expected_sphinx_files = [
'build/sphinx/man/poezio.cfg.7',
'build/sphinx/man/poezio.keys.7',
'build/sphinx/man/poezio.commands.7'
]
found = []
for item in expected_sphinx_files:
if os.path.exists(item):
found.append(item)
if found:
return [('share/man/man7/', found)]
return []
sphinx_files_found = sphinx_man()
if not sphinx_files_found:
print(
'\nSphinx-built manpages not found. Only the '
'short handwritten manpages will be installed\n'
)
if not check_include('python3', 'Python.h'):
sys.exit(2)
module_poopt = Extension('poezio.poopt',
extra_compile_args=['-Wno-declaration-after-statement'],
sources=['poezio/pooptmodule.c'])
# Create a link to the config file (for packaging purposes)
if not os.path.exists(os.path.join(current_dir, 'poezio', 'default_config.cfg')):
os.link(os.path.join(current_dir, 'data', 'default_config.cfg'),
os.path.join(current_dir, 'poezio', 'default_config.cfg'))
# identify the git version
git_dir = os.path.join(current_dir, '.git')
if os.path.exists(git_dir):
try:
result = subprocess.Popen(['git', '--git-dir', git_dir, 'describe'],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL)
result.wait()
data = result.stdout.read().decode('utf-8', errors='ignore')
version = '.dev' + data.split('-')[1]
except:
version = '.dev1'
else:
version = ''
with open('README.rst', encoding='utf-8') as readme_fd:
LONG_DESCRIPTION = readme_fd.read()
setup(
name="poezio",
version=__version__ + version,
description="A console XMPP client",
long_description=LONG_DESCRIPTION,
ext_modules=[module_poopt],
rust_extensions=[RustExtension('poezio.libpoezio', binding=Binding.PyO3)],
url='https://poez.io/',
license='GPL-3.0-or-later',
download_url='https://dev.louiz.org/projects/poezio/files',
author='Florent Le Coz',
author_email='louiz@louiz.org',
maintainer='Mathieu Pasquet',
maintainer_email='mathieui@mathieui.net',
classifiers=['Development Status :: 5 - Production/Stable',
'Topic :: Communications :: Chat',
'Topic :: Internet :: XMPP',
'Environment :: Console :: Curses',
'Intended Audience :: End Users/Desktop',
'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
'Natural Language :: English',
'Operating System :: Unix',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3 :: Only'],
keywords=['jabber', 'xmpp', 'client', 'chat', 'im', 'console'],
packages=['poezio', 'poezio.core', 'poezio.tabs', 'poezio.windows',
'poezio.ui', 'poezio_plugins', 'poezio_themes'],
package_dir={'poezio': 'poezio',
'poezio_plugins': 'plugins',
'poezio_themes': 'data/themes'},
package_data={'poezio': ['default_config.cfg', 'py.typed']},
scripts=['scripts/poezio_logs'],
entry_points={'console_scripts': ['poezio = poezio.__main__:run']},
data_files=([
('share/man/man1/', ['data/poezio.1', 'data/poezio_logs.1']),
('share/poezio/', ['README.rst', 'COPYING', 'CHANGELOG']),
('share/applications/', ['data/io.poez.Poezio.desktop']),
('share/metainfo/', ['data/io.poez.Poezio.appdata.xml'])
]
+ find_doc('share/doc/poezio/source', 'source')
+ find_doc('share/doc/poezio/html', 'build/html')
+ sphinx_files_found
),
install_requires=[
'slixmpp>=1.8.2',
'aiodns',
'pyasn1_modules',
'pyasn1',
'typing_extensions',
'setuptools',
'setuptools-rust',
],
extras_require={'OTR plugin': 'python-potr>=1.0',
'Screen autoaway plugin': 'pyinotify==0.9.4',
'Avoiding cython': 'cffi'},
cmdclass=cmdclass,
command_options={
'build_man' : {
'builder': ('setup.py', 'man'),
}
},
)
# Remove the link afterwards
if (os.path.exists(os.path.join(current_dir, 'poezio', 'default_config.cfg')) and
os.path.exists(os.path.join(current_dir, 'data', 'default_config.cfg'))):
os.unlink(os.path.join(current_dir, 'poezio', 'default_config.cfg'))