setup.py.in 6.1 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 7 8
class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True
Z
zhangjinchao01 已提交
9

Y
Yancey 已提交
10 11 12 13 14 15 16 17 18 19 20 21
RC      = 0



def git_commit():
    try:
        cmd = ['git', 'rev-parse', 'HEAD']
        git_commit = subprocess.Popen(cmd, stdout = subprocess.PIPE).communicate()[0].strip()
    except:
        git_commit = 'Unknown'
    return git_commit

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

M
minqiyang 已提交
26 27
    if re.match('@TAG_VERSION_REGEX@', '@PADDLE_VERSION@'):
        version_details = '@PADDLE_VERSION@'.split('.')
28

M
minqiyang 已提交
29 30
        if len(version_details) == 3:
            return version_details[idx]
31

32
    return 0
33

M
minqiyang 已提交
34
def get_major():
35
    return int(_get_version_detail(0))
36

M
minqiyang 已提交
37
def get_minor():
38
    return int(_get_version_detail(1))
39

40
def get_patch():
41
    return str(_get_version_detail(2))
42 43

def is_taged():
M
minqiyang 已提交
44
    try:
45 46
        cmd = ['git', 'describe', '--exact-match', '--tags']
        git_tag = subprocess.Popen(cmd, stdout = subprocess.PIPE).communicate()[0].strip()
M
minqiyang 已提交
47
    except:
48 49 50 51 52
        return False

    if git_tag.replace('v', '') == '@PADDLE_VERSION@':
        return True
    else:
M
minqiyang 已提交
53
        return False
54

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

def show():
    if istaged:
        print 'full_version:', full_version
        print 'major:', major
        print 'minor:', minor
        print 'patch:', patch
        print 'rc:', rc
    else:
        print 'commit:', commit
L
Luo Tao 已提交
77 78 79

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

93
write_version_py(filename='@PADDLE_BINARY_DIR@/python/paddle/version.py')
Y
Yancey 已提交
94 95


Z
zhangjinchao01 已提交
96
packages=['paddle',
97
          'paddle.libs',
Q
qiaolongfei 已提交
98
          'paddle.utils',
99 100
          'paddle.dataset',
          'paddle.reader',
101 102
          'paddle.fluid',
          'paddle.fluid.proto',
X
Xin Pan 已提交
103
          'paddle.fluid.proto.profiler',
Y
Yancey 已提交
104
          'paddle.fluid.layers',
Q
qiaolongfei 已提交
105 106
          'paddle.fluid.transpiler',
          'paddle.fluid.transpiler.details']
L
Luo Tao 已提交
107

108
if '${WITH_FLUID_ONLY}'== 'OFF':
L
Luo Tao 已提交
109 110 111 112 113 114
    packages+=['paddle.proto',
               'paddle.trainer',
               'paddle.trainer_config_helpers',
               'paddle.v2',
               'paddle.v2.master',
               'paddle.v2.plot',
115 116
               'paddle.v2.reader',
               'paddle.v2.dataset',
L
Luo Tao 已提交
117
               'py_paddle']
Z
zhangjinchao01 已提交
118

119 120
with open('@PADDLE_SOURCE_DIR@/python/requirements.txt') as f:
    setup_requires = f.read().splitlines()
121 122

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

125
# the prefix is sys.prefix which should always be usr
L
Luo Tao 已提交
126
paddle_bins = ''
127
if '${WITH_FLUID_ONLY}'== 'OFF':
L
Luo Tao 已提交
128
    paddle_bin_dir = 'opt/paddle/bin'
X
Xin Pan 已提交
129 130
    paddle_bins = ['${PADDLE_BINARY_DIR}/paddle/legacy/trainer/paddle_trainer',
                   '${PADDLE_BINARY_DIR}/paddle/legacy/trainer/paddle_merge_model',
X
Xin Pan 已提交
131
                   '${PADDLE_BINARY_DIR}/paddle/legacy/pserver/paddle_pserver_main',
L
Luo Tao 已提交
132 133 134
                   '${PADDLE_BINARY_DIR}/paddle/scripts/paddle']

package_data={'paddle.fluid': ['core.so']}
135
if '${WITH_FLUID_ONLY}'== 'OFF':
L
Luo Tao 已提交
136 137 138 139
    package_data['paddle.v2.master']=['libpaddle_master.so']
    package_data['py_paddle']=['*.py','_swig_paddle.so']

package_dir={
140
    '': '${PADDLE_BINARY_DIR}/python',
L
Luo Tao 已提交
141 142 143 144
    # 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 已提交
145
    'paddle.fluid': '${PADDLE_BINARY_DIR}/python/paddle/fluid',
L
Luo Tao 已提交
146
}
147
if '${WITH_FLUID_ONLY}'== 'OFF':
148
    package_dir['py_paddle']='${PADDLE_BINARY_DIR}/python/py_paddle'
149

150 151 152 153 154 155 156 157 158 159 160 161 162
# put all thirdparty libraries in paddle.libs
package_data['paddle.libs']=['libwarpctc.so']
libs_path='${PADDLE_BINARY_DIR}/python/paddle/libs'
shutil.copy('${WARPCTC_LIBRARIES}', libs_path)
if '${WITH_MKL}' == 'ON':
    shutil.copy('${MKLML_LIB}', libs_path)
    shutil.copy('${MKLML_IOMP_LIB}', libs_path)
    package_data['paddle.libs']+=['libmklml_intel.so','libiomp5.so']
if '${WITH_MKLDNN}' == 'ON':
    # 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}"
163 164
    if os.system(command) != 0:
        raise Exception("patchelf --set-rpath for libmkldnn.so.0 fails")
165 166 167 168 169 170 171 172 173 174 175
    package_data['paddle.libs']+=['libmkldnn.so.0']
    shutil.copy('${MKLDNN_SHARED_LIB}', libs_path)
# remove unused paddle/libs/__init__.py
os.remove(libs_path+'/__init__.py')
package_dir['paddle.libs']=libs_path

# change rpath of core.so, add $ORIGIN/../libs/ to it.
# The reason is that libwarpctc.so, libiomp5.so etc are in paddle.libs, and
# core.so is in paddle.fluid, thus paddle/fluid/../libs will pointer to above libraries.
# This operation will fix https://github.com/PaddlePaddle/Paddle/issues/3213
command = "patchelf --set-rpath '$ORIGIN/../libs/' ${PADDLE_BINARY_DIR}/python/paddle/fluid/core.so"
176 177
if os.system(command) != 0:
    raise Exception("patchelf --set-rpath for core.so fails")
T
tensor-tang 已提交
178

T
typhoonzero 已提交
179
setup(name='${PACKAGE_NAME}',
Z
zhangjinchao01 已提交
180 181
      version='${PADDLE_VERSION}',
      description='Parallel Distributed Deep Learning',
182
      install_requires=setup_requires,
L
Luo Tao 已提交
183
      packages=packages,
T
typhoonzero 已提交
184
      ext_modules=[Extension('_foo', ['stub.cc'])],
L
Luo Tao 已提交
185 186
      package_data=package_data,
      package_dir=package_dir,
187
      scripts=paddle_bins
Z
zhangjinchao01 已提交
188
)