2020-10-20 22:53:14 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
|
|
# license information.
|
|
|
|
###########################################################################
|
|
|
|
|
2021-04-13 00:27:10 +03:00
|
|
|
from setuptools import setup, find_packages
|
2021-09-29 23:18:36 +03:00
|
|
|
from setuptools.dist import Distribution
|
2021-09-25 10:40:12 +03:00
|
|
|
from setuptools.command.build_ext import build_ext as _build_ext
|
2021-09-29 23:18:36 +03:00
|
|
|
from setuptools.command.develop import develop as _develop
|
|
|
|
from setuptools.command.build_py import build_py as _build_py
|
2021-01-12 00:44:17 +03:00
|
|
|
|
2020-10-20 22:53:14 +03:00
|
|
|
import os
|
2021-01-12 00:44:17 +03:00
|
|
|
import sys
|
|
|
|
import setuptools
|
|
|
|
import pathlib
|
|
|
|
import subprocess
|
|
|
|
|
2021-09-25 10:40:12 +03:00
|
|
|
from textwrap import dedent
|
2021-01-12 00:44:17 +03:00
|
|
|
|
|
|
|
|
2021-09-25 10:40:12 +03:00
|
|
|
TOP_DIR = os.path.dirname(__file__) or os.getcwd()
|
|
|
|
PACKAGE_NAME = 'onnxruntime_extensions'
|
2021-01-12 00:44:17 +03:00
|
|
|
|
|
|
|
|
|
|
|
def load_msvcvar():
|
|
|
|
if os.environ.get('vcvars'):
|
|
|
|
stdout, _ = subprocess.Popen([
|
|
|
|
'cmd', '/q', '/c', '(%vcvars% & set)'],
|
|
|
|
stdout=subprocess.PIPE, shell=True, universal_newlines=True).communicate()
|
|
|
|
for line in stdout.splitlines():
|
|
|
|
kv_pair = line.split('=')
|
|
|
|
if len(kv_pair) == 2:
|
|
|
|
os.environ[kv_pair[0]] = kv_pair[1]
|
|
|
|
else:
|
|
|
|
import shutil
|
|
|
|
if shutil.which('cmake') is None:
|
|
|
|
raise SystemExit(
|
|
|
|
"Cannot find cmake in the executable path, " +
|
|
|
|
"please install one or specify the environement variable VCVARS to the path of VS vcvars64.bat.")
|
|
|
|
|
|
|
|
|
2021-09-29 23:18:36 +03:00
|
|
|
def read_git_refs():
|
|
|
|
release_branch = False
|
2021-09-25 10:40:12 +03:00
|
|
|
stdout, _ = subprocess.Popen(
|
2021-09-29 23:18:36 +03:00
|
|
|
['git'] + ['log', '-1', '--format=%H'],
|
|
|
|
cwd=TOP_DIR,
|
|
|
|
stdout=subprocess.PIPE, universal_newlines=True).communicate()
|
|
|
|
HEAD = dedent(stdout.splitlines()[0]).strip('\n\r')
|
|
|
|
stdout, _ = subprocess.Popen(
|
|
|
|
['git'] + ['show-ref', '--head'],
|
2021-09-25 10:40:12 +03:00
|
|
|
cwd=TOP_DIR,
|
|
|
|
stdout=subprocess.PIPE, universal_newlines=True).communicate()
|
|
|
|
for _ln in stdout.splitlines():
|
|
|
|
_ln = dedent(_ln).strip('\n\r')
|
2021-09-29 23:18:36 +03:00
|
|
|
if _ln.startswith(HEAD):
|
|
|
|
_, _2 = _ln.split(' ')
|
|
|
|
if (_2.startswith('refs/remotes/origin/rel-')):
|
|
|
|
release_branch = True
|
|
|
|
return release_branch, HEAD
|
2021-09-25 10:40:12 +03:00
|
|
|
|
|
|
|
|
2021-01-12 00:44:17 +03:00
|
|
|
class BuildCMakeExt(_build_ext):
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
"""
|
|
|
|
Perform build_cmake before doing the 'normal' stuff
|
|
|
|
"""
|
|
|
|
for extension in self.extensions:
|
2021-05-12 22:02:57 +03:00
|
|
|
if extension.name == 'onnxruntime_extensions._ortcustomops':
|
2021-01-12 00:44:17 +03:00
|
|
|
self.build_cmake(extension)
|
|
|
|
|
|
|
|
def build_cmake(self, extension):
|
|
|
|
project_dir = pathlib.Path().absolute()
|
|
|
|
build_temp = pathlib.Path(self.build_temp)
|
|
|
|
build_temp.mkdir(parents=True, exist_ok=True)
|
|
|
|
ext_fullpath = pathlib.Path(self.get_ext_fullpath(extension.name))
|
|
|
|
|
|
|
|
config = 'RelWithDebInfo' if self.debug else 'Release'
|
|
|
|
cmake_args = [
|
|
|
|
'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(ext_fullpath.parent.absolute()),
|
2021-02-03 22:17:35 +03:00
|
|
|
'-DOCOS_ENABLE_PYTHON=ON',
|
2021-04-14 09:01:29 +03:00
|
|
|
'-DOCOS_ENABLE_CTEST=OFF',
|
2021-01-12 00:44:17 +03:00
|
|
|
'-DOCOS_EXTENTION_NAME=' + pathlib.Path(self.get_ext_filename(extension.name)).name,
|
|
|
|
'-DCMAKE_BUILD_TYPE=' + config
|
|
|
|
]
|
2021-09-29 23:18:36 +03:00
|
|
|
# overwrite the Python module info if the auto-detection doesn't work.
|
2021-04-13 00:27:10 +03:00
|
|
|
# export Python3_INCLUDE_DIRS=/opt/python/cp38-cp38
|
|
|
|
# export Python3_LIBRARIES=/opt/python/cp38-cp38
|
|
|
|
for env in ['Python3_INCLUDE_DIRS', 'Python3_LIBRARIES']:
|
|
|
|
if env in os.environ:
|
|
|
|
cmake_args.append("-D%s=%s" % (env, os.environ[env]))
|
2021-01-12 00:44:17 +03:00
|
|
|
|
|
|
|
if self.debug:
|
|
|
|
cmake_args += ['-DCC_OPTIMIZE=OFF']
|
2020-10-20 22:53:14 +03:00
|
|
|
|
2021-01-12 00:44:17 +03:00
|
|
|
build_args = [
|
|
|
|
'--config', config,
|
|
|
|
'--parallel'
|
|
|
|
]
|
|
|
|
|
2021-09-25 10:40:12 +03:00
|
|
|
self.spawn(['cmake', '-S', str(project_dir), '-B', str(build_temp)] + cmake_args)
|
|
|
|
if not self.dry_run:
|
|
|
|
self.spawn(['cmake', '--build', str(build_temp)] + build_args)
|
2021-01-12 00:44:17 +03:00
|
|
|
|
|
|
|
if sys.platform == "win32":
|
2022-04-21 02:14:46 +03:00
|
|
|
config_dir = '.'
|
|
|
|
if not (build_temp / 'build.ninja').exists():
|
|
|
|
config_dir = config
|
|
|
|
self.copy_file(build_temp / config_dir / 'ortcustomops.dll',
|
2021-01-28 01:55:50 +03:00
|
|
|
self.get_ext_filename(extension.name))
|
2021-01-12 00:44:17 +03:00
|
|
|
|
|
|
|
|
2021-09-29 23:18:36 +03:00
|
|
|
class BuildPy(_build_py):
|
|
|
|
def run(self):
|
|
|
|
self.run_command("build_ext")
|
|
|
|
return super().run()
|
|
|
|
|
|
|
|
|
|
|
|
class BuildDevelop(_develop):
|
|
|
|
def run(self):
|
|
|
|
self.run_command("build_ext")
|
|
|
|
return super().run()
|
|
|
|
|
|
|
|
|
|
|
|
class BinaryDistribution(Distribution):
|
|
|
|
def has_ext_modules(self):
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
2021-01-12 00:44:17 +03:00
|
|
|
def read_requirements():
|
|
|
|
with open(os.path.join(TOP_DIR, "requirements.txt"), "r") as f:
|
2021-09-25 10:40:12 +03:00
|
|
|
requirements = [_ for _ in [dedent(_) for _ in f.readlines()] if _ is not None]
|
2021-01-12 00:44:17 +03:00
|
|
|
return requirements
|
2020-10-20 22:53:14 +03:00
|
|
|
|
|
|
|
|
|
|
|
# read version from the package file.
|
2021-01-12 00:44:17 +03:00
|
|
|
def read_version():
|
|
|
|
version_str = '1.0.0'
|
2021-09-25 10:40:12 +03:00
|
|
|
with (open(os.path.join(TOP_DIR, 'onnxruntime_extensions/_version.py'), "r")) as f:
|
|
|
|
line = [_ for _ in [dedent(_) for _ in f.readlines()] if _.startswith("__version__")]
|
2021-01-12 00:44:17 +03:00
|
|
|
if len(line) > 0:
|
2021-09-25 10:40:12 +03:00
|
|
|
version_str = line[0].split('=')[1].strip('" \n\r')
|
|
|
|
|
2021-09-29 23:18:36 +03:00
|
|
|
# is it a dev build or release?
|
|
|
|
if os.path.isdir(os.path.join(TOP_DIR, '.git')):
|
|
|
|
rel_br, cid = read_git_refs()
|
|
|
|
if not rel_br:
|
|
|
|
version_str += '+' + cid[:7]
|
2021-01-12 00:44:17 +03:00
|
|
|
return version_str
|
|
|
|
|
|
|
|
|
|
|
|
if sys.platform == "win32":
|
|
|
|
load_msvcvar()
|
|
|
|
|
|
|
|
ext_modules = [
|
|
|
|
setuptools.extension.Extension(
|
2021-05-12 22:02:57 +03:00
|
|
|
name=str('onnxruntime_extensions._ortcustomops'),
|
2021-01-12 00:44:17 +03:00
|
|
|
sources=[])
|
|
|
|
]
|
2020-10-20 22:53:14 +03:00
|
|
|
|
2021-04-13 00:27:10 +03:00
|
|
|
packages = find_packages()
|
|
|
|
package_dir = {k: os.path.join('.', k.replace(".", "/")) for k in packages}
|
|
|
|
package_data = {
|
2021-09-29 23:18:36 +03:00
|
|
|
"onnxruntime_extensions": ["*.so", "*.pyd"],
|
2021-04-13 00:27:10 +03:00
|
|
|
}
|
2020-10-20 22:53:14 +03:00
|
|
|
|
2021-06-02 00:02:55 +03:00
|
|
|
long_description = ''
|
|
|
|
with open(os.path.join(TOP_DIR, "README.md"), 'r') as f:
|
|
|
|
long_description = f.read()
|
|
|
|
start_pos = long_description.find('# Introduction')
|
|
|
|
start_pos = 0 if start_pos < 0 else start_pos
|
|
|
|
end_pos = long_description.find('# Contributing')
|
|
|
|
long_description = long_description[start_pos:end_pos]
|
|
|
|
|
2020-10-20 22:53:14 +03:00
|
|
|
setup(
|
2021-06-10 19:57:49 +03:00
|
|
|
name=PACKAGE_NAME,
|
2021-01-12 00:44:17 +03:00
|
|
|
version=read_version(),
|
2021-04-13 00:27:10 +03:00
|
|
|
packages=packages,
|
|
|
|
package_dir=package_dir,
|
|
|
|
package_data=package_data,
|
2021-06-02 00:02:55 +03:00
|
|
|
description="ONNXRuntime Extensions",
|
|
|
|
long_description=long_description,
|
2020-10-20 22:53:14 +03:00
|
|
|
long_description_content_type='text/markdown',
|
|
|
|
license='MIT License',
|
|
|
|
author='Microsoft Corporation',
|
|
|
|
author_email='onnx@microsoft.com',
|
2021-06-02 00:02:55 +03:00
|
|
|
url='https://github.com/microsoft/onnxruntime-extensions',
|
2021-01-12 00:44:17 +03:00
|
|
|
ext_modules=ext_modules,
|
|
|
|
cmdclass=dict(
|
|
|
|
build_ext=BuildCMakeExt,
|
2021-09-29 23:18:36 +03:00
|
|
|
build_py=BuildPy,
|
|
|
|
develop=BuildDevelop
|
2021-01-12 00:44:17 +03:00
|
|
|
),
|
2020-10-20 22:53:14 +03:00
|
|
|
include_package_data=True,
|
2021-09-29 23:18:36 +03:00
|
|
|
distclass=BinaryDistribution,
|
2021-01-12 00:44:17 +03:00
|
|
|
install_requires=read_requirements(),
|
2020-10-20 22:53:14 +03:00
|
|
|
classifiers=[
|
2021-04-13 00:27:10 +03:00
|
|
|
'Development Status :: 4 - Beta',
|
2020-10-20 22:53:14 +03:00
|
|
|
'Environment :: Console',
|
|
|
|
'Intended Audience :: Developers',
|
|
|
|
'Operating System :: MacOS :: MacOS X',
|
|
|
|
'Operating System :: Microsoft :: Windows',
|
2021-04-13 00:27:10 +03:00
|
|
|
'Operating System :: POSIX :: Linux',
|
2021-01-12 00:44:17 +03:00
|
|
|
"Programming Language :: C++",
|
2020-10-20 22:53:14 +03:00
|
|
|
'Programming Language :: Python',
|
2021-06-02 00:02:55 +03:00
|
|
|
'Programming Language :: Python :: 3.6',
|
2021-01-12 00:44:17 +03:00
|
|
|
'Programming Language :: Python :: 3.7',
|
2021-04-13 00:27:10 +03:00
|
|
|
'Programming Language :: Python :: 3.8',
|
|
|
|
'Programming Language :: Python :: 3.9',
|
2021-01-12 00:44:17 +03:00
|
|
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
|
|
'License :: OSI Approved :: MIT License'
|
|
|
|
],
|
2020-10-20 22:53:14 +03:00
|
|
|
)
|