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 @ 841b7f53

History | View | Annotate | Download (19.3 KB)

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

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

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

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

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

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

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

    
33
parser.add_option("--without-ssl",
34
    action="store_true",
35
    dest="without_ssl",
36
    help="Build without SSL")
37

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

    
44
parser.add_option("--shared-v8",
45
    action="store_true",
46
    dest="shared_v8",
47
    help="Link to a shared V8 DLL instead of static linking")
48

    
49
parser.add_option("--shared-v8-includes",
50
    action="store",
51
    dest="shared_v8_includes",
52
    help="Directory containing V8 header files")
53

    
54
parser.add_option("--shared-v8-libpath",
55
    action="store",
56
    dest="shared_v8_libpath",
57
    help="A directory to search for the shared V8 DLL")
58

    
59
parser.add_option("--shared-v8-libname",
60
    action="store",
61
    dest="shared_v8_libname",
62
    help="Alternative lib name to link to (default: 'v8')")
63

    
64
parser.add_option("--shared-openssl",
65
    action="store_true",
66
    dest="shared_openssl",
67
    help="Link to a shared OpenSSl DLL instead of static linking")
68

    
69
parser.add_option("--shared-openssl-includes",
70
    action="store",
71
    dest="shared_openssl_includes",
72
    help="Directory containing OpenSSL header files")
73

    
74
parser.add_option("--shared-openssl-libpath",
75
    action="store",
76
    dest="shared_openssl_libpath",
77
    help="A directory to search for the shared OpenSSL DLLs")
78

    
79
parser.add_option("--shared-openssl-libname",
80
    action="store",
81
    dest="shared_openssl_libname",
82
    help="Alternative lib name to link to (default: 'crypto,ssl')")
83

    
84
# deprecated
85
parser.add_option("--openssl-use-sys",
86
    action="store_true",
87
    dest="shared_openssl",
88
    help=optparse.SUPPRESS_HELP)
89

    
90
# deprecated
91
parser.add_option("--openssl-includes",
92
    action="store",
93
    dest="shared_openssl_includes",
94
    help=optparse.SUPPRESS_HELP)
95

    
96
# deprecated
97
parser.add_option("--openssl-libpath",
98
    action="store",
99
    dest="shared_openssl_libpath",
100
    help=optparse.SUPPRESS_HELP)
101

    
102
# TODO document when we've decided on what the tracing API and its options will
103
# look like
104
parser.add_option("--systemtap-includes",
105
    action="store",
106
    dest="systemtap_includes",
107
    help=optparse.SUPPRESS_HELP)
108

    
109
parser.add_option("--no-ssl2",
110
    action="store_true",
111
    dest="no_ssl2",
112
    help="Disable OpenSSL v2")
113

    
114
parser.add_option("--shared-zlib",
115
    action="store_true",
116
    dest="shared_zlib",
117
    help="Link to a shared zlib DLL instead of static linking")
118

    
119
parser.add_option("--shared-zlib-includes",
120
    action="store",
121
    dest="shared_zlib_includes",
122
    help="Directory containing zlib header files")
123

    
124
parser.add_option("--shared-zlib-libpath",
125
    action="store",
126
    dest="shared_zlib_libpath",
127
    help="A directory to search for the shared zlib DLL")
128

    
129
parser.add_option("--shared-zlib-libname",
130
    action="store",
131
    dest="shared_zlib_libname",
132
    help="Alternative lib name to link to (default: 'z')")
133

    
134
parser.add_option("--shared-http-parser",
135
    action="store_true",
136
    dest="shared_http_parser",
137
    help="Link to a shared http_parser DLL instead of static linking")
138

    
139
parser.add_option("--shared-http-parser-includes",
140
    action="store",
141
    dest="shared_http_parser_includes",
142
    help="Directory containing http_parser header files")
143

    
144
parser.add_option("--shared-http-parser-libpath",
145
    action="store",
146
    dest="shared_http_parser_libpath",
147
    help="A directory to search for the shared http_parser DLL")
148

    
149
parser.add_option("--shared-http-parser-libname",
150
    action="store",
151
    dest="shared_http_parser_libname",
152
    help="Alternative lib name to link to (default: 'http_parser')")
153

    
154
parser.add_option("--shared-cares",
155
    action="store_true",
156
    dest="shared_cares",
157
    help="Link to a shared cares DLL instead of static linking")
158

    
159
parser.add_option("--shared-cares-includes",
160
    action="store",
161
    dest="shared_cares_includes",
162
    help="Directory containing cares header files")
