setup.py.in 9.5 KB
Newer Older
T
typhoonzero 已提交
1
from setuptools import setup, Distribution, Extension
Y
Yancey 已提交
2
import subprocess
3
import os
4
import re
5
import shutil
6
import sys
7 8 9
class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True
Z
zhangjinchao01 已提交
10

Y
Yancey 已提交
11 12
RC      = 0

13
ext_name = '.dll' if os.name == 'nt' else ('.dylib' if sys.platform == 'darwin' else '.so')
Y
Yancey 已提交
14 15 16 17

def git_commit():
    try:
        cmd = ['git', 'rev-parse', 'HEAD']
18 19
        git_commit = subprocess.Popen(cmd, stdout = subprocess.PIPE,
            cwd="@PADDLE_SOURCE_DIR@").communicate()[0].strip()
Y
Yancey 已提交
20 21
    except:
        git_commit = 'Unknown'
22
    git_commit = git_commit.decode()
23
    return str(git_commit)
Y
Yancey 已提交
24

25
def _get_version_detail(idx):
26 27
    assert idx < 3, "vesion info consists of %(major)d.%(minor)d.%(patch)d, \
        so detail index must less than 3"
28

M
minqiyang 已提交
29 30
    if re.match('@TAG_VERSION_REGEX@', '@PADDLE_VERSION@'):
        version_details = '@PADDLE_VERSION@'.split('.')
31

M
minqiyang 已提交
32
        if len(version_details) >= 3:
M
minqiyang 已提交
33
            return version_details[idx]
34

35
    return 0
36

M
minqiyang 已提交
37
def get_major():
38
    return int(_get_version_detail(0))
39

M
minqiyang 已提交
40
def get_minor():
41
    return int(_get_version_detail(1))
42

43
def get_patch():
44
    return str(_get_version_detail(2))
45 46

def is_taged():
M
minqiyang 已提交
47
    try:
48
        cmd = ['git', 'describe', '--exact-match', '--tags', 'HEAD', '2>/dev/null']
49
        git_tag = subprocess.Popen(cmd, stdout = subprocess.PIPE, cwd="@PADDLE_SOURCE_DIR@").communicate()[0].strip()
50
        git_tag = git_tag.decode()
M
minqiyang 已提交
51
    except:
52 53
        return False

54
    if str(git_tag).replace('v', '') == '@PADDLE_VERSION@':
55 56
        return True
    else:
M
minqiyang 已提交
57
        return False
58

Y
Yancey 已提交
59
def write_version_py(filename='paddle/version.py'):
60
    cnt = '''# THIS FILE IS GENERATED FROM PADDLEPADDLE SETUP.PY
Y
Yancey 已提交
61
#
62
full_version    = '%(major)d.%(minor)d.%(patch)s'
Y
Yancey 已提交
63 64
major           = '%(major)d'
minor           = '%(minor)d'
65
patch           = '%(patch)s'
Y
Yancey 已提交
66 67 68
rc              = '%(rc)d'
istaged         = %(istaged)s
commit          = '%(commit)s'
L
Luo Tao 已提交
69
with_mkl        = '%(with_mkl)s'
Y
Yancey 已提交
70 71 72

def show():
    if istaged:
73 74 75 76 77
        print('full_version:', full_version)
        print('major:', major)
        print('minor:', minor)
        print('patch:', patch)
        print('rc:', rc)
Y
Yancey 已提交
78
    else:
79
        print('commit:', commit)
L
Luo Tao 已提交
80 81 82

def mkl():
    return with_mkl
Y
Yancey 已提交
83 84 85 86
'''
    commit = git_commit()
    with open(filename, 'w') as f:
        f.write(cnt % {
87 88 89
            'major': get_major(),
            'minor': get_minor(),
            'patch': get_patch(),
Y
Yancey 已提交
90 91 92
            'rc': RC,
            'version': '${PADDLE_VERSION}',
            'commit': commit,
93
            'istaged': is_taged(),
L
Luo Tao 已提交
94
            'with_mkl': '@WITH_MKL@'})
