Update setup.py. (#7360) (#7568)

* Add new classifiers.
* Typehint.
This commit is contained in:
Jiaming Yuan 2022-01-15 20:39:34 +08:00 committed by GitHub
parent ed8ba2150b
commit 2245a6e9ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,6 +4,7 @@ import shutil
import subprocess import subprocess
import logging import logging
import distutils import distutils
from typing import Optional, List
import sys import sys
from platform import system from platform import system
from setuptools import setup, find_packages, Extension from setuptools import setup, find_packages, Extension
@ -36,7 +37,7 @@ NEED_CLEAN_FILE = set()
BUILD_TEMP_DIR = None BUILD_TEMP_DIR = None
def lib_name(): def lib_name() -> str:
'''Return platform dependent shared object name.''' '''Return platform dependent shared object name.'''
if system() == 'Linux' or system().upper().endswith('BSD'): if system() == 'Linux' or system().upper().endswith('BSD'):
name = 'libxgboost.so' name = 'libxgboost.so'
@ -47,13 +48,13 @@ def lib_name():
return name return name
def copy_tree(src_dir, target_dir): def copy_tree(src_dir: str, target_dir: str) -> None:
'''Copy source tree into build directory.''' '''Copy source tree into build directory.'''
def clean_copy_tree(src, dst): def clean_copy_tree(src: str, dst: str) -> None:
distutils.dir_util.copy_tree(src, dst) distutils.dir_util.copy_tree(src, dst)
NEED_CLEAN_TREE.add(os.path.abspath(dst)) NEED_CLEAN_TREE.add(os.path.abspath(dst))
def clean_copy_file(src, dst): def clean_copy_file(src: str, dst: str) -> None:
distutils.file_util.copy_file(src, dst) distutils.file_util.copy_file(src, dst)
NEED_CLEAN_FILE.add(os.path.abspath(dst)) NEED_CLEAN_FILE.add(os.path.abspath(dst))
@ -77,7 +78,7 @@ def copy_tree(src_dir, target_dir):
clean_copy_file(lic, os.path.join(target_dir, 'LICENSE')) clean_copy_file(lic, os.path.join(target_dir, 'LICENSE'))
def clean_up(): def clean_up() -> None:
'''Removed copied files.''' '''Removed copied files.'''
for path in NEED_CLEAN_TREE: for path in NEED_CLEAN_TREE:
shutil.rmtree(path) shutil.rmtree(path)
@ -87,7 +88,7 @@ def clean_up():
class CMakeExtension(Extension): # pylint: disable=too-few-public-methods class CMakeExtension(Extension): # pylint: disable=too-few-public-methods
'''Wrapper for extension''' '''Wrapper for extension'''
def __init__(self, name): def __init__(self, name: str) -> None:
super().__init__(name=name, sources=[]) super().__init__(name=name, sources=[])
@ -97,7 +98,14 @@ class BuildExt(build_ext.build_ext): # pylint: disable=too-many-ancestors
logger = logging.getLogger('XGBoost build_ext') logger = logging.getLogger('XGBoost build_ext')
# pylint: disable=too-many-arguments,no-self-use # pylint: disable=too-many-arguments,no-self-use
def build(self, src_dir, build_dir, generator, build_tool=None, use_omp=1): def build(
self,
src_dir: str,
build_dir: str,
generator: str,
build_tool: Optional[str] = None,
use_omp: int = 1,
) -> None:
'''Build the core library with CMake.''' '''Build the core library with CMake.'''
cmake_cmd = ['cmake', src_dir, generator] cmake_cmd = ['cmake', src_dir, generator]
@ -116,13 +124,14 @@ class BuildExt(build_ext.build_ext): # pylint: disable=too-many-ancestors
if system() != 'Windows': if system() != 'Windows':
nproc = os.cpu_count() nproc = os.cpu_count()
assert build_tool is not None
subprocess.check_call([build_tool, '-j' + str(nproc)], subprocess.check_call([build_tool, '-j' + str(nproc)],
cwd=build_dir) cwd=build_dir)
else: else:
subprocess.check_call(['cmake', '--build', '.', subprocess.check_call(['cmake', '--build', '.',
'--config', 'Release'], cwd=build_dir) '--config', 'Release'], cwd=build_dir)
def build_cmake_extension(self): def build_cmake_extension(self) -> None:
'''Configure and build using CMake''' '''Configure and build using CMake'''
if USER_OPTIONS['use-system-libxgboost'][2]: if USER_OPTIONS['use-system-libxgboost'][2]:
self.logger.info('Using system libxgboost.') self.logger.info('Using system libxgboost.')
@ -174,14 +183,14 @@ class BuildExt(build_ext.build_ext): # pylint: disable=too-many-ancestors
self.logger.warning('Disabling OpenMP support.') self.logger.warning('Disabling OpenMP support.')
self.build(src_dir, build_dir, gen, build_tool, use_omp=0) self.build(src_dir, build_dir, gen, build_tool, use_omp=0)
def build_extension(self, ext): def build_extension(self, ext: Extension) -> None:
'''Override the method for dispatching.''' '''Override the method for dispatching.'''
if isinstance(ext, CMakeExtension): if isinstance(ext, CMakeExtension):
self.build_cmake_extension() self.build_cmake_extension()
else: else:
super().build_extension(ext) super().build_extension(ext)
def copy_extensions_to_source(self): def copy_extensions_to_source(self) -> None:
'''Dummy override. Invoked during editable installation. Our binary '''Dummy override. Invoked during editable installation. Our binary
should available in `lib`. should available in `lib`.
@ -196,7 +205,7 @@ class Sdist(sdist.sdist): # pylint: disable=too-many-ancestors
'''Copy c++ source into Python directory.''' '''Copy c++ source into Python directory.'''
logger = logging.getLogger('xgboost sdist') logger = logging.getLogger('xgboost sdist')
def run(self): def run(self) -> None:
copy_tree(os.path.join(CURRENT_DIR, os.path.pardir), copy_tree(os.path.join(CURRENT_DIR, os.path.pardir),
os.path.join(CURRENT_DIR, 'xgboost')) os.path.join(CURRENT_DIR, 'xgboost'))
libxgboost = os.path.join( libxgboost = os.path.join(
@ -213,7 +222,7 @@ class InstallLib(install_lib.install_lib):
'''Copy shared object into installation directory.''' '''Copy shared object into installation directory.'''
logger = logging.getLogger('xgboost install_lib') logger = logging.getLogger('xgboost install_lib')
def install(self): def install(self) -> List[str]:
outfiles = super().install() outfiles = super().install()
if USER_OPTIONS['use-system-libxgboost'][2] != 0: if USER_OPTIONS['use-system-libxgboost'][2] != 0:
@ -255,7 +264,7 @@ class Install(install.install): # pylint: disable=too-many-instance-attributes
user_options = install.install.user_options + list( user_options = install.install.user_options + list(
(k, v[0], v[1]) for k, v in USER_OPTIONS.items()) (k, v[0], v[1]) for k, v in USER_OPTIONS.items())
def initialize_options(self): def initialize_options(self) -> None:
super().initialize_options() super().initialize_options()
self.use_openmp = 1 self.use_openmp = 1
self.use_cuda = 0 self.use_cuda = 0
@ -271,7 +280,7 @@ class Install(install.install): # pylint: disable=too-many-instance-attributes
self.use_system_libxgboost = 0 self.use_system_libxgboost = 0
def run(self): def run(self) -> None:
# setuptools will configure the options according to user supplied command line # setuptools will configure the options according to user supplied command line
# arguments, then here we propagate them into `USER_OPTIONS` for visibility to # arguments, then here we propagate them into `USER_OPTIONS` for visibility to
# other sub-commands like `build_ext`. # other sub-commands like `build_ext`.
@ -341,7 +350,9 @@ if __name__ == '__main__':
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8'], 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10'],
python_requires='>=3.6', python_requires='>=3.6',
url='https://github.com/dmlc/xgboost') url='https://github.com/dmlc/xgboost')