163

    
164
parser.add_option("--shared-cares-libpath",
165
    action="store",
166
    dest="shared_cares_libpath",
167
    help="A directory to search for the shared cares DLL")
168

    
169
parser.add_option("--shared-cares-libname",
170
    action="store",
171
    dest="shared_cares_libname",
172
    help="Alternative lib name to link to (default: 'cares')")
173

    
174
parser.add_option("--shared-libuv",
175
    action="store_true",
176
    dest="shared_libuv",
177
    help="Link to a shared libuv DLL instead of static linking")
178

    
179
parser.add_option("--shared-libuv-includes",
180
    action="store",
181
    dest="shared_libuv_includes",
182
    help="Directory containing libuv header files")
183

    
184
parser.add_option("--shared-libuv-libpath",
185
    action="store",
186
    dest="shared_libuv_libpath",
187
    help="A directory to search for the shared libuv DLL")
188

    
189
parser.add_option("--shared-libuv-libname",
190
    action="store",
191
    dest="shared_libuv_libname",
192
    help="Alternative lib name to link to (default: 'uv')")
193

    
194
parser.add_option("--with-dtrace",
195
    action="store_true",
196
    dest="with_dtrace",
197
    help="Build with DTrace (default is true on sunos)")
198

    
199
parser.add_option("--without-dtrace",
200
    action="store_true",
201
    dest="without_dtrace",
202
    help="Build without DTrace")
203

    
204
parser.add_option("--with-etw",
205
    action="store_true",
206
    dest="with_etw",
207
    help="Build with ETW (default is true on Windows)")
208

    
209
parser.add_option("--without-etw",
210
    action="store_true",
211
    dest="without_etw",
212
    help="Build without ETW")
213

    
214
parser.add_option("--with-perfctr",
215
    action="store_true",
216
    dest="with_perfctr",
217
    help="Build with performance counters (default is true on Windows)")
218

    
219
parser.add_option("--without-perfctr",
220
    action="store_true",
221
    dest="without_perfctr",
222
    help="Build without performance counters")
223

    
224
# CHECKME does this still work with recent releases of V8?
225
parser.add_option("--gdb",
226
    action="store_true",
227
    dest="gdb",
228
    help="add gdb support")
229

    
230
parser.add_option("--dest-cpu",
231
    action="store",
232
    dest="dest_cpu",
233
    help="CPU architecture to build for. Valid values are: arm, ia32, x64")
234

    
235
parser.add_option("--dest-os",
236
    action="store",
237
    dest="dest_os",
238
    help="Operating system to build for. Valid values are: "
239
         "win, mac, solaris, freebsd, linux")
240

    
241
parser.add_option("--no-ifaddrs",
242
    action="store_true",
243
    dest="no_ifaddrs",
244
    help="Use on deprecated SunOS systems that do not support ifaddrs.h")
245

    
246
parser.add_option("--with-arm-float-abi",
247
    action="store",
248
    dest="arm_float_abi",
249
    help="Specifies which floating-point ABI to use. Valid values are: "
250
         "soft, softfp, hard")
251

    
252
parser.add_option("--ninja",
253
    action="store_true",
254
    dest="use_ninja",
255
    help="Generate files for the ninja build system")
256

    
257
# Using --unsafe-optimizations voids your warranty.
258
parser.add_option("--unsafe-optimizations",
259
    action="store_true",
260
    dest="unsafe_optimizations",
261
    help=optparse.SUPPRESS_HELP)
262

    
263
parser.add_option("--xcode",
264
    action="store_true",
265
    dest="use_xcode",
266
    help="Generate build files for use with xcode")
267

    
268
(options, args) = parser.parse_args()
269

    
270

    
271
def b(value):
272
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
273
  if value:
274
    return 'true'
275
  else:
276
    return 'false'
277

    
278

    
279
def pkg_config(pkg):
280
  cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
281
  libs = cmd.readline().strip()
282
  ret = cmd.close()
283
  if (ret): return None
284

    
285
  cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
286
  cflags = cmd.readline().strip()
287
  ret = cmd.close()
288
  if (ret): return None
289

    
290
  return (libs, cflags)
291

    
292

    
293
def cc_macros():
294
  """Checks predefined macros using the CC command."""
295

    
296
  try:
297
    p = subprocess.Popen(shlex.split(CC) + ['-dM', '-E', '-'],
298
                         stdin=subprocess.PIPE,
299
                         stdout=subprocess.PIPE,
300
                         stderr=subprocess.PIPE)
301
  except OSError:
