From ab8995fc7901a376d3800849eeeb97a89f8d16b4 Mon Sep 17 00:00:00 2001 From: evilbeast Date: Tue, 23 Aug 2022 14:22:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0setup.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- ntchat/__init__.py | 2 + scripts/make_win_wheels_32.bat | 13 ++ scripts/make_win_wheels_64.bat | 13 ++ setup.py | 220 +++++++++++++++++++++++++++++++++ 5 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 scripts/make_win_wheels_32.bat create mode 100644 scripts/make_win_wheels_64.bat diff --git a/.gitignore b/.gitignore index f7f985e..8d9bcf1 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,6 @@ log/ main.spec build/ config.ini -ntchat/wc/*.pyd \ No newline at end of file +ntchat/wc/*.pyd +wheelhouse/ +setup_conf.py \ No newline at end of file diff --git a/ntchat/__init__.py b/ntchat/__init__.py index 037e7ac..437b2cb 100644 --- a/ntchat/__init__.py +++ b/ntchat/__init__.py @@ -1,6 +1,8 @@ from .conf import VERSION from .core.wechat import WeChat from .wc import wcprobe +from .const.wx_type import * +from .exception import * __version__ = VERSION diff --git a/scripts/make_win_wheels_32.bat b/scripts/make_win_wheels_32.bat new file mode 100644 index 0000000..aa806c9 --- /dev/null +++ b/scripts/make_win_wheels_32.bat @@ -0,0 +1,13 @@ +%UserProfile%\.pyenv\pyenv-win\versions\3.6.0-win32\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.7.0-win32\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.8.0-win32\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.9.0-win32\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.10.0-win32\python.exe -m pip install --upgrade pip setuptools wheel +call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat" +pushd .. +%UserProfile%\.pyenv\pyenv-win\versions\3.6.0-win32\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.7.0-win32\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.8.0-win32\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.9.0-win32\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.10.0-win32\python.exe setup.py bdist_wheel -d wheelhouse +popd diff --git a/scripts/make_win_wheels_64.bat b/scripts/make_win_wheels_64.bat new file mode 100644 index 0000000..ee51370 --- /dev/null +++ b/scripts/make_win_wheels_64.bat @@ -0,0 +1,13 @@ +%UserProfile%\.pyenv\pyenv-win\versions\3.6.0\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.7.0\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.8.0\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.9.0\python.exe -m pip install --upgrade pip setuptools wheel +%UserProfile%\.pyenv\pyenv-win\versions\3.10.0\python.exe -m pip install --upgrade pip setuptools wheel +call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" +pushd .. +%UserProfile%\.pyenv\pyenv-win\versions\3.6.0\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.7.0\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.8.0\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.9.0\python.exe setup.py bdist_wheel -d wheelhouse +%UserProfile%\.pyenv\pyenv-win\versions\3.10.0\python.exe setup.py bdist_wheel -d wheelhouse +popd diff --git a/setup.py b/setup.py index e69de29..3c8bf99 100644 --- a/setup.py +++ b/setup.py @@ -0,0 +1,220 @@ +from setuptools import setup, Extension, find_packages +from distutils.errors import * +from distutils.dep_util import newer_group +from distutils import log +from distutils.command.build_ext import build_ext + +import os +import sys +import platform +import re +import pathlib +from distutils.ccompiler import CCompiler +from multiprocessing.pool import ThreadPool as Pool +import setup_conf + + +def compile(self, sources, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, + extra_postargs=None, depends=None): + 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) + + def f(x): + try: + src, ext = build[x] + except KeyError: + return + + self._compile(x, src, ext, cc_args, extra_postargs, pp_opts) + + pool = Pool(processes=6) + pool.map(f, objects) + + return objects + + +# Overwrite to enable multiprocess compilation +CCompiler.compile = compile + +target_os = 'none' +if sys.platform == 'darwin': + target_os = 'darwin' +elif os.name == 'posix': + target_os = 'posix' +elif platform.system() == 'Windows': + target_os = 'win32' + +target_os_arch = 'x64' if sys.maxsize > 2 ** 32 else 'x86' + + +def filter_sources(sources): + """Filters sources into c, cpp and objc""" + cpp_ext_match = re.compile(r'.*[.](cpp|cxx|cc|hpp)\Z', re.I).match + c_ext_match = re.compile(r'.*[.](c|C)\Z', re.I).match + objc_ext_match = re.compile(r'.*[.]m\Z', re.I).match + + c_sources = [] + cpp_sources = [] + objc_sources = [] + other_sources = [] + for source in sources: + if c_ext_match(source): + c_sources.append(source) + elif cpp_ext_match(source): + cpp_sources.append(source) + elif objc_ext_match(source): + objc_sources.append(source) + else: + other_sources.append(source) + return c_sources, cpp_sources, objc_sources, other_sources + + +def build_extension(self, ext): + """Modified version of build_extension method from distutils. + Can handle compiler args for different files""" + + sources = ext.sources + if sources is None or not isinstance(sources, (list, tuple)): + raise DistutilsSetupError( + "in 'ext_modules' option (extension '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % ext.name) + + sources = list(sources) + ext_path = self.get_ext_fullpath(ext.name) + depends = sources + ext.depends + if not (self.force or newer_group(depends, ext_path, 'newer')): + log.debug("skipping '%s' extension (up-to-date)", ext.name) + return + else: + log.info("building '%s' extension", ext.name) + + sources = self.swig_sources(sources, ext) + + extra_args = ext.extra_compile_args or [] + extra_c_args = getattr(ext, "extra_compile_c_args", []) + extra_cpp_args = getattr(ext, "extra_compile_cpp_args", []) + extra_objc_args = getattr(ext, "extra_compile_objc_args", []) + macros = ext.define_macros[:] + for undef in ext.undef_macros: + macros.append((undef,)) + + c_sources, cpp_sources, objc_sources, other_sources = filter_sources(sources) + + def _compile(src, args): + return self.compiler.compile(src, + output_dir=self.build_temp, + macros=macros, + include_dirs=ext.include_dirs, + debug=self.debug, + extra_postargs=extra_args + args, + depends=ext.depends) + + objects = [] + objects += _compile(c_sources, extra_c_args) + objects += _compile(cpp_sources, extra_cpp_args) + objects += _compile(objc_sources, extra_objc_args) + objects += _compile(other_sources, []) + + self._built_objects = objects[:] + if ext.extra_objects: + objects.extend(ext.extra_objects) + + extra_args = ext.extra_link_args or [] + + language = ext.language or self.compiler.detect_language(sources) + self.compiler.link_shared_object( + objects, ext_path, + libraries=self.get_libraries(ext), + library_dirs=ext.library_dirs, + runtime_library_dirs=ext.runtime_library_dirs, + extra_postargs=extra_args, + export_symbols=self.get_export_symbols(ext), + debug=self.debug, + build_temp=self.build_temp, + target_lang=language) + + +# patching +build_ext.build_extension = build_extension + +definitions = { + 'win32': [("HPSOCKET_STATIC_LIB", None), ("UNICODE", None), ("_UNICODE", None)], +} + +libs = { + 'win32': ["kernel32", "user32", "gdi32", "winspool", + "comdlg32", "advapi32", "shell32", "ole32", + "oleaut32", "uuid", "odbc32", "odbccp32"], +} + +extra_libs = { + 'win32': setup_conf.extra_libs +} + +extra_libs_dir = { + 'win32': [f"{setup_conf.extra_libs_dir_prefix}\\{target_os_arch}"] +} + +extra_link = { + 'win32': [], +} + +extra_compile_args = { + 'darwin': [], + 'posix': [], + 'win32': ['/MT', "/EHsc", "/bigobj"], +} + +extra_compile_cpp_args = { + 'darwin': ['-std=c++11'], + 'posix': ['-std=c++11'], + 'win32': [], +} + +cpp_code_sources = [str(path) for path in pathlib.Path(setup_conf.cpp_source_dir).rglob("*.cpp")] + + +def add_prefix(l, prefix): + return [os.path.join(prefix, x) for x in l] + + +extension = Extension("ntchat.wc.wcprobe", + cpp_code_sources, + define_macros=definitions[target_os], + include_dirs=setup_conf.include_dirs, + extra_compile_args=extra_compile_args[target_os], + extra_link_args=extra_link[target_os], + libraries=libs[target_os], + extra_objects=extra_libs[target_os], + library_dirs=extra_libs_dir[target_os]) + +extension.extra_compile_cpp_args = extra_compile_cpp_args[target_os] + +setup( + name='ntchat', + version='0.1.0', + description='About Conversational RPA SDK for Chatbot Makers', + long_description="", + long_description_content_type='text/markdown', + url='https://github.com/smallevilbeast/ntchat', + author='evilbeast', + author_email='784615627@qq.com', + license='MIT', + classifiers=[ + 'Development Status :: 1 - Beta', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10' + ], + package_data={"": ["py.typed", "*.pyi", "helper*.pyd"]}, + include_package_data=False, + packages=find_packages(include=['ntchat', 'ntchat.*']), + keywords='wechat ntchat pywechat rebot', + install_requires=['pyee', 'xcgui'], + ext_modules=[extension] +)