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 @ 9e72b7b6

History | View | Annotate | Download (11.1 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_true",
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 (default is true on supported systems)")
112

    
113
parser.add_option("--without-dtrace",
114
    action="store_true",
115
    dest="without_dtrace",
116
    help="Build without DTrace")
117

    
118
parser.add_option("--with-etw",
119
    action="store_true",
120
    dest="with_etw",
121
    help="Build with ETW (default is true on Windows)")
122

    
123
parser.add_option("--without-etw",
124
    action="store_true",
125
    dest="without_etw",
126
    help="Build without ETW")
127

    
128
# CHECKME does this still work with recent releases of V8?
129
parser.add_option("--gdb",
130
    action="store_true",
131
    dest="gdb",
132
    help="add gdb support")
133

    
134
parser.add_option("--dest-cpu",
135
    action="store",
136
    dest="dest_cpu",
137
    help="CPU architecture to build for. Valid values are: arm, ia32, x64")
138

    
139
parser.add_option("--no-ifaddrs",
140
    action="store_true",
141
    dest="no_ifaddrs",
142
    help="Use on deprecated SunOS systems that do not support ifaddrs.h")
143

    
144
(options, args) = parser.parse_args()
145

    
146

    
147
def b(value):
148
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
149
  if value:
150
    return 'true'
151
  else:
152
    return 'false'
153

    
154

    
155
def pkg_config(pkg):
156
  cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
157
  libs = cmd.readline().strip()
158
  ret = cmd.close()
159
  if (ret): return None
160

    
161
  cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
162
  cflags = cmd.readline().strip()
163
  ret = cmd.close()
164
  if (ret): return None
165

    
166
  return (libs, cflags)
167

    
168

    
169
def host_arch_cc():
170
  """Host architecture check using the CC command."""
171

    
172
  try:
173
    p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
174
                         stdin=subprocess.PIPE,
175
                         stdout=subprocess.PIPE,
176
                         stderr=subprocess.PIPE)
177
  except OSError:
178
    print '''Node.js configure error: No acceptable C compiler found!
179

    
180
        Please make sure you have a C compiler installed on your system and/or
181
        consider adjusting the CC environment variable if you installed
182
        it in a non-standard prefix.
183
        '''
184
    sys.exit()
185

    
186
  p.stdin.write('\n')
187
  out = p.communicate()[0]
188

    
189
  out = str(out).split('\n')
190

    
191
  k = {}
192
  for line in out:
193
    import shlex
194
    lst = shlex.split(line)
195
    if len(lst) > 2:
196
      key = lst[1]
197
      val = lst[2]
198
      k[key] = val
199

    
200
  matchup = {
201
    '__x86_64__'  : 'x64',
202
    '__i386__'    : 'ia32',
203
    '__arm__'     : 'arm',
204
  }
205

    
206
  rtn = 'ia32' # default
207

    
208
  for i in matchup:
209
    if i in k and k[i] != '0':
210
      rtn = matchup[i]
211
      break
212

    
213
  return rtn
214

    
215

    
216
def host_arch_win():
217
  """Host architecture check using environ vars (better way to do this?)"""
218

    
219
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
220

    
221
  matchup = {
222
    'AMD64'  : 'x64',
223
    'x86'    : 'ia32',
224
    'arm'    : 'arm',
225
  }
226

    
227
  return matchup.get(arch, 'ia32')
228

    
229

    
230
def host_arch():
231
  """Host architecture. One of arm, ia32 or x64."""
232
  if os.name == 'nt':
233
    arch = host_arch_win()
234
  else:
235
    arch = host_arch_cc()
236
  return arch
237

    
238

    
239
def target_arch():
240
  return host_arch()
241

    
242
def compiler_version():
243
  try:
244
    proc = subprocess.Popen(CC.split() + ['-v'], stderr=subprocess.PIPE)
245
  except OSError:
246
    return (False, False, None)
247
  lines = proc.communicate()[1].split('\n')
248
  version_line = None
249
  for i, line in enumerate(lines):
250
    if 'version' in line:
251
      version_line = line
252
  if not version_line:
253
    return (False, False, None)
254
  version = version_line.split("version")[1].strip().split()[0].split(".")
255
  if not version:
256
    return (False, False, None)
257
  return ('LLVM' in version_line, 'clang' in CC, tuple(version))
258

    
259
def configure_node(o):
260
  # TODO add gdb
261
  o['variables']['node_prefix'] = os.path.expanduser(options.prefix or '')
262
  o['variables']['node_install_npm'] = b(not options.without_npm)
263
  o['variables']['node_install_waf'] = b(not options.without_waf)
264
  o['variables']['host_arch'] = host_arch()
265
  o['variables']['target_arch'] = options.dest_cpu or target_arch()