302
    print '''Node.js configure error: No acceptable C compiler found!
303

    
304
        Please make sure you have a C compiler installed on your system and/or
305
        consider adjusting the CC environment variable if you installed
306
        it in a non-standard prefix.
307
        '''
308
    sys.exit()
309

    
310
  p.stdin.write('\n')
311
  out = p.communicate()[0]
312

    
313
  out = str(out).split('\n')
314

    
315
  k = {}
316
  for line in out:
317
    lst = shlex.split(line)
318
    if len(lst) > 2:
319
      key = lst[1]
320
      val = lst[2]
321
      k[key] = val
322
  return k
323

    
324

    
325
def is_arch_armv7():
326
  """Check for ARMv7 instructions"""
327
  cc_macros_cache = cc_macros()
328
  return ('__ARM_ARCH_7__' in cc_macros_cache or
329
          '__ARM_ARCH_7A__' in cc_macros_cache or
330
          '__ARM_ARCH_7R__' in cc_macros_cache or
331
          '__ARM_ARCH_7M__' in cc_macros_cache)
332

    
333

    
334
def arm_hard_float_abi():
335
  """Check for hardfloat or softfloat eabi on ARM"""
336
  # GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
337
  # the Floating Point ABI used (PCS stands for Procedure Call Standard).
338
  # We use these as well as a couple of other defines to statically determine
339
  # what FP ABI used.
340
  # GCC versions 4.4 and below don't support hard-fp.
341
  # GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
342
  # __ARM_PCS_VFP.
343

    
344
  if compiler_version() >= (4, 6, 0):
345
    return '__ARM_PCS_VFP' in cc_macros()
346
  elif compiler_version() < (4, 5, 0):
347
    return False
348
  elif '__ARM_PCS_VFP' in cc_macros():
349
    return True
350
  elif ('__ARM_PCS' in cc_macros() or
351
        '__SOFTFP' in cc_macros() or
352
        not '__VFP_FP__' in cc_macros()):
353
    return False
354
  else:
355
    print '''Node.js configure error: Your version of GCC does not report
356
      the Floating-Point ABI to compile for your hardware
357

    
358
      Please manually specify which floating-point ABI to use with the
359
      --with-arm-float-abi option.
360
      '''
361
    sys.exit()
362

    
363

    
364
def host_arch_cc():
365
  """Host architecture check using the CC command."""
366

    
367
  k = cc_macros()
368

    
369
  matchup = {
370
    '__x86_64__'  : 'x64',
371
    '__i386__'    : 'ia32',
372
    '__arm__'     : 'arm',
373
  }
374

    
375
  rtn = 'ia32' # default
376

    
377
  for i in matchup:
378
    if i in k and k[i] != '0':
379
      rtn = matchup[i]
380
      break
381

    
382
  return rtn
383

    
384

    
385
def host_arch_win():
386
  """Host architecture check using environ vars (better way to do this?)"""
387

    
388
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
389

    
390
  matchup = {
391
    'AMD64'  : 'x64',
392
    'x86'    : 'ia32',
393
    'arm'    : 'arm',
394
  }
395

    
396
  return matchup.get(arch, 'ia32')
397

    
398

    
399
def compiler_version():
400
  try:
401
    proc = subprocess.Popen(shlex.split(CC) + ['--version'], stdout=subprocess.PIPE)
402
  except WindowsError:
403
    return (0, False)
404

    
405
  is_clang = 'clang' in proc.communicate()[0].split('\n')[0]
406

    
407
  proc = subprocess.Popen(shlex.split(CC) + ['-dumpversion'], stdout=subprocess.PIPE)
408
  version = tuple(map(int, proc.communicate()[0].split('.')))
409

    
410
  return (version, is_clang)
411

    
412

    
413
def configure_arm(o):
414
  # V8 on ARM requires that armv7 is set. CPU Model detected by
415
  # the presence of __ARM_ARCH_7__ and the like defines in compiler
416
  if options.arm_float_abi:
417
    hard_float = options.arm_float_abi == 'hard'
418
  else:
419
    hard_float = arm_hard_float_abi()
420
  o['variables']['v8_use_arm_eabi_hardfloat'] = b(hard_float)
421

    
422
  armv7 = is_arch_armv7()
423
  if armv7:
424
    # CHECKME VFPv3 implies ARMv7+ but is the reverse true as well?
425
    o['variables']['arm_fpu'] = 'vfpv3'
426
    o['variables']['arm_neon'] = 0
427
  o['variables']['armv7'] = int(armv7)
428

    
429

    
430
def configure_node(o):
431
  o['variables']['v8_enable_gdbjit'] = 1 if options.gdb else 0
