setup.py 4.25 KB
Newer Older
Louis Martin's avatar
Louis Martin committed
1
#!/usr/bin/env python3
2
# Copyright (c) Facebook, Inc. and its affiliates.
Sergey Edunov's avatar
Sergey Edunov committed
3
#
4
5
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
Sergey Edunov's avatar
Sergey Edunov committed
6

Myle Ott's avatar
Myle Ott committed
7
import os
Sergey Edunov's avatar
Sergey Edunov committed
8
9
10
11
from setuptools import setup, find_packages, Extension
import sys


Myle Ott's avatar
Myle Ott committed
12
13
if sys.version_info < (3, 5):
    sys.exit('Sorry, Python >=3.5 is required for fairseq.')
Sergey Edunov's avatar
Sergey Edunov committed
14

Myle Ott's avatar
Myle Ott committed
15

Sergey Edunov's avatar
Sergey Edunov committed
16
17
18
with open('README.md') as f:
    readme = f.read()

Myle Ott's avatar
Myle Ott committed
19

20
if sys.platform == 'darwin':
21
    extra_compile_args = ['-stdlib=libc++', '-O3']
22
else:
23
    extra_compile_args = ['-std=c++11', '-O3']
Sergey Edunov's avatar
Sergey Edunov committed
24

25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class NumpyExtension(Extension):
    """Source: https://stackoverflow.com/a/54128391"""

    def __init__(self, *args, **kwargs):
        self.__include_dirs = []
        super().__init__(*args, **kwargs)

    @property
    def include_dirs(self):
        import numpy
        return self.__include_dirs + [numpy.get_include()]

    @include_dirs.setter
    def include_dirs(self, dirs):
        self.__include_dirs = dirs


Myle Ott's avatar
Myle Ott committed
43
44
45
46
47
48
49
extensions = [
    Extension(
        'fairseq.libbleu',
        sources=[
            'fairseq/clib/libbleu/libbleu.cpp',
            'fairseq/clib/libbleu/module.cpp',
        ],
50
        extra_compile_args=extra_compile_args,
Myle Ott's avatar
Myle Ott committed
51
    ),
52
    NumpyExtension(
Myle Ott's avatar
Myle Ott committed
53
54
55
        'fairseq.data.data_utils_fast',
        sources=['fairseq/data/data_utils_fast.pyx'],
        language='c++',
56
        extra_compile_args=extra_compile_args,
Myle Ott's avatar
Myle Ott committed
57
    ),
58
    NumpyExtension(
Myle Ott's avatar
Myle Ott committed
59
60
61
62
63
64
        'fairseq.data.token_block_utils_fast',
        sources=['fairseq/data/token_block_utils_fast.pyx'],
        language='c++',
        extra_compile_args=extra_compile_args,
    ),
]
65
66


Myle Ott's avatar
Myle Ott committed
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
cmdclass = {}


try:
    # torch is not available when generating docs
    from torch.utils import cpp_extension
    extensions.extend([
        cpp_extension.CppExtension(
            'fairseq.libnat',
            sources=[
                'fairseq/clib/libnat/edit_dist.cpp',
            ],
        ),
    ])
    cmdclass['build_ext'] = cpp_extension.BuildExtension
except ImportError:
    pass


if 'READTHEDOCS' in os.environ:
    # don't build extensions when generating docs
    extensions = []
    if 'build_ext' in cmdclass:
        del cmdclass['build_ext']

    # use CPU build of PyTorch
    dependency_links = [
        'https://download.pytorch.org/whl/cpu/torch-1.3.0%2Bcpu-cp36-cp36m-linux_x86_64.whl'
    ]
else:
    dependency_links = []


100
101
102
103
104
105
106
if 'clean' in sys.argv[1:]:
    # Source: https://bit.ly/2NLVsgE
    print("deleting Cython files...")
    import subprocess
    subprocess.run(['rm -f fairseq/*.so fairseq/**/*.so'], shell=True)


107
108
109
110
111
112
113
114
115
116
if 'test' in sys.argv[1:]:
    try:
        import fairseq.data.token_block_utils_fast
    except (ImportError, ModuleNotFoundError):
        raise Exception(
            'Please install Cython components with `python setup.py build_ext --inplace`'
            'before running unit tests.'
        )


Sergey Edunov's avatar
Sergey Edunov committed
117
118
setup(
    name='fairseq',
Myle Ott's avatar
Myle Ott committed
119
    version='0.8.0',
Sergey Edunov's avatar
Sergey Edunov committed
120
    description='Facebook AI Research Sequence-to-Sequence Toolkit',
Myle Ott's avatar
Myle Ott committed
121
122
123
    url='https://github.com/pytorch/fairseq',
    classifiers=[
        'Intended Audience :: Science/Research',
124
        'License :: OSI Approved :: MIT License',
Bairen Yi's avatar
Bairen Yi committed
125
        'Programming Language :: Python :: 3.5',
Myle Ott's avatar
Myle Ott committed
126
127
128
        'Programming Language :: Python :: 3.6',
        'Topic :: Scientific/Engineering :: Artificial Intelligence',
    ],
Sergey Edunov's avatar
Sergey Edunov committed
129
    long_description=readme,
Myle Ott's avatar
Myle Ott committed
130
    long_description_content_type='text/markdown',
131
132
    setup_requires=[
        'cython',
Myle Ott's avatar
Myle Ott committed
133
        'numpy',
134
135
        'setuptools>=18.0',
    ],
Myle Ott's avatar
Myle Ott committed
136
137
    install_requires=[
        'cffi',
Naman Goyal's avatar
Naman Goyal committed
138
        'cython',
Myle Ott's avatar
Myle Ott committed
139
        'numpy',
Myle Ott's avatar
Myle Ott committed
140
        'regex',
Myle Ott's avatar
Myle Ott committed
141
        'sacrebleu',
Myle Ott's avatar
Myle Ott committed
142
        'torch',
Myle Ott's avatar
Myle Ott committed
143
144
        'tqdm',
    ],
Myle Ott's avatar
Myle Ott committed
145
    dependency_links=dependency_links,
Myle Ott's avatar
Myle Ott committed
146
    packages=find_packages(exclude=['scripts', 'tests']),
Myle Ott's avatar
Myle Ott committed
147
    ext_modules=extensions,
Myle Ott's avatar
Myle Ott committed
148
    test_suite='tests',
Myle Ott's avatar
Myle Ott committed
149
150
    entry_points={
        'console_scripts': [
Myle Ott's avatar
Myle Ott committed
151
152
153
154
155
            'fairseq-eval-lm = fairseq_cli.eval_lm:cli_main',
            'fairseq-generate = fairseq_cli.generate:cli_main',
            'fairseq-interactive = fairseq_cli.interactive:cli_main',
            'fairseq-preprocess = fairseq_cli.preprocess:cli_main',
            'fairseq-score = fairseq_cli.score:main',
Myle Ott's avatar
Myle Ott committed
156
157
            'fairseq-train = fairseq_cli.train:cli_main',
            'fairseq-validate = fairseq_cli.validate:cli_main',
Myle Ott's avatar
Myle Ott committed
158
159
        ],
    },
Myle Ott's avatar
Myle Ott committed
160
    cmdclass=cmdclass,
161
    zip_safe=False,
Sergey Edunov's avatar
Sergey Edunov committed
162
)