Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update setup.py. #7360

Merged
merged 1 commit into from Oct 28, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 26 additions & 15 deletions python-package/setup.py
Expand Up @@ -4,6 +4,7 @@
import subprocess
import logging
import distutils
from typing import Optional, List
import sys
from platform import system
from setuptools import setup, find_packages, Extension
Expand Down Expand Up @@ -36,7 +37,7 @@
BUILD_TEMP_DIR = None


def lib_name():
def lib_name() -> str:
'''Return platform dependent shared object name.'''
if system() == 'Linux' or system().upper().endswith('BSD'):
name = 'libxgboost.so'
Expand All @@ -47,13 +48,13 @@ def lib_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.'''
def clean_copy_tree(src, dst):
def clean_copy_tree(src: str, dst: str) -> None:
distutils.dir_util.copy_tree(src, 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)
NEED_CLEAN_FILE.add(os.path.abspath(dst))

Expand All @@ -77,7 +78,7 @@ def clean_copy_file(src, dst):
clean_copy_file(lic, os.path.join(target_dir, 'LICENSE'))


def clean_up():
def clean_up() -> None:
'''Removed copied files.'''
for path in NEED_CLEAN_TREE:
shutil.rmtree(path)
Expand All @@ -87,7 +88,7 @@ def clean_up():

class CMakeExtension(Extension): # pylint: disable=too-few-public-methods
'''Wrapper for extension'''
def __init__(self, name):
def __init__(self, name: str) -> None:
super().__init__(name=name, sources=[])


Expand All @@ -97,7 +98,14 @@ class BuildExt(build_ext.build_ext): # pylint: disable=too-many-ancestors
logger = logging.getLogger('XGBoost build_ext')

# 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.'''
cmake_cmd = ['cmake', src_dir, generator]

Expand All @@ -116,13 +124,14 @@ def build(self, src_dir, build_dir, generator, build_tool=None, use_omp=1):

if system() != 'Windows':
nproc = os.cpu_count()
assert build_tool is not None
subprocess.check_call([build_tool, '-j' + str(nproc)],
cwd=build_dir)
else:
subprocess.check_call(['cmake', '--build', '.',
'--config', 'Release'], cwd=build_dir)

def build_cmake_extension(self):
def build_cmake_extension(self) -> None:
'''Configure and build using CMake'''
if USER_OPTIONS['use-system-libxgboost'][2]:
self.logger.info('Using system libxgboost.')
Expand Down Expand Up @@ -174,14 +183,14 @@ def build_cmake_extension(self):
self.logger.warning('Disabling OpenMP support.')
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.'''
if isinstance(ext, CMakeExtension):
self.build_cmake_extension()
else:
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
should available in `lib`.

Expand All @@ -196,7 +205,7 @@ class Sdist(sdist.sdist): # pylint: disable=too-many-ancestors
'''Copy c++ source into Python directory.'''
logger = logging.getLogger('xgboost sdist')

def run(self):
def run(self) -> None:
copy_tree(os.path.join(CURRENT_DIR, os.path.pardir),
os.path.join(CURRENT_DIR, 'xgboost'))
libxgboost = os.path.join(
Expand All @@ -213,7 +222,7 @@ class InstallLib(install_lib.install_lib):
'''Copy shared object into installation directory.'''
logger = logging.getLogger('xgboost install_lib')

def install(self):
def install(self) -> List[str]:
outfiles = super().install()

if USER_OPTIONS['use-system-libxgboost'][2] != 0:
Expand Down Expand Up @@ -255,7 +264,7 @@ class Install(install.install): # pylint: disable=too-many-instance-attributes
user_options = install.install.user_options + list(
(k, v[0], v[1]) for k, v in USER_OPTIONS.items())

def initialize_options(self):
def initialize_options(self) -> None:
super().initialize_options()
self.use_openmp = 1
self.use_cuda = 0
Expand All @@ -271,7 +280,7 @@ def initialize_options(self):

self.use_system_libxgboost = 0

def run(self):
def run(self) -> None:
# setuptools will configure the options according to user supplied command line
# arguments, then here we propagate them into `USER_OPTIONS` for visibility to
# other sub-commands like `build_ext`.
Expand Down Expand Up @@ -341,7 +350,9 @@ def run(self):
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'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',
url='https://github.com/dmlc/xgboost')

Expand Down