432
  o['variables']['v8_no_strict_aliasing'] = 1 # work around compiler bugs
433
  o['variables']['node_prefix'] = os.path.expanduser(options.prefix or '')
434
  o['variables']['node_install_npm'] = b(not options.without_npm)
435
  o['variables']['node_unsafe_optimizations'] = (
436
    1 if options.unsafe_optimizations else 0)
437
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
438

    
439
  host_arch = host_arch_win() if os.name == 'nt' else host_arch_cc()
440
  target_arch = options.dest_cpu or host_arch
441
  o['variables']['host_arch'] = host_arch
442
  o['variables']['target_arch'] = target_arch
443

    
444
  if target_arch == 'arm':
445
    configure_arm(o)
446

    
447
  cc_version, is_clang = compiler_version()
448
  o['variables']['clang'] = 1 if is_clang else 0
449

    
450
  if not is_clang and cc_version != 0:
451
    o['variables']['gcc_version'] = 10 * cc_version[0] + cc_version[1]
452

    
453
  # clang has always supported -fvisibility=hidden, right?
454
  if not is_clang and cc_version < (4,0,0):
455
    o['variables']['visibility'] = ''
456

    
457
  # By default, enable DTrace on SunOS systems. Don't allow it on other
458
  # systems, since it won't work.  (The MacOS build process is different than
459
  # SunOS, and we haven't implemented it.)
460
  if sys.platform.startswith('sunos'):
461
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace)
462
  elif sys.platform.startswith('linux'):
463
    o['variables']['node_use_dtrace'] = 'false'
464
    o['variables']['node_use_systemtap'] = b(options.with_dtrace)
465
    if options.systemtap_includes:
466
      o['include_dirs'] += [options.systemtap_includes]
467
  elif options.with_dtrace:
468
    raise Exception(
469
       'DTrace is currently only supported on SunOS or Linux systems.')
470
  else:
471
    o['variables']['node_use_dtrace'] = 'false'
472
    o['variables']['node_use_systemtap'] = 'false'
473

    
474
  if options.no_ifaddrs:
475
    o['defines'] += ['SUNOS_NO_IFADDRS']
476

    
477
  # By default, enable ETW on Windows.
478
  if sys.platform.startswith('win32'):
479
    o['variables']['node_use_etw'] = b(not options.without_etw);
480
  elif options.with_etw:
481
    raise Exception('ETW is only supported on Windows.')
482
  else:
483
    o['variables']['node_use_etw'] = 'false'
484

    
485
  # By default, enable Performance counters on Windows.
486
  if sys.platform.startswith('win32'):
487
    o['variables']['node_use_perfctr'] = b(not options.without_perfctr);
488
  elif options.with_perfctr:
489
    raise Exception('Performance counter is only supported on Windows.')
490
  else:
491
    o['variables']['node_use_perfctr'] = 'false'
492

    
493

    
494
def configure_libz(o):
495
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
496

    
497
  # assume shared_zlib if one of these is set?
498
  if options.shared_zlib_libpath:
499
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
500
  if options.shared_zlib_libname:
501
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
502
  elif options.shared_zlib:
503
    o['libraries'] += ['-lz']
504
  if options.shared_zlib_includes:
505
    o['include_dirs'] += [options.shared_zlib_includes]
506

    
507

    
508
def configure_http_parser(o):
509
    o['variables']['node_shared_http_parser'] = b(options.shared_http_parser)
510

    
511
    # assume shared http_parser if one of these is set?
512
    if options.shared_http_parser_libpath:
513
        o['libraries'] += ['-L%s' % options.shared_http_parser_libpath]
514
    if options.shared_http_parser_libname:
515
        o['libraries'] += ['-l%s' % options.shared_http_parser_libname]
516
    elif options.shared_http_parser:
517
        o['libraries'] += ['-lhttp_parser']
518
    if options.shared_http_parser_includes:
519
        o['include_dirs'] += [options.shared_http_parser_includes]
520

    
521

    
522
def configure_cares(o):
523
    o['variables']['node_shared_cares'] = b(options.shared_cares)
524

    
525
    # assume shared cares if one of these is set?
526
    if options.shared_cares_libpath:
527
        o['libraries'] += ['-L%s' % options.shared_cares_libpath]
528
    if options.shared_cares_libname:
529
        o['libraries'] += ['-l%s' % options.shared_cares_libname]
530
    elif options.shared_cares:
531
        o['libraries'] += ['-lcares']
532
    if options.shared_cares_includes:
533
        o['include_dirs'] += [options.shared_cares_includes]