Y
Yancey 已提交
95

96
write_version_py(filename='@PADDLE_BINARY_DIR@/python/paddle/version.py')
Y
Yancey 已提交
97 98


Z
zhangjinchao01 已提交
99
packages=['paddle',
100
          'paddle.libs',
Q
qiaolongfei 已提交
101
          'paddle.utils',
102 103
          'paddle.dataset',
          'paddle.reader',
104
          'paddle.distributed',
105
          'paddle.fluid',
L
lujun 已提交
106
          'paddle.fluid.dygraph',
107
          'paddle.fluid.proto',
X
Xin Pan 已提交
108
          'paddle.fluid.proto.profiler',
H
heqiaozhi 已提交
109
          'paddle.fluid.distributed',
Y
Yancey 已提交
110
          'paddle.fluid.layers',
Q
Qingsheng Li 已提交
111 112
          'paddle.fluid.contrib',
          'paddle.fluid.contrib.decoder',
D
Dang Qingqing 已提交
113
          'paddle.fluid.contrib.quantize',
Q
Qiao Longfei 已提交
114
          'paddle.fluid.contrib.reader',
W
whs 已提交
115 116 117 118
          'paddle.fluid.contrib.slim',
          'paddle.fluid.contrib.slim.core',
          'paddle.fluid.contrib.slim.graph',
          'paddle.fluid.contrib.slim.prune',
W
WangZhen 已提交
119
          'paddle.fluid.contrib.slim.quantization',
120
          'paddle.fluid.contrib.slim.distillation',
W
whs 已提交
121 122
          'paddle.fluid.contrib.slim.nas',
          'paddle.fluid.contrib.slim.searcher',
T
tangwei12 已提交
123
          'paddle.fluid.contrib.utils',
C
chengduo 已提交
124
          'paddle.fluid.contrib.extend_optimizer',
125
          'paddle.fluid.contrib.mixed_precision',
126
          'paddle.fluid.contrib.layers',
Q
qiaolongfei 已提交
127
          'paddle.fluid.transpiler',
D
dongdaxiang 已提交
128 129
          'paddle.fluid.transpiler.details',
          'paddle.fluid.incubate',
130
          'paddle.fluid.incubate.data_generator',
D
dongdaxiang 已提交
131 132 133
          'paddle.fluid.incubate.fleet',
          'paddle.fluid.incubate.fleet.base',
          'paddle.fluid.incubate.fleet.parameter_server',
T
tangwei12 已提交
134
          'paddle.fluid.incubate.fleet.parameter_server.distribute_transpiler',
135
          'paddle.fluid.incubate.fleet.parameter_server.pslib',
136 137
          'paddle.fluid.incubate.fleet.collective',
          'paddle.fluid.incubate.fleet.utils']
L
Luo Tao 已提交
138

139 140
with open('@PADDLE_SOURCE_DIR@/python/requirements.txt') as f:
    setup_requires = f.read().splitlines()
141 142

if '${CMAKE_SYSTEM_PROCESSOR}' not in ['arm', 'armv7-a', 'aarch64']:
Y
Yancey 已提交
143
    setup_requires+=['opencv-python']
144

145
# the prefix is sys.prefix which should always be usr
L
Luo Tao 已提交
146
paddle_bins = ''
T
Tao Luo 已提交
147 148
if not '${WIN32}':
    paddle_bins = ['${PADDLE_BINARY_DIR}/paddle/scripts/paddle']
149
package_data={'paddle.fluid': ['${FLUID_CORE_NAME}' + ('.so' if os.name != 'nt' else '.pyd')]}
150
if '${HAS_NOAVX_CORE}' == 'ON':
151
    package_data['paddle.fluid'] += ['core_noavx' + ('.so' if os.name != 'nt' else '.pyd')]
P
peizhilin 已提交
152

