forked from rhizoome/kyotocabinet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.py
80 lines (65 loc) · 2.19 KB
/
build.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import os
import shutil
from subprocess import PIPE, Popen
from setuptools import Distribution, Extension
from setuptools.command.build_ext import build_ext
def get_cmd_out(cmdargs):
with Popen(cmdargs, stdout=PIPE) as pipe:
return pipe.communicate()[0].decode('utf-8').strip().split()
def get_ext_modules():
include_dirs = []
myincopts = get_cmd_out(['kcutilmgr', 'conf', '-i'])
for incopt in myincopts:
if incopt.startswith('-I'):
incdir = incopt[2:]
include_dirs.append(incdir)
if len(include_dirs) < 1:
include_dirs = ['/usr/local/include']
library_dirs = []
libraries = []
mylibopts = get_cmd_out(['kcutilmgr', 'conf', '-l'])
for libopt in mylibopts:
if libopt.startswith('-L'):
libdir = libopt[2:]
library_dirs.append(libdir)
elif libopt.startswith('-l'):
libname = libopt[2:]
libraries.append(libname)
if len(library_dirs) < 1:
library_dirs = ['/usr/local/lib']
if len(libraries) < 1:
if os.uname()[0] == 'Darwin':
libraries = ['kyotocabinet', 'z', 'stdc++', 'pthread', 'm', 'c']
else:
libraries = ['kyotocabinet', 'z', 'stdc++', 'rt', 'pthread', 'm', 'c']
return [
Extension(
'_kyotocabinet',
include_dirs=include_dirs,
libraries=libraries,
library_dirs=library_dirs,
sources=['kyotocabinet.cc'],
),
]
def build():
distribution = Distribution(
{
'ext_modules': get_ext_modules(),
'name': 'kyotocabinet',
}
)
distribution.package_dir = {'kyotocabinet': 'kyotocabinet'}
cmd = build_ext(distribution)
cmd.ensure_finalized()
cmd.run()
# Copy built extensions back to the project
for output in cmd.get_outputs():
relative_extension = os.path.relpath(output, cmd.build_lib)
if not os.path.exists(output):
continue
shutil.copyfile(output, relative_extension)
mode = os.stat(relative_extension).st_mode
mode |= (mode & 0o444) >> 2
os.chmod(relative_extension, mode)
if __name__ == '__main__':
build()