forked from d5/node.native
-
Notifications
You must be signed in to change notification settings - Fork 35
/
build.py
executable file
·134 lines (109 loc) · 4.58 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python
# source https://github.com/libuv/libuv/blob/master/gyp_uv.py
import glob
import platform
import os
import subprocess
import sys
try:
import multiprocessing.synchronize
gyp_parallel_support = True
except ImportError:
gyp_parallel_support = False
CC = os.environ.get('CC', 'cc')
script_dir = os.path.dirname(__file__)
project_root = os.path.normpath(script_dir)
gyps_dir = os.path.join(project_root, 'build')
output_dir = os.path.join(os.path.abspath(project_root), 'build/out')
root_gyp_lib = os.path.join(project_root, 'build', 'gyp')
if(not os.path.exists(root_gyp_lib)):
try:
print('build/gyp is missing, trying to clone from https://chromium.googlesource.com/external/gyp.git ...')
proc = subprocess.Popen(['git', 'clone', 'https://chromium.googlesource.com/external/gyp.git', root_gyp_lib], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
res = proc.communicate();
if(res[1] and 'error' in res[1]):
print('error when trying to clone build/gyp:' + res[1])
sys.exit(42)
print('build/gyp imported')
except OSError:
print('You need to install gyp in build/gyp first. See the README.')
sys.exit(42)
sys.path.insert(0, os.path.join(root_gyp_lib, 'pylib'))
try:
import gyp
except ImportError:
print('error to import gyp')
exit(42)
def host_arch():
machine = platform.machine()
if machine == 'i386': return 'ia32'
if machine == 'x86_64': return 'x64'
if machine.startswith('arm'): return 'arm'
if machine.startswith('mips'): return 'mips'
return machine # Return as-is and hope for the best.
def compiler_version():
proc = subprocess.Popen(CC.split() + ['--version'], stdout=subprocess.PIPE)
is_clang = 'clang' in proc.communicate()[0].split('\n')[0]
proc = subprocess.Popen(CC.split() + ['-dumpversion'], stdout=subprocess.PIPE)
version = proc.communicate()[0].split('.')
version = map(int, version[:2])
version = tuple(version)
return (version, is_clang)
def run_gyp(args):
rc = gyp.main(args)
if rc != 0:
print 'Error running GYP'
sys.exit(rc)
if __name__ == '__main__':
args = sys.argv[1:]
# GYP bug.
# On msvs it will crash if it gets an absolute path.
# On Mac/make it will crash if it doesn't get an absolute path.
if sys.platform == 'win32':
args.append(os.path.join(gyps_dir, 'all.gyp'))
common_fn = os.path.join(gyps_dir, 'common.gypi')
options_fn = os.path.join(gyps_dir, 'options.gypi')
# we force vs 2013 over others which would otherwise be the default for
# gyp.
# TODO: to decide
if not os.environ.get('GYP_MSVS_VERSION'):
os.environ['GYP_MSVS_VERSION'] = '2015'
else:
args.append(os.path.join(os.path.abspath(gyps_dir), 'all.gyp'))
common_fn = os.path.join(os.path.abspath(gyps_dir), 'common.gypi')
options_fn = os.path.join(os.path.abspath(gyps_dir), 'options.gypi')
if os.path.exists(common_fn):
args.extend(['-I', common_fn])
if os.path.exists(options_fn):
args.extend(['-I', options_fn])
args.append('--depth=' + project_root)
# There's a bug with windows which doesn't allow this feature.
if sys.platform != 'win32':
if '-f' not in args:
args.extend('-f make'.split())
if 'eclipse' not in args and 'ninja' not in args:
args.extend(['-Goutput_dir=' + output_dir])
args.extend(['--generator-output', output_dir])
(major, minor), is_clang = compiler_version()
args.append('-Dgcc_version=%d' % (10 * major + minor))
args.append('-Dclang=%d' % int(is_clang))
if not any(a.startswith('-Dhost_arch=') for a in args):
args.append('-Dhost_arch=%s' % host_arch())
if not any(a.startswith('-Dtarget_arch=') for a in args):
args.append('-Dtarget_arch=%s' % host_arch())
if not any(a.startswith('-Dnative_library=') for a in args):
args.append('-Dnative_library=static_library')
if not any(a.startswith('-Duv_library=') for a in args):
args.append('-Duv_library=static_library')
if not any(a.startswith('-Dlibrary=') for a in args):
args.append('-Dlibrary=static_library')
if not any(a.startswith('-Dcomponent=') for a in args):
args.append('-Dcomponent=static_library')
# Some platforms (OpenBSD for example) don't have
# multiprocessing.synchronize
# so gyp must be run with --no-parallel
if not gyp_parallel_support:
args.append('--no-parallel')
gyp_args = list(args)
print gyp_args
run_gyp(gyp_args)