L
Luo Tao 已提交
153
package_dir={
154
    '': '${PADDLE_BINARY_DIR}/python',
L
Luo Tao 已提交
155 156 157 158
    # The paddle.fluid.proto will be generated while compiling.
    # So that package points to other directory.
    'paddle.fluid.proto.profiler': '${PADDLE_BINARY_DIR}/paddle/fluid/platform',
    'paddle.fluid.proto': '${PADDLE_BINARY_DIR}/paddle/fluid/framework',
Q
qiaolongfei 已提交
159
    'paddle.fluid': '${PADDLE_BINARY_DIR}/python/paddle/fluid',
L
Luo Tao 已提交
160
}
161

162 163
# put all thirdparty libraries in paddle.libs
libs_path='${PADDLE_BINARY_DIR}/python/paddle/libs'
P
peizhilin 已提交
164

P
peizhilin 已提交
165
package_data['paddle.libs']= []
P
peizhilin 已提交
166
package_data['paddle.libs']=[('libwarpctc' if os.name != 'nt' else 'warpctc') + ext_name]
P
peizhilin 已提交
167
shutil.copy('${WARPCTC_LIBRARIES}', libs_path)
P
peizhilin 已提交
168

169
if '${WITH_MKL}' == 'ON':
P
peizhilin 已提交
170 171 172
    shutil.copy('${MKLML_SHARED_LIB}', libs_path)
    shutil.copy('${MKLML_SHARED_IOMP_LIB}', libs_path)
    package_data['paddle.libs']+=[('libmklml_intel' if os.name != 'nt' else 'mklml') + ext_name, ('libiomp5' if os.name != 'nt' else 'libiomp5md') + ext_name]
173 174 175 176
    # mklml has dependency to vs runtime library
    if os.name == 'nt':
        shutil.copy('${MKLML_SHARED_LIB_DEPS}', libs_path)
        package_data['paddle.libs'] += ['msvcr120.dll']
P
peizhilin 已提交
177 178
else:
    if os.name == 'nt':
P
peizhilin 已提交
179 180
        # copy the openblas.dll
        shutil.copy(os.path.dirname('${CBLAS_LIBRARIES}') + '/openblas' + ext_name, libs_path)
P
peizhilin 已提交
181
        package_data['paddle.libs'] += ['openblas' + ext_name]
P
peizhilin 已提交
182

S
Sang Ik Lee 已提交
183
if '${WITH_MKLDNN}' == 'ON':
P
peizhilin 已提交
184
    if '${CMAKE_BUILD_TYPE}' == 'Release' and os.name != 'nt':
P
peizhilin 已提交
185 186 187 188 189 190 191 192 193 194
        # only change rpath in Release mode.
        # TODO(typhoonzero): use install_name_tool to patch mkl libs once
        # we can support mkl on mac.
        #
        # change rpath of libmkldnn.so.0, add $ORIGIN/ to it.
        # The reason is that all thirdparty libraries in the same directory,
        # thus, libmkldnn.so.0 will find libmklml_intel.so and libiomp5.so.
        command = "patchelf --set-rpath '$ORIGIN/' ${MKLDNN_SHARED_LIB}"
        if os.system(command) != 0:
            raise Exception("patch libmkldnn.so failed, command: %s" % command)
P
peizhilin 已提交
195
    package_data['paddle.libs']+=['libmkldnn.so.0' if os.name != 'nt' else ('mkldnn' + ext_name)]
S
Sang Ik Lee 已提交
196
    shutil.copy('${MKLDNN_SHARED_LIB}', libs_path)
S
Sang Ik Lee 已提交
197
if '${WITH_NGRAPH}' == 'ON':
S
Sang Ik Lee 已提交
198 199
    # only change rpath in Release mode,
    # since in Debug mode, nGraph lib may be too large to be changed?
S
Sang Ik Lee 已提交
200
    if '${CMAKE_BUILD_TYPE}' == 'Release':
