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 @ b9167742

History | View | Annotate | Download (19.7 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
parser.add_option("--tag",
269
    action="store",
270
    dest="tag",
271
    help="Custom build tag")
272

    
273
(options, args) = parser.parse_args()
274

    
275

    
276
def b(value):
277
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
278
  if value:
279
    return 'true'
280
  else:
281
    return 'false'
282

    
283

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

    
290
  cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
291
  cflags = cmd.readline().strip()
292
  ret = cmd.close()
293
  if (ret): return None
294

    
295
  return (libs, cflags)
296

    
297

    
298
def cc_macros():
299
  """Checks predefined macros using the CC command."""
300

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

    
309
        Please make sure you have a C compiler installed on your system and/or
310
        consider adjusting the CC environment variable if you installed
311
        it in a non-standard prefix.
312
        '''
313
    sys.exit()
314

    
315
  p.stdin.write('\n')
316
  out = p.communicate()[0]
317

    
318
  out = str(out).split('\n')
319

    
320
  k = {}
321
  for line in out:
322
    lst = shlex.split(line)
323
    if len(lst) > 2:
324
      key = lst[1]
325
      val = lst[2]
326
      k[key] = val
327
  return k
328

    
329

    
330
def is_arch_armv7():
331
  """Check for ARMv7 instructions"""
332
  cc_macros_cache = cc_macros()
333
  return ('__ARM_ARCH_7__' in cc_macros_cache or
334
          '__ARM_ARCH_7A__' in cc_macros_cache or
335
          '__ARM_ARCH_7R__' in cc_macros_cache or
336
          '__ARM_ARCH_7M__' in cc_macros_cache)
337

    
338

    
339
def is_arm_neon():
340
  """Check for ARM NEON support"""
341
  return '__ARM_NEON__' in cc_macros()
342

    
343

    
344
def arm_hard_float_abi():
345
  """Check for hardfloat or softfloat eabi on ARM"""
346
  # GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
347
  # the Floating Point ABI used (PCS stands for Procedure Call Standard).
348
  # We use these as well as a couple of other defines to statically determine
349
  # what FP ABI used.
350
  # GCC versions 4.4 and below don't support hard-fp.
351
  # GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
352
  # __ARM_PCS_VFP.
353

    
354
  if compiler_version() >= (4, 6, 0):
355
    return '__ARM_PCS_VFP' in cc_macros()
356
  elif compiler_version() < (4, 5, 0):
357
    return False
358
  elif '__ARM_PCS_VFP' in cc_macros():
359
    return True
360
  elif ('__ARM_PCS' in cc_macros() or
361
        '__SOFTFP' in cc_macros() or
362
        not '__VFP_FP__' in cc_macros()):
363
    return False
364
  else:
365
    print '''Node.js configure error: Your version of GCC does not report
366
      the Floating-Point ABI to compile for your hardware
367

    
368
      Please manually specify which floating-point ABI to use with the
369
      --with-arm-float-abi option.
370
      '''
371
    sys.exit()
372

    
373

    
374
def host_arch_cc():
375
  """Host architecture check using the CC command."""
376

    
377
  k = cc_macros()
378

    
379
  matchup = {
380
    '__x86_64__'  : 'x64',
381
    '__i386__'    : 'ia32',
382
    '__arm__'     : 'arm',
383
  }
384

    
385
  rtn = 'ia32' # default
386

    
387
  for i in matchup:
388
    if i in k and k[i] != '0':
389
      rtn = matchup[i]
390
      break
391

    
392
  return rtn
393

    
394

    
395
def host_arch_win():
396
  """Host architecture check using environ vars (better way to do this?)"""
397

    
398
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
399

    
400
  matchup = {
401
    'AMD64'  : 'x64',
402
    'x86'    : 'ia32',
403
    'arm'    : 'arm',
404
  }
405

    
406
  return matchup.get(arch, 'ia32')
407

    
408

    
409
def compiler_version():
410
  try:
411
    proc = subprocess.Popen(shlex.split(CC) + ['--version'], stdout=subprocess.PIPE)
412
  except WindowsError:
413
    return (0, False)
414

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

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

    
420
  return (version, is_clang)
421

    
422

    
423
def configure_arm(o):
424
  # V8 on ARM requires that armv7 is set. CPU Model detected by
425
  # the presence of __ARM_ARCH_7__ and the like defines in compiler
426
  if options.arm_float_abi:
427
    hard_float = options.arm_float_abi == 'hard'
428
  else:
429
    hard_float = arm_hard_float_abi()
430

    
431
  armv7 = is_arch_armv7()
432
  # CHECKME VFPv3 implies ARMv7+ but is the reverse true as well?
433
  fpu = 'vfpv3' if armv7 else 'vfpv2'
434

    
435
  o['variables']['armv7'] = int(armv7)
436
  o['variables']['arm_fpu'] = fpu
437
  o['variables']['arm_neon'] = int(is_arm_neon())
438
  o['variables']['v8_use_arm_eabi_hardfloat'] = b(hard_float)
439

    
440

    
441
def configure_node(o):
442
  o['variables']['v8_enable_gdbjit'] = 1 if options.gdb else 0
443
  o['variables']['v8_no_strict_aliasing'] = 1 # work around compiler bugs
444
  o['variables']['node_prefix'] = os.path.expanduser(options.prefix or '')
445
  o['variables']['node_install_npm'] = b(not options.without_npm)
446
  o['variables']['node_unsafe_optimizations'] = (
447
    1 if options.unsafe_optimizations else 0)
448
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
449

    
450
  host_arch = host_arch_win() if os.name == 'nt' else host_arch_cc()
451
  target_arch = options.dest_cpu or host_arch
452
  o['variables']['host_arch'] = host_arch
453
  o['variables']['target_arch'] = target_arch
454

    
455
  if target_arch == 'arm':
456
    configure_arm(o)
457

    
458
  cc_version, is_clang = compiler_version()
459
  o['variables']['clang'] = 1 if is_clang else 0
460

    
461
  if not is_clang and cc_version != 0:
462
    o['variables']['gcc_version'] = 10 * cc_version[0] + cc_version[1]
463

    
464
  # clang has always supported -fvisibility=hidden, right?
465
  if not is_clang and cc_version < (4,0,0):
466
    o['variables']['visibility'] = ''
467

    
468
  # By default, enable DTrace on SunOS systems. Don't allow it on other
469
  # systems, since it won't work.  (The MacOS build process is different than
470
  # SunOS, and we haven't implemented it.)
471
  if sys.platform.startswith('sunos'):
472
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace)
473
  elif sys.platform.startswith('linux'):
474
    o['variables']['node_use_dtrace'] = 'false'
475
    o['variables']['node_use_systemtap'] = b(options.with_dtrace)
476
    if options.systemtap_includes:
477
      o['include_dirs'] += [options.systemtap_includes]
478
  elif options.with_dtrace:
479
    raise Exception(
480
       'DTrace is currently only supported on SunOS or Linux systems.')
481
  else:
482
    o['variables']['node_use_dtrace'] = 'false'
483
    o['variables']['node_use_systemtap'] = 'false'
484

    
485
  if options.no_ifaddrs:
486
    o['defines'] += ['SUNOS_NO_IFADDRS']
487

    
488
  # By default, enable ETW on Windows.
489
  if sys.platform.startswith('win32'):
490
    o['variables']['node_use_etw'] = b(not options.without_etw);
491
  elif options.with_etw:
492
    raise Exception('ETW is only supported on Windows.')
493
  else:
494
    o['variables']['node_use_etw'] = 'false'
495

    
496
  # By default, enable Performance counters on Windows.
497
  if sys.platform.startswith('win32'):
498
    o['variables']['node_use_perfctr'] = b(not options.without_perfctr);
499
  elif options.with_perfctr:
500
    raise Exception('Performance counter is only supported on Windows.')
501
  else:
502
    o['variables']['node_use_perfctr'] = 'false'
503

    
504
  if options.tag:
505
    o['variables']['node_tag'] = '-' + options.tag
506
  else:
507
    o['variables']['node_tag'] = ''
508

    
509

    
510
def configure_libz(o):
511
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
512

    
513
  # assume shared_zlib if one of these is set?
514
  if options.shared_zlib_libpath:
515
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
516
  if options.shared_zlib_libname:
517
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
518
  elif options.shared_zlib:
519
    o['libraries'] += ['-lz']
520
  if options.shared_zlib_includes:
521
    o['include_dirs'] += [options.shared_zlib_includes]
522

    
523

    
524
def configure_http_parser(o):
525
    o['variables']['node_shared_http_parser'] = b(options.shared_http_parser)
526

    
527
    # assume shared http_parser if one of these is set?
528
    if options.shared_http_parser_libpath:
529
        o['libraries'] += ['-L%s' % options.shared_http_parser_libpath]
530
    if options.shared_http_parser_libname:
531
        o['libraries'] += ['-l%s' % options.shared_http_parser_libname]
532
    elif options.shared_http_parser:
533
        o['libraries'] += ['-lhttp_parser']
534
    if options.shared_http_parser_includes:
535
        o['include_dirs'] += [options.shared_http_parser_includes]
536

    
537

    
538
def configure_cares(o):
539
    o['variables']['node_shared_cares'] = b(options.shared_cares)
540

    
541
    # assume shared cares if one of these is set?
542
    if options.shared_cares_libpath:
543
        o['libraries'] += ['-L%s' % options.shared_cares_libpath]
544
    if options.shared_cares_libname:
545
        o['libraries'] += ['-l%s' % options.shared_cares_libname]
546
    elif options.shared_cares:
547
        o['libraries'] += ['-lcares']
548
    if options.shared_cares_includes:
549
        o['include_dirs'] += [options.shared_cares_includes]
550

    
551

    
552
def configure_libuv(o):
553
  o['variables']['node_shared_libuv'] = b(options.shared_libuv)
554

    
555
  # assume shared libuv if one of these is set?
556
  if options.shared_libuv_libpath:
557
    o['libraries'] += ['-L%s' % options.shared_libuv_libpath]
558
  if options.shared_libuv_libname:
559
    o['libraries'] += ['-l%s' % options.shared_libuv_libname]
560
  elif options.shared_libuv:
561
    o['libraries'] += ['-luv']
562
  if options.shared_libuv_includes:
563
    o['include_dirs'] += [options.shared_libuv_includes]
564

    
565

    
566
def configure_v8(o):
567
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
568
  o['variables']['node_shared_v8'] = b(options.shared_v8)
569

    
570
  # assume shared_v8 if one of these is set?
571
  if options.shared_v8_libpath:
572
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
573
  if options.shared_v8_libname:
574
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
575
  elif options.shared_v8:
576
    o['libraries'] += ['-lv8']
577
  if options.shared_v8_includes:
578
    o['include_dirs'] += [options.shared_v8_includes]
579

    
580

    
581
def configure_openssl(o):
582
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
583
  o['variables']['node_shared_openssl'] = b(options.shared_openssl)
584

    
585
  if options.without_ssl:
586
    return
587

    
588
  if options.no_ssl2:
589
    o['defines'] += ['OPENSSL_NO_SSL2=1']
590

    
591
  if options.shared_openssl:
592
    (libs, cflags) = pkg_config('openssl') or ('-lssl -lcrypto', '')
593

    
594
    if options.shared_openssl_libpath:
595
      o['libraries'] += ['-L%s' % options.shared_openssl_libpath]
596

    
597
    if options.shared_openssl_libname:
598
      libnames = options.shared_openssl_libname.split(',')
599
      o['libraries'] += ['-l%s' % s for s in libnames]
600
    else:
601
      o['libraries'] += libs.split()
602

    
603
    if options.shared_openssl_includes:
604
      o['include_dirs'] += [options.shared_openssl_includes]
605
    else:
606
      o['cflags'] += cflags.split()
607

    
608

    
609
def configure_winsdk(o):
610
  if not sys.platform.startswith('win32'):
611
    return
612

    
613
  winsdk_dir = os.environ.get("WindowsSdkDir")
614

    
615
  if winsdk_dir and os.path.isfile(winsdk_dir + '\\bin\\ctrpp.exe'):
616
    print "Found ctrpp in WinSDK--will build generated files into tools/msvs/genfiles."
617
    o['variables']['node_has_winsdk'] = 'true'
618
    return
619

    
620
  print "ctrpp not found in WinSDK path--using pre-gen files from tools/msvs/genfiles."
621

    
622

    
623
output = {
624
  'variables': { 'python': sys.executable },
625
  'include_dirs': [],
626
  'libraries': [],
627
  'defines': [],
628
  'cflags': [],
629
}
630

    
631
configure_node(output)
632
configure_libz(output)
633
configure_http_parser(output)
634
configure_cares(output)
635
configure_libuv(output)
636
configure_v8(output)
637
configure_openssl(output)
638
configure_winsdk(output)
639

    
640
# variables should be a root level element,
641
# move everything else to target_defaults
642
variables = output['variables']
643
del output['variables']
644
output = {
645
  'variables': variables,
646
  'target_defaults': output
647
}
648
pprint.pprint(output, indent=2)
649

    
650
def write(filename, data):
651
  filename = os.path.join(root_dir, filename)
652
  print "creating ", filename
653
  f = open(filename, 'w+')
654
  f.write(data)
655

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

    
659
config = {
660
  'BUILDTYPE': 'Debug' if options.debug else 'Release',
661
  'USE_NINJA': str(int(options.use_ninja or 0)),
662
  'USE_XCODE': str(int(options.use_xcode or 0)),
663
  'PYTHON': sys.executable,
664
}
665
config = '\n'.join(map('='.join, config.iteritems())) + '\n'
666

    
667
write('config.mk',
668
      '# Do not edit. Generated by the configure script.\n' + config)
669

    
670
if options.use_ninja:
671
  gyp_args = ['-f', 'ninja']
672
elif options.use_xcode:
673
  gyp_args = ['-f', 'xcode']
674
elif os.name == 'nt':
675
  gyp_args = ['-f', 'msvs', '-G', 'msvs_version=auto']
676
elif options.dest_os:
677
  gyp_args = ['-f', 'make-' + options.dest_os]
678
else:
679
  gyp_args = ['-f', 'make']
680

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