534

    
535

    
536
def configure_libuv(o):
537
  o['variables']['node_shared_libuv'] = b(options.shared_libuv)
538

    
539
  # assume shared libuv if one of these is set?
540
  if options.shared_libuv_libpath:
541
    o['libraries'] += ['-L%s' % options.shared_libuv_libpath]
542
  if options.shared_libuv_libname:
543
    o['libraries'] += ['-l%s' % options.shared_libuv_libname]
544
  elif options.shared_libuv:
545
    o['libraries'] += ['-luv']
546
  if options.shared_libuv_includes:
547
    o['include_dirs'] += [options.shared_libuv_includes]
548

    
549

    
550
def configure_v8(o):
551
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
552
  o['variables']['node_shared_v8'] = b(options.shared_v8)
553

    
554
  # assume shared_v8 if one of these is set?
555
  if options.shared_v8_libpath:
556
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
557
  if options.shared_v8_libname:
558
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
559
  elif options.shared_v8:
560
    o['libraries'] += ['-lv8']
561
  if options.shared_v8_includes:
562
    o['include_dirs'] += [options.shared_v8_includes]
563

    
564

    
565
def configure_openssl(o):
566
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
567
  o['variables']['node_shared_openssl'] = b(options.shared_openssl)
568

    
569
  if options.without_ssl:
570
    return
571

    
572
  if options.no_ssl2:
573
    o['defines'] += ['OPENSSL_NO_SSL2=1']
574

    
575
  if options.shared_openssl:
576
    (libs, cflags) = pkg_config('openssl') or ('-lssl -lcrypto', '')
577

    
578
    if options.shared_openssl_libpath:
579
      o['libraries'] += ['-L%s' % options.shared_openssl_libpath]
580

    
581
    if options.shared_openssl_libname:
582
      libnames = options.shared_openssl_libname.split(',')
583
      o['libraries'] += ['-l%s' % s for s in libnames]
584
    else:
585
      o['libraries'] += libs.split()
586

    
587
    if options.shared_openssl_includes:
588
      o['include_dirs'] += [options.shared_openssl_includes]
589
    else:
590
      o['cflags'] += cflags.split()
591

    
592

    
593
def configure_winsdk(o):
594
  if not sys.platform.startswith('win32'):
595
    return
596

    
597
  try:
598
    p = subprocess.Popen(['ctrpp.exe'],
599
                         stdin=subprocess.PIPE,
600
                         stdout=subprocess.PIPE,
601
                         stderr=subprocess.PIPE)
602
  except OSError:
603
    return
604

    
605
  o['variables']['node_has_winsdk'] = 'true'
606

    
607

    
608
output = {
609
  'variables': { 'python': sys.executable },
610
  'include_dirs': [],
611
  'libraries': [],
612
  'defines': [],
613
  'cflags': [],
614
}
615

    
616
configure_node(output)
617
configure_libz(output)
618
configure_http_parser(output)
619
configure_cares(output)
620
configure_libuv(output)
621
configure_v8(output)
622
configure_openssl(output)
623
configure_winsdk(output)
624

    
625
# variables should be a root level element,
626
# move everything else to target_defaults
627
variables = output['variables']
628
del output['variables']
629
output = {
630
  'variables': variables,
631
  'target_defaults': output
632
}
633
pprint.pprint(output, indent=2)
634

    
635
def write(filename, data):
636
  filename = os.path.join(root_dir, filename)
637
  print "creating ", filename
638
  f = open(filename, 'w+')
639
  f.write(data)
640

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

    
644
config = {
645
  'BUILDTYPE': 'Debug' if options.debug else 'Release',
646
  'USE_NINJA': str(int(options.use_ninja or 0)),
647
  'USE_XCODE': str(int(options.use_xcode or 0)),
648
  'PYTHON': sys.executable,
649
}
650
config = '\n'.join(map('='.join, config.iteritems())) + '\n'
651

    
652
write('config.mk',
653
      '# Do not edit. Generated by the configure script.\n' + config)
654

    
655
if options.use_ninja:
656
  gyp_args = ['-f', 'ninja']
657
elif options.use_xcode:
658
  gyp_args = ['-f', 'xcode']
659
elif os.name == 'nt':
660
  gyp_args = ['-f', 'msvs', '-G', 'msvs_version=auto']
661
elif options.dest_os:
662
  gyp_args = ['-f', 'make-' + options.dest_os]
663
else:
664
  gyp_args = ['-f', 'make']
665

    
666
subprocess.call([sys.executable, 'tools/gyp_node'] + gyp_args)