S
Sang Ik Lee 已提交
201 202 203 204 205 206 207
        if os.name != 'nt':
            if "@APPLE@" == "1":
                command = "install_name_tool -id \"@loader_path/\" ${NGRAPH_SHARED_LIB}"
            else:
                command = "patchelf --set-rpath '$ORIGIN/' ${NGRAPH_SHARED_LIB}"
            if os.system(command) != 0:
                raise Exception("patch ${NGRAPH_SHARED_LIB_NAME} failed, command: %s" % command)
S
Sang Ik Lee 已提交
208 209 210 211 212 213
    shutil.copy('${NGRAPH_SHARED_LIB}', libs_path)
    shutil.copy('${NGRAPH_CPU_LIB}', libs_path)
    shutil.copy('${NGRAPH_TBB_LIB}', libs_path)
    package_data['paddle.libs']+=['${NGRAPH_SHARED_LIB_NAME}',
                                  '${NGRAPH_CPU_LIB_NAME}',
                                  '${NGRAPH_TBB_LIB_NAME}']
214
# remove unused paddle/libs/__init__.py
P
peizhilin 已提交
215 216
if os.path.isfile(libs_path+'/__init__.py'):
    os.remove(libs_path+'/__init__.py')
217 218
package_dir['paddle.libs']=libs_path

219
# change rpath of ${FLUID_CORE_NAME}.ext, add $ORIGIN/../libs/ to it.
220
# The reason is that libwarpctc.ext, libiomp5.ext etc are in paddle.libs, and
221
# ${FLUID_CORE_NAME}.ext is in paddle.fluid, thus paddle/fluid/../libs will pointer to above libraries.
222
# This operation will fix https://github.com/PaddlePaddle/Paddle/issues/3213
L
luotao1 已提交
223
if '${CMAKE_BUILD_TYPE}' == 'Release':
P
peizhilin 已提交
224
    if os.name != 'nt':
225
        # only change rpath in Release mode, since in Debug mode, ${FLUID_CORE_NAME}.xx is too large to be changed.
L
luotao1 已提交
226
        if "@APPLE@" == "1":
227
            command = "install_name_tool -id \"@loader_path/../libs/\" ${PADDLE_BINARY_DIR}/python/paddle/fluid/${FLUID_CORE_NAME}" + '.so'
L
luotao1 已提交
228
        else:
229
            command = "patchelf --set-rpath '$ORIGIN/../libs/' ${PADDLE_BINARY_DIR}/python/paddle/fluid/${FLUID_CORE_NAME}" + '.so'
L
luotao1 已提交
230
        if os.system(command) != 0:
231
            raise Exception("patch ${FLUID_CORE_NAME}.%s failed, command: %s" % (ext_name, command))
P
peizhilin 已提交
232

P
peizhilin 已提交
233
ext_modules = [Extension('_foo', ['stub.cc'])]
P
peizhilin 已提交
234 235 236 237 238 239
if os.name == 'nt':
    # fix the path separator under windows
    fix_package_dir = {}
    for k, v in package_dir.items():
        fix_package_dir[k] = v.replace('/', '\\')
    package_dir = fix_package_dir
P
peizhilin 已提交
240
    ext_modules = []
241 242
elif sys.platform == 'darwin':
    ext_modules = []
T
tensor-tang 已提交
243

T
typhoonzero 已提交
244
setup(name='${PACKAGE_NAME}',
Z
zhangjinchao01 已提交
245 246
      version='${PADDLE_VERSION}',
      description='Parallel Distributed Deep Learning',
247
      install_requires=setup_requires,
L
Luo Tao 已提交
248
      packages=packages,
P
peizhilin 已提交
249
      ext_modules=ext_modules,
L
Luo Tao 已提交
250 251
      package_data=package_data,
      package_dir=package_dir,
P
peizhilin 已提交
252 253
      scripts=paddle_bins,
      distclass=BinaryDistribution
Z
zhangjinchao01 已提交
254
)