diff --git a/Makefile.am b/Makefile.am index 84fe9fcf0..7c01bce81 100644 --- a/Makefile.am +++ b/Makefile.am @@ -152,6 +152,8 @@ EXTRA_DIST = \ Jamroot.jam \ CMakeLists.txt \ LICENSE \ + bindings/python/compile_flags \ + bindings/python/link_flags \ libtorrent-rasterbar.pc \ libtorrent-rasterbar-cmake.pc \ $(DOCS_PAGES) \ diff --git a/bindings/python/compile_flags.in b/bindings/python/compile_flags.in new file mode 100644 index 000000000..14fce1abb --- /dev/null +++ b/bindings/python/compile_flags.in @@ -0,0 +1 @@ +@COMPILETIME_OPTIONS@ @CPPFLAGS@ @LIBS@ @BOOST_SYSTEM_LIB@ @BOOST_PYTHON_LIB@ @PTHREAD_LIBS@ @OPENSSL_LIBS@ @OPENSSL_LDFLAGS@ @OPENSSL_INCLUDES@ diff --git a/bindings/python/link_flags.in b/bindings/python/link_flags.in new file mode 100644 index 000000000..3c1da5b14 --- /dev/null +++ b/bindings/python/link_flags.in @@ -0,0 +1 @@ +@LDFLAGS@ diff --git a/bindings/python/setup.py b/bindings/python/setup.py index 8f92c566f..fd4613038 100644 --- a/bindings/python/setup.py +++ b/bindings/python/setup.py @@ -7,48 +7,108 @@ import platform import sys import shutil import multiprocessing +import subprocess -if not '--help' in sys.argv \ - and not '--help-commands' in sys.argv: +def parse_cmd(cmdline, prefix, keep_prefix = False): + ret = [] + for token in cmdline.split(): + if token[:len(prefix)] == prefix: + if keep_prefix: + ret.append(token) + else: + ret.append(token[len(prefix):]) + return ret - toolset = '' - file_ext = '.so' +def arch(): + if platform.system() != 'Darwin': return [] + a = os.uname()[4] + if a == 'Power Macintosh': a = 'ppc' + return ['-arch', a] - if platform.system() == 'Windows': - # msvc 9.0 (2008) is the official windows compiler for python 2.6 - # http://docs.python.org/whatsnew/2.6.html#build-and-c-api-changes - toolset = ' msvc-9.0' - file_ext = '.pyd' +def target_specific(): - parallell_builds = ' -j%d' % multiprocessing.cpu_count() + if platform.system() != 'Darwin': return [] - # build libtorrent using bjam and build the installer with distutils + # 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'] - cmdline = 'bjam boost=source link=static geoip=static boost-link=static release optimization=space stage_module --abbreviate-paths' + toolset + parallell_builds - print cmdline - if os.system(cmdline) != 0: - print('build failed') - sys.exit(1) +try: + extra_cmd = open('compile_flags').read() +except: + extra_cmd = None - 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) +try: + ldflags = open('link_flags').read() +except: + ldflags = None -setup( name='python-libtorrent', - version='1.0.0', +ext = None +packages = None + +if '--bjam' in sys.argv or ldflags == None or extra_cmd == None: + + del sys.argv[sys.argv.index('--bjam')] + + if not '--help' in sys.argv \ + and not '--help-commands' in sys.argv: + + toolset = '' + file_ext = '.so' + + if platform.system() == 'Windows': + # msvc 9.0 (2008) is the official windows compiler for python 2.6 + # http://docs.python.org/whatsnew/2.6.html#build-and-c-api-changes + toolset = ' msvc-9.0' + file_ext = '.pyd' + + parallell_builds = ' -j%d' % multiprocessing.cpu_count() + + # build libtorrent using bjam and build the installer with distutils + cmdline = 'bjam boost=source link=static geoip=static boost-link=static release optimization=space stage_module --abbreviate-paths' + toolset + parallell_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: + + source_list = os.listdir(os.path.join(os.path.dirname(__file__), "src")) + source_list = [os.path.join("src", s) for s in source_list if s.endswith(".cpp")] + + ext = [Extension('libtorrent', + sources = source_list, + language='c++', + include_dirs = ['../../include'] + parse_cmd(extra_cmd, '-I'), + library_dirs = ['../../src/.libs'] + parse_cmd(extra_cmd, '-L'), + extra_link_args = ldflags.split() + arch(), + extra_compile_args = parse_cmd(extra_cmd, '-D', True) + arch() \ + + target_specific(), + libraries = ['torrent-rasterbar'] + parse_cmd(extra_cmd, '-l'))] + +setup(name = 'python-libtorrent', + version = '1.0.0', author = 'Arvid Norberg', - author_email='arvid@rasterbar.com', + author_email = 'arvid@rasterbar.com', 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 = ['libtorrent'], + packages = packages, + ext_modules = ext ) diff --git a/configure.ac b/configure.ac index 771aaeb84..ec6a93c58 100644 --- a/configure.ac +++ b/configure.ac @@ -687,6 +687,8 @@ AC_CONFIG_FILES( [tools/Makefile] [bindings/Makefile] [bindings/python/Makefile] + [bindings/python/link_flags] + [bindings/python/compile_flags] [libtorrent-rasterbar.pc] [libtorrent-rasterbar-cmake.pc] )