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

History | View | Annotate | Download (9.6 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
# CHECKME does this still work with recent releases of V8?
119
parser.add_option("--gdb",
120
    action="store_true",
121
    dest="gdb",
122
    help="add gdb support")
123

    
124
parser.add_option("--dest-cpu",
125
    action="store",
126
    dest="dest_cpu",
127
    help="CPU architecture to build for. Valid values are: arm, ia32, x64")
128

    
129
(options, args) = parser.parse_args()
130

    
131

    
132
def b(value):
133
  """Returns the string 'true' if value is truthy, 'false' otherwise."""
134
  if value:
135
    return 'true'
136
  else:
137
    return 'false'
138

    
139

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

    
146
  cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
147
  cflags = cmd.readline().strip()
148
  ret = cmd.close()
149
  if (ret): return None
150

    
151
  return (libs, cflags)
152

    
153

    
154
def host_arch_cc():
155
  """Host architecture check using the CC command."""
156

    
157
  p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
158
                       stdin=subprocess.PIPE,
159
                       stdout=subprocess.PIPE,
160
                       stderr=subprocess.PIPE)
161
  p.stdin.write('\n')
162
  out = p.communicate()[0]
163

    
164
  out = str(out).split('\n')
165

    
166
  k = {}
167
  for line in out:
168
    import shlex
169
    lst = shlex.split(line)
170
    if len(lst) > 2:
171
      key = lst[1]
172
      val = lst[2]
173
      k[key] = val
174

    
175
  matchup = {
176
    '__x86_64__'  : 'x64',
177
    '__i386__'    : 'ia32',
178
    '__arm__'     : 'arm',
179
  }
180

    
181
  rtn = 'ia32' # default
182

    
183
  for i in matchup:
184
    if i in k and k[i] != '0':
185
      rtn = matchup[i]
186
      break
187

    
188
  return rtn
189

    
190

    
191
def host_arch_win():
192
  """Host architecture check using environ vars (better way to do this?)"""
193

    
194
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
195

    
196
  matchup = {
197
    'AMD64'  : 'x64',
198
    'x86'    : 'ia32',
199
    'arm'    : 'arm',
200
  }
201

    
202
  return matchup.get(arch, 'ia32')
203

    
204

    
205
def host_arch():
206
  """Host architecture. One of arm, ia32 or x64."""
207
  if os.name == 'nt':
208
    arch = host_arch_win()
209
  else:
210
    arch = host_arch_cc()
211
  return arch
212

    
213

    
214
def target_arch():
215
  return host_arch()
216

    
217

    
218
def gcc_version():
219
  try:
220
    proc = subprocess.Popen([CC, '-v'], stderr=subprocess.PIPE)
221
  except OSError:
222
    return None
223
  # TODO parse clang output
224
  version = proc.communicate()[1].split('\n')[-2]
225
  match = re.match('gcc version (\d+)\.(\d+)\.(\d+)', version)
226
  if not match: return None
227
  return ['LLVM' in version] + map(int, match.groups())
228

    
229

    
230
def configure_node(o):
231
  # TODO add gdb
232
  o['variables']['node_prefix'] = options.prefix if options.prefix else ''
233
  o['variables']['node_install_npm'] = b(not options.without_npm)
234
  o['variables']['node_install_waf'] = b(not options.without_waf)
235
  o['variables']['host_arch'] = host_arch()
236
  o['variables']['target_arch'] = options.dest_cpu or target_arch()
237
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
238

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

    
245
  # clang has always supported -fvisibility=hidden, right?
246
  if 'clang' not in CC and gcc_version() < [False, 4, 0, 0]:
247
    o['variables']['visibility'] = ''
248

    
249
  # By default, enable DTrace on SunOS systems. Don't allow it on other
250
  # systems, since it won't work.  (The MacOS build process is different than
251
  # SunOS, and we haven't implemented it.)
252
  if sys.platform.startswith('sunos'):
253
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
254
  elif b(options.with_dtrace) == 'true':
255
    raise Exception('DTrace is currently only supported on SunOS systems.')
256
  else:
257
    o['variables']['node_use_dtrace'] = 'false'
258

    
259

    
260
def configure_libz(o):
261
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
262

    
263
  # assume shared_zlib if one of these is set?
264
  if options.shared_zlib_libpath:
265
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
266
  if options.shared_zlib_libname:
267
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
268
  elif options.shared_zlib:
269
    o['libraries'] += ['-lz']
270
  if options.shared_zlib_includes:
271
    o['include_dirs'] += [options.shared_zlib_includes]
272

    
273

    
274
def configure_v8(o):
275
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
276
  o['variables']['node_shared_v8'] = b(options.shared_v8)
277

    
278
  # assume shared_v8 if one of these is set?
279
  if options.shared_v8_libpath:
280
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
281
  if options.shared_v8_libname:
282
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
283
  elif options.shared_v8:
284
    o['libraries'] += ['-lv8']
285
  if options.shared_v8_includes:
286
    o['include_dirs'] += [options.shared_v8_includes]
287
    o['variables']['node_shared_v8_includes'] = options.shared_v8_includes
288

    
289

    
290
def configure_openssl(o):
291
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
292

    
293
  if options.without_ssl:
294
    return
295

    
296
  if options.no_ssl2:
297
    o['defines'] += ['OPENSSL_NO_SSL2=1']
298

    
299
  if not options.openssl_use_sys:
300
    o['variables']['node_use_system_openssl'] = b(False)
301
  else:
302
    out = pkg_config('openssl')
303
    (libs, cflags) = out if out else ('', '')
304

    
305
    if options.openssl_libpath:
306
      o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
307
    else:
308
      o['libraries'] += libs.split()
309

    
310
    if options.openssl_includes:
311
      o['include_dirs'] += [options.openssl_includes]
312
    else:
313
      o['cflags'] += cflags.split()
314

    
315
    o['variables']['node_use_system_openssl'] = b(
316
      libs or cflags or options.openssl_libpath or options.openssl_includes)
317

    
318

    
319
output = {
320
  'variables': {},
321
  'include_dirs': [],
322
  'libraries': [],
323
  'defines': [],
324
  'cflags': [],
325
}
326

    
327
configure_node(output)
328
configure_libz(output)
329
configure_v8(output)
330
configure_openssl(output)
331

    
332
# variables should be a root level element,
333
# move everything else to target_defaults
334
variables = output['variables']
335
del output['variables']
336
output = {
337
  'variables': variables,
338
  'target_defaults': output
339
}
340
pprint.pprint(output, indent=2)
341

    
342
def write(filename, data):
343
  filename = os.path.join(root_dir, filename)
344
  print "creating ", filename
345
  f = open(filename, 'w+')
346
  f.write(data)
347

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

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

    
354
if os.name == 'nt':
355
  subprocess.call(['python', 'tools/gyp_node', '-f', 'msvs',
356
                                               '-G', 'msvs_version=2010'])
357
else:
358
  subprocess.call(['tools/gyp_node', '-f', 'make'])