2019-02-13 23:06:58 +08:00
|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
#-*- coding:utf-8 -*-
|
|
|
|
|
|
|
|
|
|
from setuptools import setup, find_packages
|
|
|
|
|
import sys
|
|
|
|
|
import os
|
|
|
|
|
import shutil
|
|
|
|
|
import platform
|
2019-07-27 16:17:28 +08:00
|
|
|
|
import click
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
# 前置检查
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
def check_xmake():
|
|
|
|
|
"""检查是否按照了编译工具 xmake"""
|
|
|
|
|
print("checking xmake ...")
|
|
|
|
|
xmake = os.system("xmake --version")
|
|
|
|
|
return False if xmake != 0 else True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_boost_envrionment():
|
|
|
|
|
"""
|
|
|
|
|
获取 BOOST 环境变量设置
|
|
|
|
|
@return (current_boost_root, current_boost_lib)
|
|
|
|
|
"""
|
|
|
|
|
current_dir = os.getcwd()
|
|
|
|
|
current_boost_root = None
|
|
|
|
|
current_boost_lib = None
|
2019-09-22 23:02:08 +08:00
|
|
|
|
if 'BOOST_ROOT' in os.environ:
|
|
|
|
|
current_boost_root = os.environ['BOOST_ROOT']
|
|
|
|
|
if 'BOOST_LIB' in os.environ:
|
|
|
|
|
current_boost_lib = os.environ['BOOST_LIB']
|
|
|
|
|
else:
|
|
|
|
|
current_boost_lib = current_boost_root + '/stage/lib'
|
|
|
|
|
os.environ['BOOST_LIB'] = current_boost_lib
|
|
|
|
|
else:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
for dir in os.listdir():
|
|
|
|
|
if len(dir) >= 5 and dir[:5] == 'boost' and os.path.isdir(dir):
|
|
|
|
|
current_boost_root = current_dir + '/' + dir
|
|
|
|
|
current_boost_lib = current_dir + '/' + dir + '/stage/lib'
|
|
|
|
|
os.environ['BOOST_ROOT'] = current_boost_root
|
|
|
|
|
os.environ['BOOST_LIB'] = current_boost_lib
|
|
|
|
|
return (current_boost_root, current_boost_lib)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_python_version():
|
|
|
|
|
"""
|
|
|
|
|
获取 python版本,并判断当前 python 版本是否发生了变化
|
|
|
|
|
@return (py_version, py_version_changed)
|
|
|
|
|
"""
|
|
|
|
|
py_version = platform.python_version_tuple()
|
|
|
|
|
py_version = int(py_version[0])*10 + int(py_version[1])
|
|
|
|
|
py_version_changed = True
|
|
|
|
|
if os.path.exists('py_version'):
|
|
|
|
|
with open('py_version', 'r+') as f:
|
|
|
|
|
old_py_version = f.read()
|
|
|
|
|
if old_py_version == str(py_version):
|
|
|
|
|
py_version_changed = False
|
|
|
|
|
else:
|
|
|
|
|
f.seek(0)
|
|
|
|
|
f.write(str(py_version))
|
|
|
|
|
print('old python version:', int(old_py_version)*0.1)
|
|
|
|
|
else:
|
|
|
|
|
with open('py_version', 'w') as f:
|
2019-02-18 22:49:21 +08:00
|
|
|
|
f.write(str(py_version))
|
2019-07-27 16:17:28 +08:00
|
|
|
|
print('current python version:', int(py_version)*0.1, '\n')
|
|
|
|
|
return (py_version, py_version_changed)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def build_boost():
|
|
|
|
|
""" 编译依赖的 boost 库 """
|
|
|
|
|
current_boost_root, current_boost_lib = get_boost_envrionment()
|
|
|
|
|
if current_boost_root is None or current_boost_lib is None:
|
|
|
|
|
print("Can't get boost environment!")
|
|
|
|
|
return
|
2019-08-03 23:07:32 +08:00
|
|
|
|
current_dir = os.getcwd()
|
2019-07-27 16:17:28 +08:00
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
|
os.chdir(current_boost_root)
|
|
|
|
|
if not os.path.exists('b2.exe'):
|
|
|
|
|
os.system('bootstrap.bat')
|
2019-10-19 22:25:06 +08:00
|
|
|
|
os.system('b2 release link=static runtime-link=shared address-model=64 -j 4 --with-date_time'
|
|
|
|
|
' --with-filesystem --with-system --with-serialization --with-test')
|
|
|
|
|
os.system('b2 release link=shared runtime-link=shared address-model=64 -j 4 --with-python')
|
2019-07-27 16:17:28 +08:00
|
|
|
|
os.chdir(current_dir)
|
|
|
|
|
else:
|
2019-10-19 22:25:06 +08:00
|
|
|
|
cmd = 'cd {boost} ; if [ ! -f "b2" ]; then ./bootstrap.sh ; fi; '\
|
|
|
|
|
'./b2 release link=shared address-model=64 -j 4 --with-python; '\
|
|
|
|
|
'./b2 release link=static address-model=64 -j 4 --with-date_time '\
|
|
|
|
|
'--with-filesystem --with-system --with-serialization --with-test; '\
|
|
|
|
|
'cd {current}'.format(boost=current_boost_root, current=current_dir)
|
2019-07-27 16:17:28 +08:00
|
|
|
|
os.system(cmd)
|
2019-02-18 22:49:21 +08:00
|
|
|
|
|
|
|
|
|
|
2019-07-27 16:17:28 +08:00
|
|
|
|
def clear_with_python_changed():
|
|
|
|
|
"""
|
|
|
|
|
python版本发生变化时,清理之前的python编译结果
|
|
|
|
|
应该仅在 pyhon 版本发生变化时被调用
|
|
|
|
|
"""
|
|
|
|
|
current_plat = sys.platform
|
|
|
|
|
current_bits = 64 if sys.maxsize > 2**32 else 32
|
|
|
|
|
if current_plat == 'win32' and current_bits == 64:
|
|
|
|
|
build_pywrap_dir = 'build\\release\\windows\\x64\\.objs\\windows\\x64\\release\\hikyuu_pywrap'
|
|
|
|
|
elif current_plat == 'win32' and current_bits == 32:
|
|
|
|
|
build_pywrap_dir = 'build\\release\\windows\\x86\\.objs\\windows\\x64\\release\\hikyuu_pywrap'
|
|
|
|
|
elif current_plat == 'linux' and current_bits == 64:
|
|
|
|
|
build_pywrap_dir = 'build/release/linux/x86_64/.objs/linux/x86_64/release/hikyuu_pywrap'
|
|
|
|
|
elif current_plat == "darwin" and current_bits == 64:
|
|
|
|
|
build_pywrap_dir = 'build/release/macosx/x86_64/.objs/macosx/x86_64/release/hikyuu_pywrap'
|
2019-02-18 22:49:21 +08:00
|
|
|
|
else:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
print("************不支持的平台**************")
|
|
|
|
|
exit(0)
|
|
|
|
|
if os.path.lexists(build_pywrap_dir):
|
|
|
|
|
shutil.rmtree(build_pywrap_dir)
|
|
|
|
|
current_boost_root, _ = get_boost_envrionment()
|
|
|
|
|
if os.path.lexists('{}/bin.v2/libs/python'.format(current_boost_root)):
|
|
|
|
|
shutil.rmtree('{}/bin.v2/libs/python'.format(current_boost_root))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
# 执行构建
|
|
|
|
|
#------------------------------------------------------------------------------
|
2019-09-22 23:02:08 +08:00
|
|
|
|
def start_build(verbose=False):
|
2019-07-27 16:17:28 +08:00
|
|
|
|
""" 执行编译 """
|
|
|
|
|
global g_verbose
|
|
|
|
|
g_verbose = verbose
|
|
|
|
|
if not check_xmake():
|
|
|
|
|
print("Please install xmake")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
print("\nchecking python version ...")
|
|
|
|
|
py_version, py_version_changed = get_python_version()
|
|
|
|
|
if py_version < 31:
|
|
|
|
|
print("Python version must >= 3.1 !")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
print("checking boost ...")
|
|
|
|
|
current_boost_root, current_boost_lib = get_boost_envrionment()
|
|
|
|
|
if current_boost_root is None or current_boost_lib is None:
|
|
|
|
|
print("Please configure BOOST")
|
|
|
|
|
exit(0)
|
|
|
|
|
print('BOOST_ROOT:', current_boost_root)
|
|
|
|
|
print('BOOST_LIB:', current_boost_lib)
|
|
|
|
|
|
|
|
|
|
#如果 python 发生变化,则编译依赖的 boost 库(boost.python)
|
|
|
|
|
if py_version_changed:
|
|
|
|
|
clear_with_python_changed()
|
|
|
|
|
print('\ncompile boost ...')
|
|
|
|
|
build_boost()
|
|
|
|
|
|
|
|
|
|
if py_version_changed:
|
2019-09-09 02:11:26 +08:00
|
|
|
|
os.system("xmake f -c -y")
|
2019-07-27 16:17:28 +08:00
|
|
|
|
else:
|
2019-09-09 02:11:26 +08:00
|
|
|
|
os.system("xmake f -y")
|
2019-09-22 23:02:08 +08:00
|
|
|
|
os.system("xmake -b {} hikyuu".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _hikyuu".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _indicator".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _trade_manage".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _trade_sys".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _trade_instance".format("-v -D" if verbose else ""))
|
|
|
|
|
os.system("xmake -b {} _data_driver".format("-v -D" if verbose else ""))
|
2019-07-27 16:17:28 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
# 控制台命令
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
@click.group()
|
|
|
|
|
def cli():
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
|
|
|
|
@click.option('-v', '--verbose', is_flag=True, help='显示详细的编译信息')
|
|
|
|
|
def build(verbose):
|
|
|
|
|
""" 执行编译 """
|
|
|
|
|
start_build(verbose)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
2019-09-20 02:58:03 +08:00
|
|
|
|
@click.option('-all', "--all", is_flag=True, help="执行全部测试, 否则仅仅进行最小范围测试)")
|
|
|
|
|
@click.option("-compile", "--compile", is_flag=True, help='强制重新编译')
|
2019-09-09 02:11:26 +08:00
|
|
|
|
@click.option('-v', '--verbose', is_flag=True, help='显示详细的编译信息')
|
2019-09-20 02:58:03 +08:00
|
|
|
|
def test(all, compile, verbose):
|
2019-07-27 16:17:28 +08:00
|
|
|
|
""" 执行单元测试 """
|
2019-09-25 02:21:25 +08:00
|
|
|
|
# 先取 BOOST 路径,避免为设置 BOOST_LIB 的情况
|
|
|
|
|
current_boost_root, current_boost_lib = get_boost_envrionment()
|
2019-08-01 23:07:10 +08:00
|
|
|
|
if compile:
|
2019-09-09 02:11:26 +08:00
|
|
|
|
start_build(verbose)
|
2019-09-20 02:58:03 +08:00
|
|
|
|
if all:
|
2019-09-09 02:11:26 +08:00
|
|
|
|
os.system("xmake f --test=all")
|
|
|
|
|
os.system("xmake -b unit-test")
|
|
|
|
|
os.system("xmake r unit-test")
|
|
|
|
|
else:
|
|
|
|
|
os.system("xmake f --test=small")
|
|
|
|
|
os.system("xmake -b small-test")
|
|
|
|
|
os.system("xmake r small-test")
|
2019-07-27 16:17:28 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
|
|
|
|
def clear():
|
|
|
|
|
""" 清除当前编译设置及结果 """
|
2019-02-16 18:38:23 +08:00
|
|
|
|
if os.path.lexists('.xmake'):
|
2019-02-17 18:59:58 +08:00
|
|
|
|
print('delete .xmake')
|
2019-02-16 18:38:23 +08:00
|
|
|
|
shutil.rmtree('.xmake')
|
|
|
|
|
if os.path.lexists('build'):
|
2019-02-17 18:59:58 +08:00
|
|
|
|
print('delete build')
|
2019-02-16 18:38:23 +08:00
|
|
|
|
shutil.rmtree('build')
|
2019-02-17 18:59:58 +08:00
|
|
|
|
if os.path.lexists('Hikyuu.egg-info'):
|
|
|
|
|
print('delete Hikyuu.egg-info')
|
|
|
|
|
shutil.rmtree('Hikyuu.egg-info')
|
2019-02-17 01:06:01 +08:00
|
|
|
|
if os.path.exists('py_version'):
|
2019-02-17 18:59:58 +08:00
|
|
|
|
print('delete py_version')
|
2019-02-17 01:06:01 +08:00
|
|
|
|
os.remove('py_version')
|
2019-07-27 16:17:28 +08:00
|
|
|
|
for r, _, f_list in os.walk('hikyuu'):
|
2019-02-17 18:59:58 +08:00
|
|
|
|
for name in f_list:
|
2019-02-28 19:59:42 +08:00
|
|
|
|
if (name != 'UnRAR.exe' and len(name) > 4 and name[-4:] in ('.dll','.exe','.pyd')) \
|
2019-02-28 21:56:13 +08:00
|
|
|
|
or (len(name) > 8 and name[:9] == 'libboost_') \
|
2019-02-17 18:59:58 +08:00
|
|
|
|
or (len(name) > 6 and name[-6:] == '.dylib'):
|
|
|
|
|
print('delete', r + '/' + name)
|
|
|
|
|
os.remove(os.path.join(r, name))
|
2019-02-16 18:38:23 +08:00
|
|
|
|
print('clear finished!')
|
|
|
|
|
|
2019-02-14 23:13:10 +08:00
|
|
|
|
|
2019-07-27 16:17:28 +08:00
|
|
|
|
@click.command()
|
|
|
|
|
def uninstall():
|
|
|
|
|
""" 卸载已安装的 python 包 """
|
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
|
site_lib_dir = sys.base_prefix + "/lib/site-packages"
|
|
|
|
|
else:
|
|
|
|
|
usr_dir = os.path.expanduser('~')
|
|
|
|
|
py_version, _ = get_python_version()
|
|
|
|
|
site_lib_dir = '{}/.local/lib/python{:>.1f}/site-packages'.format(usr_dir, py_version*0.1)
|
|
|
|
|
for dir in os.listdir(site_lib_dir):
|
|
|
|
|
if dir == 'hikyuu' or (len(dir) > 6 and dir[:6] == 'Hikyuu'):
|
|
|
|
|
print('delete', site_lib_dir + '/' + dir)
|
|
|
|
|
shutil.rmtree(site_lib_dir + '/' + dir)
|
|
|
|
|
print("Uninstall finished!")
|
|
|
|
|
|
2019-02-17 01:06:01 +08:00
|
|
|
|
|
2019-07-27 16:17:28 +08:00
|
|
|
|
@click.command()
|
|
|
|
|
def install():
|
|
|
|
|
""" 编译并安装 Hikyuu python 库 """
|
|
|
|
|
start_build()
|
|
|
|
|
py_version, py_version_changed = get_python_version()
|
2019-02-17 01:06:01 +08:00
|
|
|
|
if py_version_changed:
|
2019-09-09 02:11:26 +08:00
|
|
|
|
os.system("xmake f -c -y")
|
2019-07-27 16:17:28 +08:00
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
|
install_dir = sys.base_prefix + "\\Lib\\site-packages\\Hikyuu"
|
2019-02-18 22:49:21 +08:00
|
|
|
|
else:
|
|
|
|
|
usr_dir = os.path.expanduser('~')
|
2019-07-27 16:17:28 +08:00
|
|
|
|
install_dir = '{}/.local/lib/python{:>.1f}/site-packages/Hikyuu'.format(usr_dir, py_version*0.1)
|
2019-03-07 22:56:12 +08:00
|
|
|
|
try:
|
|
|
|
|
shutil.rmtree(install_dir)
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
os.makedirs(install_dir)
|
2019-04-17 02:38:37 +08:00
|
|
|
|
os.system('xmake install -o "{}"'.format(install_dir))
|
2019-02-14 23:13:10 +08:00
|
|
|
|
|
2019-07-27 16:17:28 +08:00
|
|
|
|
|
|
|
|
|
@click.command()
|
|
|
|
|
def wheel():
|
|
|
|
|
""" 生成 python 的 wheel 安装包 """
|
|
|
|
|
# 尝试编译
|
|
|
|
|
start_build()
|
|
|
|
|
|
|
|
|
|
# 清理之前遗留的打包产物
|
|
|
|
|
print("Clean up the before papackaging outputs ...")
|
|
|
|
|
py_version, _ = get_python_version()
|
|
|
|
|
if os.path.lexists('Hikyuu.egg-info'):
|
|
|
|
|
shutil.rmtree('Hikyuu.egg-info')
|
|
|
|
|
if os.path.lexists('build/lib'):
|
|
|
|
|
shutil.rmtree('build/lib')
|
|
|
|
|
if os.path.lexists('build'):
|
|
|
|
|
for bdist in os.listdir('build'):
|
|
|
|
|
if len(bdist) >= 5 and bdist[:5] == 'bdist' and os.path.lexists(bdist):
|
|
|
|
|
shutil.rmtree(bdist)
|
|
|
|
|
for x in os.listdir('hikyuu'):
|
|
|
|
|
if x[:12] == 'boost_python':
|
|
|
|
|
if x[12:14] != str(py_version):
|
|
|
|
|
os.remove('hikyuu/{}'.format(x))
|
|
|
|
|
|
|
|
|
|
# 构建打包命令
|
|
|
|
|
print("start pacakaging bdist_wheel ...")
|
|
|
|
|
current_plat = sys.platform
|
|
|
|
|
current_bits = 64 if sys.maxsize > 2**32 else 32
|
2019-02-15 23:19:30 +08:00
|
|
|
|
if current_plat == 'win32' and current_bits == 64:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
plat = "win-amd64"
|
2019-02-15 23:19:30 +08:00
|
|
|
|
elif current_plat == 'win32' and current_bits == 32:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
plat = "win32"
|
2019-02-15 23:19:30 +08:00
|
|
|
|
elif current_plat == 'linux' and current_bits == 64:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
plat = "manylinux1_x86_64"
|
2019-02-15 23:19:30 +08:00
|
|
|
|
elif current_plat == 'linux' and current_bits == 32:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
plat = "manylinux1_i386"
|
2019-02-15 23:19:30 +08:00
|
|
|
|
else:
|
2019-07-27 16:17:28 +08:00
|
|
|
|
print("*********尚未实现该平台的支持*******")
|
|
|
|
|
return
|
|
|
|
|
cmd = 'python sub_setup.py bdist_wheel --python-tag cp{} -p {}'.format(py_version, plat)
|
|
|
|
|
os.system(cmd)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
|
|
|
|
def upload():
|
|
|
|
|
""" 发布上传至 pypi,仅供发布者使用!!! """
|
|
|
|
|
if not os.path.lexists('dist'):
|
|
|
|
|
print("Not found wheel package! Pleae wheel first")
|
|
|
|
|
return
|
|
|
|
|
print("current wheel:")
|
|
|
|
|
for bdist in os.listdir('dist'):
|
|
|
|
|
print(bdist)
|
|
|
|
|
print("")
|
|
|
|
|
val = input('Are you sure upload now (y/n)? (deault: n) ')
|
|
|
|
|
if val == 'y':
|
|
|
|
|
os.system("twine upload dist/*")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
# 添加 click 命令
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
cli.add_command(build)
|
|
|
|
|
cli.add_command(test)
|
|
|
|
|
cli.add_command(clear)
|
|
|
|
|
cli.add_command(install)
|
|
|
|
|
cli.add_command(uninstall)
|
|
|
|
|
cli.add_command(wheel)
|
|
|
|
|
cli.add_command(upload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
cli()
|