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 @ 792d9a92

History | View | Annotate | Download (9.92 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
  try:
158
    p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
159
                         stdin=subprocess.PIPE,
160
                         stdout=subprocess.PIPE,
161
                         stderr=subprocess.PIPE)
162
  except OSError:
163
    print '''Node.js configure error: No acceptable C compiler found!
164

    
165
        Please make sure you have a C compiler installed on your system and/or
166
        consider adjusting the CC environment variable if you installed
167
        it in a non-standard prefix.
168
        '''
169
    sys.exit()
170

    
171
  p.stdin.write('\n')
172
  out = p.communicate()[0]
173

    
174
  out = str(out).split('\n')
175

    
176
  k = {}
177
  for line in out:
178
    import shlex
179
    lst = shlex.split(line)
180
    if len(lst) > 2:
181
      key = lst[1]
182
      val = lst[2]
183
      k[key] = val
184

    
185
  matchup = {
186
    '__x86_64__'  : 'x64',
187
    '__i386__'    : 'ia32',
188
    '__arm__'     : 'arm',
189
  }
190

    
191
  rtn = 'ia32' # default
192

    
193
  for i in matchup:
194
    if i in k and k[i] != '0':
195
      rtn = matchup[i]
196
      break
197

    
198
  return rtn
199

    
200

    
201
def host_arch_win():
202
  """Host architecture check using environ vars (better way to do this?)"""
203

    
204
  arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
205

    
206
  matchup = {
207
    'AMD64'  : 'x64',
208
    'x86'    : 'ia32',
209
    'arm'    : 'arm',
210
  }
211

    
212
  return matchup.get(arch, 'ia32')
213

    
214

    
215
def host_arch():
216
  """Host architecture. One of arm, ia32 or x64."""
217
  if os.name == 'nt':
218
    arch = host_arch_win()
219
  else:
220
    arch = host_arch_cc()
221
  return arch
222

    
223

    
224
def target_arch():
225
  return host_arch()
226

    
227

    
228
def gcc_version():
229
  try:
230
    proc = subprocess.Popen([CC, '-v'], stderr=subprocess.PIPE)
231
  except OSError:
232
    return None
233
  # TODO parse clang output
234
  version = proc.communicate()[1].split('\n')[-2]
235
  match = re.match('gcc version (\d+)\.(\d+)\.(\d+)', version)
236
  if not match: return None
237
  return ['LLVM' in version] + map(int, match.groups())
238

    
239

    
240
def configure_node(o):
241
  # TODO add gdb
242
  o['variables']['node_prefix'] = options.prefix if options.prefix else ''
243
  o['variables']['node_install_npm'] = b(not options.without_npm)
244
  o['variables']['node_install_waf'] = b(not options.without_waf)
245
  o['variables']['host_arch'] = host_arch()
246
  o['variables']['target_arch'] = options.dest_cpu or target_arch()
247
  o['default_configuration'] = 'Debug' if options.debug else 'Release'
248

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

    
255
  # clang has always supported -fvisibility=hidden, right?
256
  if 'clang' not in CC and gcc_version() < [False, 4, 0, 0]:
257
    o['variables']['visibility'] = ''
258

    
259
  # By default, enable DTrace on SunOS systems. Don't allow it on other
260
  # systems, since it won't work.  (The MacOS build process is different than
261
  # SunOS, and we haven't implemented it.)
262
  if sys.platform.startswith('sunos'):
263
    o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
264
  elif b(options.with_dtrace) == 'true':
265
    raise Exception('DTrace is currently only supported on SunOS systems.')
266
  else:
267
    o['variables']['node_use_dtrace'] = 'false'
268

    
269

    
270
def configure_libz(o):
271
  o['variables']['node_shared_zlib'] = b(options.shared_zlib)
272

    
273
  # assume shared_zlib if one of these is set?
274
  if options.shared_zlib_libpath:
275
    o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
276
  if options.shared_zlib_libname:
277
    o['libraries'] += ['-l%s' % options.shared_zlib_libname]
278
  elif options.shared_zlib:
279
    o['libraries'] += ['-lz']
280
  if options.shared_zlib_includes:
281
    o['include_dirs'] += [options.shared_zlib_includes]
282

    
283

    
284
def configure_v8(o):
285
  o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
286
  o['variables']['node_shared_v8'] = b(options.shared_v8)
287

    
288
  # assume shared_v8 if one of these is set?
289
  if options.shared_v8_libpath:
290
    o['libraries'] += ['-L%s' % options.shared_v8_libpath]
291
  if options.shared_v8_libname:
292
    o['libraries'] += ['-l%s' % options.shared_v8_libname]
293
  elif options.shared_v8:
294
    o['libraries'] += ['-lv8']
295
  if options.shared_v8_includes:
296
    o['include_dirs'] += [options.shared_v8_includes]
297
    o['variables']['node_shared_v8_includes'] = options.shared_v8_includes
298

    
299

    
300
def configure_openssl(o):
301
  o['variables']['node_use_openssl'] = b(not options.without_ssl)
302

    
303
  if options.without_ssl:
304
    return
305

    
306
  if options.no_ssl2:
307
    o['defines'] += ['OPENSSL_NO_SSL2=1']
308

    
309
  if not options.openssl_use_sys:
310
    o['variables']['node_use_system_openssl'] = b(False)
311
  else:
312
    out = pkg_config('openssl')
313
    (libs, cflags) = out if out else ('', '')
314

    
315
    if options.openssl_libpath:
316
      o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
317
    else:
318
      o['libraries'] += libs.split()
319

    
320
    if options.openssl_includes:
321
      o['include_dirs'] += [options.openssl_includes]
322
    else:
323
      o['cflags'] += cflags.split()
324

    
325
    o['variables']['node_use_system_openssl'] = b(
326
      libs or cflags or options.openssl_libpath or options.openssl_includes)
327

    
328

    
329
output = {
330
  'variables': {},
331
  'include_dirs': [],
332
  'libraries': [],
333
  'defines': [],
334
  'cflags': [],
335
}
336

    
337
configure_node(output)
338
configure_libz(output)
339
configure_v8(output)
340
configure_openssl(output)
341

    
342
# variables should be a root level element,
343
# move everything else to target_defaults
344
variables = output['variables']
345
del output['variables']
346
output = {
347
  'variables': variables,
348
  'target_defaults': output
349
}
350
pprint.pprint(output, indent=2)
351

    
352
def write(filename, data):
353
  filename = os.path.join(root_dir, filename)
354
  print "creating ", filename
355
  f = open(filename, 'w+')
356
  f.write(data)
357

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

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

    
364
if os.name == 'nt':
365
  subprocess.call(['python', 'tools/gyp_node', '-f', 'msvs',
366
                                               '-G', 'msvs_version=2010'])
367
else:
368
  subprocess.call(['tools/gyp_node', '-f', 'make'])