266
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
267

    
268
  is_llvm, is_clang, cc_version = compiler_version()
269

    
270
  # turn off strict aliasing if gcc < 4.6.0 unless it's llvm-gcc
271
  # see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45883
272
  # see http://code.google.com/p/v8/issues/detail?id=884
273
  o['variables']['strict_aliasing'] = b(is_clang or cc_version >= (4,6,0))
274

    
275
  # disable strict aliasing in V8 if we're compiling with gcc 4.5.x,
276
  # it makes V8 crash in various ways
277
  o['variables']['v8_no_strict_aliasing'] = b(
278
    not is_clang and (4,5,0) <= cc_version < (4,6,0))
279

    
280
  # clang has always supported -fvisibility=hidden, right?
281
  if not is_clang and cc_version < (4,0,0):
282
    o['variables']['visibility'] = ''
283

    
284
  # By default, enable DTrace on SunOS systems. Don't allow it on other
285
  # systems, since it won't work.  (The MacOS build process is different than
286
  # SunOS, and we haven't implemented it.)
287
  if sys.platform.startswith('sunos'):
288
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
289
    # Strict aliasing causes problems with the V8 snapshots on SunOS
290
    o['variables']['strict_aliasing'] = b(False);
291
  elif b(options.with_dtrace) == 'true':
292
    raise Exception('DTrace is currently only supported on SunOS systems.')
293
  else:
294
    o['variables']['node_use_dtrace'] = 'false'
295

    
296

    
297
  # By default, enable ETW on Windows.
298
  if sys.platform.startswith('win32'):
299
    o['variables']['node_use_etw'] = b(not options.without_etw);
300
  elif b(options.with_etw) == 'true':
301
    raise Exception('ETW is only supported on Windows.')
302
  else:
303
    o['variables']['node_use_etw'] = 'false'
304

    
305

    
306
def configure_libz(o):
307
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
308

    
309
  # assume shared_zlib if one of these is set?
310
  if options.shared_zlib_libpath:
311
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
312
  if options.shared_zlib_libname:
313
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
314
  elif options.shared_zlib:
315
    o['libraries'] += ['-lz']
316
  if options.shared_zlib_includes:
317
    o['include_dirs'] += [options.shared_zlib_includes]
318

    
319

    
320
def configure_v8(o):
321
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
322
  o['variables']['node_shared_v8'] = b(options.shared_v8)
323

    
324
  # assume shared_v8 if one of these is set?
325
  if options.shared_v8_libpath:
326
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
327
  if options.shared_v8_libname:
328
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
329
  elif options.shared_v8:
330
    o['libraries'] += ['-lv8']
331
  if options.shared_v8_includes:
332
    o['include_dirs'] += [options.shared_v8_includes]
333

    
334

    
335
def configure_openssl(o):
336
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
337

    
338
  if options.without_ssl:
339
    return
340

    
341
  if options.no_ifaddrs:
342
    o['defines'] += ['SUNOS_NO_IFADDRS']
343

    
344
  if options.no_ssl2:
345
    o['defines'] += ['OPENSSL_NO_SSL2=1']
346

    
347
  if not options.openssl_use_sys:
348
    o['variables']['node_shared_openssl'] = b(False)
349
  else:
350
    out = pkg_config('openssl')
351
    (libs, cflags) = out if out else ('', '')
352

    
353
    if options.openssl_libpath:
354
      o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
355
    else:
356
      o['libraries'] += libs.split()
357

    
358
    if options.openssl_includes:
359
      o['include_dirs'] += [options.openssl_includes]
360
    else:
361
      o['cflags'] += cflags.split()
362

    
363
    o['variables']['node_shared_openssl'] = b(
364
      libs or cflags or options.openssl_libpath or options.openssl_includes)
365

    
366

    
367
output = {
368
  'variables': {},
369
  'include_dirs': [],
370
  'libraries': [],
371
  'defines': [],
372
  'cflags': [],
373
}
374

    
375
configure_node(output)
376
configure_libz(output)
377
configure_v8(output)
378
configure_openssl(output)
379

    
380
# variables should be a root level element,
381
# move everything else to target_defaults
382
variables = output['variables']
383
del output['variables']
384
output = {
385
  'variables': variables,
386
  'target_defaults': output
387
}
388
pprint.pprint(output, indent=2)
389

    
390
def write(filename, data):
391
  filename = os.path.join(root_dir, filename)
392
  print "creating ", filename
393
  f = open(filename, 'w+')
394
  f.write(data)
395

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

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

    
402
if os.name == 'nt':
403
  subprocess.call(['python', 'tools/gyp_node', '-f', 'msvs',
404
                                               '-G', 'msvs_version=2010'])
405
else:
406
  subprocess.call(['tools/gyp_node', '-f', 'make'])