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 @ 35a1421e

History | View | Annotate | Download (10.7 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
(options, args) = parser.parse_args()
140

    
141

    
142
def b(value):
143
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
144
  if value:
145
    return 'true'
146
  else:
147
    return 'false'
148

    
149

    
150
def pkg_config(pkg):
151
  cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
152
  libs = cmd.readline().strip()
153
  ret = cmd.close()
154
  if (ret): return None
155

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

    
161
  return (libs, cflags)
162

    
163

    
164
def host_arch_cc():
165
  """Host architecture check using the CC command."""
166

    
167
  try:
168
    p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
169
                         stdin=subprocess.PIPE,
170
                         stdout=subprocess.PIPE,
171
                         stderr=subprocess.PIPE)
172
  except OSError:
173
    print '''Node.js configure error: No acceptable C compiler found!
174

    
175
        Please make sure you have a C compiler installed on your system and/or
176
        consider adjusting the CC environment variable if you installed
177
        it in a non-standard prefix.
178
        '''
179
    sys.exit()
180

    
181
  p.stdin.write('\n')
182
  out = p.communicate()[0]
183

    
184
  out = str(out).split('\n')
185

    
186
  k = {}
187
  for line in out:
188
    import shlex
189
    lst = shlex.split(line)
190
    if len(lst) > 2:
191
      key = lst[1]
192
      val = lst[2]
193
      k[key] = val
194

    
195
  matchup = {
196
    '__x86_64__'  : 'x64',
197
    '__i386__'    : 'ia32',
198
    '__arm__'     : 'arm',
199
  }
200

    
201
  rtn = 'ia32' # default
202

    
203
  for i in matchup:
204
    if i in k and k[i] != '0':
205
      rtn = matchup[i]
206
      break
207

    
208
  return rtn
209

    
210

    
211
def host_arch_win():
212
  """Host architecture check using environ vars (better way to do this?)"""
213

    
214
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
215

    
216
  matchup = {
217
    'AMD64'  : 'x64',
218
    'x86'    : 'ia32',
219
    'arm'    : 'arm',
220
  }
221

    
222
  return matchup.get(arch, 'ia32')
223

    
224

    
225
def host_arch():
226
  """Host architecture. One of arm, ia32 or x64."""
227
  if os.name == 'nt':
228
    arch = host_arch_win()
229
  else:
230
    arch = host_arch_cc()
231
  return arch
232

    
233

    
234
def target_arch():
235
  return host_arch()
236

    
237
def cc_version():
238
  try:
239
    proc = subprocess.Popen([CC, '-v'], stderr=subprocess.PIPE)
240
  except OSError:
241
    return None
242
  lines = proc.communicate()[1].split('\n')
243
  version_line = None
244
  for i, line in enumerate(lines):
245
    if 'version' in line:
246
      version_line = line
247
  if not version_line:
248
    return None
249
  version = version_line.split("version")[1].strip().split()[0].split(".")
250
  if not version:
251
    return None
252
  return ['LLVM' in version_line] + version
253

    
254
def configure_node(o):
255
  # TODO add gdb
256
  o['variables']['node_prefix'] = options.prefix if options.prefix else ''
257
  o['variables']['node_install_npm'] = b(not options.without_npm)
258
  o['variables']['node_install_waf'] = b(not options.without_waf)
259
  o['variables']['host_arch'] = host_arch()
260
  o['variables']['target_arch'] = options.dest_cpu or target_arch()
261
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
262

    
263
  # turn off strict aliasing if gcc < 4.6.0 unless it's llvm-gcc
264
  # see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45883
265
  # see http://code.google.com/p/v8/issues/detail?id=884
266
  o['variables']['strict_aliasing'] = b(
267
    'clang' in CC or cc_version() >= [False, 4, 6, 0])
268

    
269
  # clang has always supported -fvisibility=hidden, right?
270
  if 'clang' not in CC and cc_version() < [False, 4, 0, 0]:
271
    o['variables']['visibility'] = ''
272

    
273
  # By default, enable DTrace on SunOS systems. Don't allow it on other
274
  # systems, since it won't work.  (The MacOS build process is different than
275
  # SunOS, and we haven't implemented it.)
276
  if sys.platform.startswith('sunos'):
277
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
278
    # Strict aliasing causes problems with the V8 snapshots on SunOS
279
    o['variables']['strict_aliasing'] = b(False);
280
  elif b(options.with_dtrace) == 'true':
281
    raise Exception('DTrace is currently only supported on SunOS systems.')
282
  else:
283
    o['variables']['node_use_dtrace'] = 'false'
284

    
285

    
286
  # By default, enable ETW on Windows.
287
  if sys.platform.startswith('win32'):
288
    o['variables']['node_use_etw'] = b(not options.without_etw);
289
  elif b(options.with_etw) == 'true':
290
    raise Exception('ETW is only supported on Windows.')
291
  else:
292
    o['variables']['node_use_etw'] = 'false'
293

    
294

    
295
def configure_libz(o):
296
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
297

    
298
  # assume shared_zlib if one of these is set?
299
  if options.shared_zlib_libpath:
300
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
301
  if options.shared_zlib_libname:
302
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
303
  elif options.shared_zlib:
304
    o['libraries'] += ['-lz']
305
  if options.shared_zlib_includes:
306
    o['include_dirs'] += [options.shared_zlib_includes]
307

    
308

    
309
def configure_v8(o):
310
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
311
  o['variables']['node_shared_v8'] = b(options.shared_v8)
312

    
313
  # assume shared_v8 if one of these is set?
314
  if options.shared_v8_libpath:
315
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
316
  if options.shared_v8_libname:
317
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
318
  elif options.shared_v8:
319
    o['libraries'] += ['-lv8']
320
  if options.shared_v8_includes:
321
    o['include_dirs'] += [options.shared_v8_includes]
322
    o['variables']['node_shared_v8_includes'] = options.shared_v8_includes
323

    
324

    
325
def configure_openssl(o):
326
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
327

    
328
  if options.without_ssl:
329
    return
330

    
331
  if options.no_ssl2:
332
    o['defines'] += ['OPENSSL_NO_SSL2=1']
333

    
334
  if not options.openssl_use_sys:
335
    o['variables']['node_use_system_openssl'] = b(False)
336
  else:
337
    out = pkg_config('openssl')
338
    (libs, cflags) = out if out else ('', '')
339

    
340
    if options.openssl_libpath:
341
      o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
342
    else:
343
      o['libraries'] += libs.split()
344

    
345
    if options.openssl_includes:
346
      o['include_dirs'] += [options.openssl_includes]
347
    else:
348
      o['cflags'] += cflags.split()
349

    
350
    o['variables']['node_use_system_openssl'] = b(
351
      libs or cflags or options.openssl_libpath or options.openssl_includes)
352

    
353

    
354
output = {
355
  'variables': {},
356
  'include_dirs': [],
357
  'libraries': [],
358
  'defines': [],
359
  'cflags': [],
360
}
361

    
362
configure_node(output)
363
configure_libz(output)
364
configure_v8(output)
365
configure_openssl(output)
366

    
367
# variables should be a root level element,
368
# move everything else to target_defaults
369
variables = output['variables']
370
del output['variables']
371
output = {
372
  'variables': variables,
373
  'target_defaults': output
374
}
375
pprint.pprint(output, indent=2)
376

    
377
def write(filename, data):
378
  filename = os.path.join(root_dir, filename)
379
  print "creating ", filename
380
  f = open(filename, 'w+')
381
  f.write(data)
382

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

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

    
389
if os.name == 'nt':
390
  subprocess.call(['python', 'tools/gyp_node', '-f', 'msvs',
391
                                               '-G', 'msvs_version=2010'])
392
else:
393
  subprocess.call(['tools/gyp_node', '-f', 'make'])