You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
5.2 KiB
134 lines
5.2 KiB
#!/usr/bin/env python |
|
|
|
from setuptools import setup, Extension, Command, Distribution |
|
from distutils.util import convert_path |
|
import glob |
|
import os |
|
|
|
main_ns = {} |
|
ver_path = convert_path('libzt/version.py') |
|
with open(ver_path) as ver_file: |
|
exec(ver_file.read(), main_ns) |
|
|
|
from os import path |
|
this_directory = path.abspath(path.dirname(__file__)) |
|
with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: |
|
long_description = f.read() |
|
|
|
class BinaryDistribution(Distribution): |
|
def is_pure(self): |
|
return False |
|
|
|
# monkey-patch for parallel compilation |
|
# Copied from: https://stackoverflow.com/a/13176803 |
|
def parallelCCompile(self, sources, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None): |
|
# those lines are copied from distutils.ccompiler.CCompiler directly |
|
macros, objects, extra_postargs, pp_opts, build = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs) |
|
cc_args = self._get_cc_args(pp_opts, debug, extra_preargs) |
|
# parallel code |
|
N=16 # number of parallel compilations |
|
import multiprocessing.pool |
|
def _single_compile(obj): |
|
try: src, ext = build[obj] |
|
except KeyError: return |
|
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts) |
|
# convert to list, imap is evaluated on-demand |
|
list(multiprocessing.pool.ThreadPool(N).imap(_single_compile,objects)) |
|
return objects |
|
import distutils.ccompiler |
|
distutils.ccompiler.CCompiler.compile=parallelCCompile |
|
|
|
# Build |
|
|
|
cpp_glob = [] |
|
c_glob = [] |
|
|
|
# Windows |
|
if os.name == 'nt': |
|
print('TODO') |
|
#extra_compile_args=['/std:c++14', '-DNOMINMAX=1', '-DZT_SDK', '-DSDK'], |
|
#extra_link_args=['/LIBPATH:.', 'WS2_32.Lib', 'ShLwApi.Lib', 'iphlpapi.Lib','lwip.lib'], |
|
|
|
# Everything else |
|
else: |
|
cpp_glob.extend(list(glob.glob('native/src/bindings/python/*.cxx'))) |
|
cpp_glob.extend(list(glob.glob('native/src/*.cpp'))) |
|
cpp_glob.extend(list(glob.glob('native/ext/ZeroTierOne/node/*.cpp'))) |
|
cpp_glob.extend(list(glob.glob('native/ext/ZeroTierOne/osdep/OSUtils.cpp'))) |
|
cpp_glob.extend(list(glob.glob('native/ext/ZeroTierOne/osdep/PortMapper.cpp'))) |
|
cpp_glob.extend(list(glob.glob('native/ext/ZeroTierOne/osdep/ManagedRoute.cpp'))) |
|
|
|
my_include_dirs=['native/include', |
|
'native/src', |
|
'native/src/bindings/python', |
|
'native/ext/concurrentqueue', |
|
'native/ext/lwip/src/include', |
|
'native/ext/lwip-contrib/ports/unix/port/include', |
|
'native/ext/ZeroTierOne/include', |
|
'native/ext/ZeroTierOne', |
|
'native/ext/ZeroTierOne/node', |
|
'native/ext/ZeroTierOne/service', |
|
'native/ext/ZeroTierOne/osdep', |
|
'native/ext/ZeroTierOne/controller'] |
|
|
|
libzt_module = Extension('libzt._libzt', |
|
extra_compile_args=['-std=c++11', '-DZTS_ENABLE_PYTHON=1', '-DZT_SDK', '-Wno-parentheses-equality', '-Wno-macro-redefined', '-Wno-tautological-overlap-compare', '-Wno-tautological-constant-out-of-range-compare'], |
|
sources=cpp_glob, include_dirs=my_include_dirs) |
|
|
|
# Separate C library, this is needed since C++ compiler flags are applied |
|
# to everything in the extension module regardless of type. |
|
|
|
# libnatpmp |
|
c_glob.extend(list(glob.glob('native/ext/ZeroTierOne/ext/libnatpmp/natpmp.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/ZeroTierOne/ext/libnatpmp/wingettimeofday.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/ZeroTierOne/ext/libnatpmp/getgateway.c'))) |
|
# miniupnpc |
|
c_glob.extend(list(glob.glob('native/ext/miniupnpc/*.c'))) |
|
# lwip |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/netif/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/api/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/core/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/core/ipv4/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/core/ipv6/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip/src/netif/*.c'))) |
|
c_glob.extend(list(glob.glob('native/ext/lwip-contrib/ports/unix/port/sys_arch.c'))) |
|
|
|
cstuff = ('cstuff', {'sources': |
|
c_glob, 'include_dirs': my_include_dirs}) |
|
|
|
setup( |
|
name = 'libzt', |
|
version = main_ns['__version__'], |
|
description = 'ZeroTier', |
|
long_description=long_description, |
|
long_description_content_type='text/markdown', |
|
author = 'ZeroTier, Inc.', |
|
author_email = 'joseph@zerotier.com', |
|
url = 'https://github.com/zerotier/libzt', |
|
license='BUSL 1.1', |
|
download_url = 'https://github.com/zerotier/libzt/releases', |
|
keywords = 'zerotier p2p peer-to-peer sdwan sdn virtual network socket tcp udp zt encryption encrypted', |
|
py_modules = ['libzt'], |
|
packages = ['libzt'], |
|
classifiers = ['Development Status :: 4 - Beta', |
|
'Topic :: Internet', |
|
'Topic :: System :: Networking', |
|
'Topic :: Security :: Cryptography', |
|
'Intended Audience :: Developers', |
|
'Intended Audience :: Information Technology', |
|
'Intended Audience :: System Administrators', |
|
'Intended Audience :: Telecommunications Industry', |
|
'Intended Audience :: End Users/Desktop', |
|
'License :: Free for non-commercial use', |
|
'Operating System :: MacOS', |
|
'Operating System :: POSIX :: BSD', |
|
'Operating System :: POSIX :: Linux', |
|
'Operating System :: Unix', |
|
'Programming Language :: C', |
|
'Programming Language :: C++', |
|
'Programming Language :: Python' |
|
], |
|
distclass=BinaryDistribution, |
|
libraries=[cstuff], |
|
ext_modules = [libzt_module], |
|
)
|
|
|