The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / configure @ 5ebc05f5

History | View | Annotate | Download (8.44 KB)

1
#!/usr/bin/env python
2
import optparse
3
import os
4
import pprint
5
import re
6
import subprocess
7
import sys
8

    
9
CC = os.environ.get('CC', 'cc')
10

    
11
root_dir = os.path.dirname(__file__)
12
sys.path.insert(0, os.path.join(root_dir, 'deps', 'v8', 'tools'))
13

    
14
# parse our options
15
parser = optparse.OptionParser()
16

    
17
parser.add_option("--debug",
18
    action="store_true",
19
    dest="debug",
20
    help="Also build debug build")
21

    
22
parser.add_option("--prefix",
23
    action="store",
24
    dest="prefix",
25
    help="Select the install prefix (defaults to /usr/local)")
26

    
27
parser.add_option("--without-npm",
28
    action="store_true",
29
    dest="without_npm",
30
    help="Don\'t install the bundled npm package manager")
31

    
32
parser.add_option("--without-waf",
33
    action="store_true",
34
    dest="without_waf",
35
    help="Don\'t install node-waf")
36

    
37
parser.add_option("--without-ssl",
38
    action="store_true",
39
    dest="without_ssl",
40
    help="Build without SSL")
41

    
42
parser.add_option("--without-snapshot",
43
    action="store_true",
44
    dest="without_snapshot",
45
    help="Build without snapshotting V8 libraries. You might want to set"
46
         " this for cross-compiling. [Default: False]")
47

    
48
parser.add_option("--shared-v8",
49
    action="store_true",
50
    dest="shared_v8",
51
    help="Link to a shared V8 DLL instead of static linking")
52

    
53
parser.add_option("--shared-v8-includes",
54
    action="store",
55
    dest="shared_v8_includes",
56
    help="Directory containing V8 header files")
57

    
58
parser.add_option("--shared-v8-libpath",
59
    action="store",
60
    dest="shared_v8_libpath",
61
    help="A directory to search for the shared V8 DLL")
62

    
63
parser.add_option("--shared-v8-libname",
64
    action="store",
65
    dest="shared_v8_libname",
66
    help="Alternative lib name to link to (default: 'v8')")
67

    
68
parser.add_option("--openssl-use-sys",
69
    action="store",
70
    dest="openssl_use_sys",
71
    help="Use the system OpenSSL instead of one included with Node")
72

    
73
parser.add_option("--openssl-includes",
74
    action="store",
75
    dest="openssl_includes",
76
    help="A directory to search for the OpenSSL includes")
77

    
78
parser.add_option("--openssl-libpath",
79
    action="store",
80
    dest="openssl_libpath",
81
    help="A directory to search for the OpenSSL libraries")
82

    
83
parser.add_option("--no-ssl2",
84
    action="store_true",
85
    dest="no_ssl2",
86
    help="Disable OpenSSL v2")
87

    
88
parser.add_option("--shared-zlib",
89
    action="store_true",
90
    dest="shared_zlib",
91
    help="Link to a shared zlib DLL instead of static linking")
92

    
93
parser.add_option("--shared-zlib-includes",
94
    action="store",
95
    dest="shared_zlib_includes",
96
    help="Directory containing zlib header files")
97

    
98
parser.add_option("--shared-zlib-libpath",
99
    action="store",
100
    dest="shared_zlib_libpath",
101
    help="A directory to search for the shared zlib DLL")
102

    
103
parser.add_option("--shared-zlib-libname",
104
    action="store",
105
    dest="shared_zlib_libname",
106
    help="Alternative lib name to link to (default: 'z')")
107

    
108
parser.add_option("--with-dtrace",
109
    action="store_true",
110
    dest="with_dtrace",
111
    help="Build with DTrace (experimental)")
112

    
113
# CHECKME does this still work with recent releases of V8?
114
parser.add_option("--gdb",
115
    action="store_true",
116
    dest="gdb",
117
    help="add gdb support")
118

    
119
parser.add_option("--dest-cpu",
120
    action="store",
121
    dest="dest_cpu",
122
    help="CPU architecture to build for. Valid values are: arm, ia32, x64")
123

    
124
(options, args) = parser.parse_args()
125

    
126

    
127
def b(value):
128
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
129
  if value:
130
    return 'true'
131
  else:
132
    return 'false'
133

    
134

    
135
def pkg_config(pkg):
136
  cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
137
  libs = cmd.readline().strip()
138
  ret = cmd.close()
139
  if (ret): return None
140

    
141
  cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
142
  cflags = cmd.readline().strip()
143
  ret = cmd.close()
144
  if (ret): return None
145

    
146
  return (libs, cflags)
147

    
148

    
149
def host_arch():
150
  """Host architecture. One of arm, ia32 or x64."""
151

    
152
  p = subprocess.Popen([CC, '-dM', '-E', '-'],
153
                       stdin=subprocess.PIPE,
154
                       stdout=subprocess.PIPE,
155
                       stderr=subprocess.PIPE)
156
  p.stdin.write('\n')
157
  out = p.communicate()[0]
158

    
159
  out = str(out).split('\n')
160

    
161
  k = {}
162
  for line in out:
163
    import shlex
