premiere-libtorrent/bindings/python/setup.py

143 lines
3.8 KiB
Python

#!/usr/bin/env python
from distutils.core import setup, Extension
from distutils.sysconfig import get_config_vars
import os
import platform
import sys
import shutil
import multiprocessing
import subprocess
class flags_parser:
def __init__(self):
self.include_dirs = []
self.library_dirs = []
self.libraries = []
def parse(self, args):
"""Parse out the -I -L -l directives and return a list of all other arguments"""
ret = []
for token in args.split():
prefix = token[:2]
if prefix == '-I':
self.include_dirs.append(token[2:])
elif prefix == '-L':
self.library_dirs.append(token[2:])
elif prefix == '-l':
self.libraries.append(token[2:])
else:
ret.append(token)
return ret
def arch():
if platform.system() != 'Darwin': return []
a = os.uname()[4]
if a == 'Power Macintosh': a = 'ppc'
return ['-arch', a]
def target_specific():
if platform.system() != 'Darwin': return []
# on mavericks, clang will fail when unknown arguments are
# passed in. python distutils will pass in arguments it doesn't
# know about
return ['-Wno-error=unused-command-line-argument-hard-error-in-future']
try:
with open('compile_flags') as _file:
extra_cmd = _file.read()
except:
extra_cmd = None
try:
with open('link_flags') as _file:
ldflags = _file.read()
except:
ldflags = None
ext = None
packages = None
if '--bjam' in sys.argv:
if '--bjam' in sys.argv:
del sys.argv[sys.argv.index('--bjam')]
if not '--help' in sys.argv \
and not '--help-commands' in sys.argv:
file_ext = '.so'
if platform.system() == 'Windows':
file_ext = '.pyd'
parallel_builds = ' -j%d' % multiprocessing.cpu_count()
# build libtorrent using bjam and build the installer with distutils
cmdline = 'b2 libtorrent-link=static boost-link=static release optimization=space stage_module --abbreviate-paths' + parallel_builds
print(cmdline)
if os.system(cmdline) != 0:
print('build failed')
sys.exit(1)
try: os.mkdir('build')
except: pass
try: shutil.rmtree('build/lib')
except: pass
try: os.mkdir('build/lib')
except: pass
try: os.mkdir('libtorrent')
except: pass
shutil.copyfile('libtorrent' + file_ext, 'build/lib/libtorrent' + file_ext)
packages = ['libtorrent']
else:
# Remove the '-Wstrict-prototypes' compiler option, which isn't valid for C++.
cfg_vars = get_config_vars()
for key, value in cfg_vars.items():
if isinstance(value, str):
cfg_vars[key] = value.replace('-Wstrict-prototypes', '')
source_list = os.listdir(os.path.join(os.path.dirname(__file__), "src"))
source_list = [os.path.abspath(os.path.join(os.path.dirname(__file__), "src", s)) for s in source_list if s.endswith(".cpp")]
if extra_cmd:
flags = flags_parser()
# ldflags must be parsed first to ensure the correct library search path order
extra_link = flags.parse(ldflags)
extra_compile = flags.parse(extra_cmd)
# for some reason distutils uses the CC environment variable to determine
# the compiler to use for C++
if 'CXX' in os.environ:
os.environ['CC'] = os.environ['CXX']
if 'CXXFLAGS' in os.environ:
os.environ['CFLAGS'] = os.environ['CXXFLAGS']
ext = [Extension('libtorrent',
sources = source_list,
language='c++',
include_dirs = flags.include_dirs,
library_dirs = flags.library_dirs,
extra_link_args = extra_link + arch(),
extra_compile_args = extra_compile + arch() + target_specific(),
libraries = ['torrent-rasterbar'] + flags.libraries)]
setup(name = 'python-libtorrent',
version = '1.2.0',
author = 'Arvid Norberg',
author_email = 'arvid@libtorrent.org',
description = 'Python bindings for libtorrent-rasterbar',
long_description = 'Python bindings for libtorrent-rasterbar',
url = 'http://libtorrent.org',
platforms = [platform.system() + '-' + platform.machine()],
license = 'BSD',
packages = packages,
ext_modules = ext
)