164
    lst = shlex.split(line)
165
    if len(lst) > 2:
166
      key = lst[1]
167
      val = lst[2]
168
      k[key] = val
169

    
170
  matchup = {
171
    '__x86_64__'  : 'x64',
172
    '__i386__'    : 'ia32',
173
    '__arm__'     : 'arm',
174
  }
175

    
176
  rtn = 'ia32' # default
177

    
178
  for i in matchup:
179
    if i in k and k[i] != '0':
180
      rtn = matchup[i]
181
      break
182

    
183
  return rtn
184

    
185

    
186
def target_arch():
187
  return host_arch()
188

    
189

    
190
def gcc_version():
191
  try:
192
    proc = subprocess.Popen([CC, '-v'], stderr=subprocess.PIPE)
193
  except OSError:
194
    return None
195
  # TODO parse clang output
196
  version = proc.communicate()[1].split('\n')[-2]
197
  match = re.match('gcc version (\d+)\.(\d+)\.(\d+)', version)
198
  if not match: return None
199
  return ['LLVM' in version] + map(int, match.groups())
200

    
201

    
202
def configure_node(o):
203
  # TODO add gdb
204
  o['variables']['node_prefix'] = options.prefix if options.prefix else ''
205
  o['variables']['node_use_dtrace'] = b(options.with_dtrace)
206
  o['variables']['node_install_npm'] = b(not options.without_npm)
207
  o['variables']['node_install_waf'] = b(not options.without_waf)
208
  o['variables']['host_arch'] = host_arch()
209
  o['variables']['target_arch'] = options.dest_cpu or target_arch()
210
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
211

    
212
  # turn off strict aliasing if gcc < 4.6.0 unless it's llvm-gcc
213
  # see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45883
214
  # see http://code.google.com/p/v8/issues/detail?id=884
215
  o['variables']['strict_aliasing'] = b(
216
    'clang' in CC or gcc_version() >= [False, 4, 6, 0])
217

    
218
  # clang has always supported -fvisibility=hidden, right?
219
  if 'clang' not in CC and gcc_version() < [False, 4, 0, 0]:
220
    o['variables']['visibility'] = ''
221

    
222

    
223
def configure_libz(o):
224
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
225

    
226
  # assume shared_zlib if one of these is set?
227
  if options.shared_zlib_libpath:
228
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
229
  if options.shared_zlib_libname:
230
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
231
  elif options.shared_zlib:
232
    o['libraries'] += ['-lz']
233
  if options.shared_zlib_includes:
234
    o['include_dirs'] += [options.shared_zlib_includes]
235

    
236

    
237
def configure_v8(o):
238
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
239
  o['variables']['node_shared_v8'] = b(options.shared_v8)
240

    
241
  # assume shared_v8 if one of these is set?
242
  if options.shared_v8_libpath:
243
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
244
  if options.shared_v8_libname:
245
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
246
  elif options.shared_v8:
247
    o['libraries'] += ['-lv8']
248
  if options.shared_v8_includes:
249
    o['include_dirs'] += [options.shared_v8_includes]
250
    o['variables']['node_shared_v8_includes'] = options.shared_v8_includes
251

    
252

    
253
def configure_openssl(o):
254
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
255

    
256
  if options.without_ssl:
257
    return
258

    
259
  if options.no_ssl2:
260
    o['defines'] += ['OPENSSL_NO_SSL2=1']
261

    
262
  if not options.openssl_use_sys:
263
    o['variables']['node_use_system_openssl'] = b(False)
264
  else:
265
    out = pkg_config('openssl')
266
    (libs, cflags) = out if out else ('', '')
267

    
268
    if options.openssl_libpath:
269
      o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
270
    else:
271
      o['libraries'] += libs.split()
272

    
273
    if options.openssl_includes:
274
      o['include_dirs'] += [options.openssl_includes]
275
    else:
276
      o['cflags'] += cflags.split()
277

    
278
    o['variables']['node_use_system_openssl'] = b(
279
      libs or cflags or options.openssl_libpath or options.openssl_includes)
280

    
281

    
282
output = {
283
  'variables': {},
284
  'include_dirs': [],
285
  'libraries': [],
286
  'defines': [],
287
  'cflags': [],
288
}
289

    
290
configure_node(output)
291
configure_libz(output)
292
configure_v8(output)
293
configure_openssl(output)
294

    
295
# variables should be a root level element,
296
# move everything else to target_defaults
297
variables = output['variables']
298
del output['variables']
299
output = {
300
  'variables': variables,
301
  'target_defaults': output
302
}
303
pprint.pprint(output, indent=2)
304

    
305
def write(filename, data):
306
  filename = os.path.join(root_dir, filename)
307
  print "creating ", filename
308
  with open(filename, 'w+') as f:
309
    f.write(data)
310

    
311
write('config.gypi', "# Do not edit. Generated by the configure script.\n" +
312
  pprint.pformat(output, indent=2))
313

    
314
write('config.mk', "# Do not edit. Generated by the configure script.\n" +
315
  ("BUILDTYPE=%s\n" % ('Debug' if options.debug else 'Release')))
316

    
317
subprocess.call(['tools/gyp_node','-f', 'make'])