Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 375 lines (295 sloc) 10.387 kb
14b04b0 ry Remove SCONS deprecate WAF
ry authored
1 #!/usr/bin/env python
2 import optparse
3 import os
45605c9 Johan Bergström gyp: switch json for pprint when generating config
jbergstroem authored
4 import pprint
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
5 import re
b9e1bb3 Ben Noordhuis build: auto-run tools/gyp_node after ./configure
bnoordhuis authored
6 import subprocess
14b04b0 ry Remove SCONS deprecate WAF
ry authored
7 import sys
5cf4cef ry add configure
ry authored
8
5062741 Ben Noordhuis build: make CC command in -fstrict-aliasing check configurable
bnoordhuis authored
9 CC = os.environ.get('CC', 'cc')
10
14b04b0 ry Remove SCONS deprecate WAF
ry authored
11 root_dir = os.path.dirname(__file__)
12 sys.path.insert(0, os.path.join(root_dir, 'deps', 'v8', 'tools'))
97c9745 ry Back to WAF
ry authored
13
14b04b0 ry Remove SCONS deprecate WAF
ry authored
14 # parse our options
15 parser = optparse.OptionParser()
97c9745 ry Back to WAF
ry authored
16
14b04b0 ry Remove SCONS deprecate WAF
ry authored
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
a9f2c4a Fedor Indutny --without-npm option
indutny authored
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
6e76a7c Fedor Indutny installer: install node-waf
indutny authored
32 parser.add_option("--without-waf",
33 action="store_true",
34 dest="without_waf",
35 help="Don\'t install node-waf")
36
14b04b0 ry Remove SCONS deprecate WAF
ry authored
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
e61de70 ry gyp: use built-in openssl by default
ry authored
68 parser.add_option("--openssl-use-sys",
70e6889 Nathan Rajlich build: make --openssl-use-sys a boolean option
TooTallNate authored
69 action="store_true",
e61de70 ry gyp: use built-in openssl by default
ry authored
70 dest="openssl_use_sys",
71 help="Use the system OpenSSL instead of one included with Node")
72
14b04b0 ry Remove SCONS deprecate WAF
ry authored
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
d03b848 T.C. Hollingsworth build: support shared zlib
tchollingsworth authored
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
14b04b0 ry Remove SCONS deprecate WAF
ry authored
108 parser.add_option("--with-dtrace",
109 action="store_true",
110 dest="with_dtrace",
cc15299 David Pacheco build: add support for DTrace and postmortem
davepacheco authored
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")
14b04b0 ry Remove SCONS deprecate WAF
ry authored
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
a033261 Ben Noordhuis build: DRY configure script
bnoordhuis authored
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
14b04b0 ry Remove SCONS deprecate WAF
ry authored
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
dc75232 Nathan Rajlich vcbuild: run the 'configure' script in vcbuild.bat
TooTallNate authored
154 def host_arch_cc():
155 """Host architecture check using the CC command."""
19133ca Nathan Rajlich build: better host_arch() definition in configure
TooTallNate authored
156
792d9a9 Javier Hernández Antúnez build: print error message if no compiler found
javihernandez authored
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
19133ca Nathan Rajlich build: better host_arch() definition in configure
TooTallNate authored
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',
09ccbef Karl Skomski build: detect host_arch better
Skomski authored
189 }
190
19133ca Nathan Rajlich build: better host_arch() definition in configure
TooTallNate authored
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
09ccbef Karl Skomski build: detect host_arch better
Skomski authored
197
19133ca Nathan Rajlich build: better host_arch() definition in configure
TooTallNate authored
198 return rtn
14b04b0 ry Remove SCONS deprecate WAF
ry authored
199
200
dc75232 Nathan Rajlich vcbuild: run the 'configure' script in vcbuild.bat
TooTallNate authored
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
14b04b0 ry Remove SCONS deprecate WAF
ry authored
224 def target_arch():
225 return host_arch()
226
c9676c9 Sadique Ali build: improve c compiler detection
sdqali authored
227 def cc_version():
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
228 try:
5062741 Ben Noordhuis build: make CC command in -fstrict-aliasing check configurable
bnoordhuis authored
229 proc = subprocess.Popen([CC, '-v'], stderr=subprocess.PIPE)
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
230 except OSError:
231 return None
c9676c9 Sadique Ali build: improve c compiler detection
sdqali authored
232 lines = proc.communicate()[1].split('\n')
233 version_line = None
234 for i, line in enumerate(lines):
235 if 'version' in line:
236 version_line = line
237 if not version_line:
238 return None
239 version = version_line.split("version")[1].strip().split()[0].split(".")
240 if not version:
241 return None
242 return ['LLVM' in version_line] + version
14b04b0 ry Remove SCONS deprecate WAF
ry authored
243
244 def configure_node(o):
93465d3 Ben Noordhuis build: support --dest-cpu configure switch again
bnoordhuis authored
245 # TODO add gdb
14b04b0 ry Remove SCONS deprecate WAF
ry authored
246 o['variables']['node_prefix'] = options.prefix if options.prefix else ''
a9f2c4a Fedor Indutny --without-npm option
indutny authored
247 o['variables']['node_install_npm'] = b(not options.without_npm)
6e76a7c Fedor Indutny installer: install node-waf
indutny authored
248 o['variables']['node_install_waf'] = b(not options.without_waf)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
249 o['variables']['host_arch'] = host_arch()
93465d3 Ben Noordhuis build: support --dest-cpu configure switch again
bnoordhuis authored
250 o['variables']['target_arch'] = options.dest_cpu or target_arch()
680d75a Shigeki Ohtsu build: make default_configuration consistent with BUILDTYPE
shigeki authored
251 o['default_configuration'] = 'Debug' if options.debug else 'Release'
14b04b0 ry Remove SCONS deprecate WAF
ry authored
252
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
253 # turn off strict aliasing if gcc < 4.6.0 unless it's llvm-gcc
254 # see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45883
255 # see http://code.google.com/p/v8/issues/detail?id=884
5062741 Ben Noordhuis build: make CC command in -fstrict-aliasing check configurable
bnoordhuis authored
256 o['variables']['strict_aliasing'] = b(
c9676c9 Sadique Ali build: improve c compiler detection
sdqali authored
257 'clang' in CC or cc_version() >= [False, 4, 6, 0])
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
258
5ebc05f Ben Noordhuis build: disable -fvisibility=hidden if gcc < 4.0.0
bnoordhuis authored
259 # clang has always supported -fvisibility=hidden, right?
c9676c9 Sadique Ali build: improve c compiler detection
sdqali authored
260 if 'clang' not in CC and cc_version() < [False, 4, 0, 0]:
5ebc05f Ben Noordhuis build: disable -fvisibility=hidden if gcc < 4.0.0
bnoordhuis authored
261 o['variables']['visibility'] = ''
30b29d8 Ben Noordhuis build: disable -fstrict-aliasing if gcc < 4.6.0
bnoordhuis authored
262
cc15299 David Pacheco build: add support for DTrace and postmortem
davepacheco authored
263 # By default, enable DTrace on SunOS systems. Don't allow it on other
264 # systems, since it won't work. (The MacOS build process is different than
265 # SunOS, and we haven't implemented it.)
266 if sys.platform.startswith('sunos'):
267 o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
c393853 isaacs build: Set strict_aliasing on SunOS always
isaacs authored
268 # Strict aliasing causes problems with the V8 snapshots on SunOS
269 o['variables']['strict_aliasing'] = b(False);
cc15299 David Pacheco build: add support for DTrace and postmortem
davepacheco authored
270 elif b(options.with_dtrace) == 'true':
271 raise Exception('DTrace is currently only supported on SunOS systems.')
272 else:
273 o['variables']['node_use_dtrace'] = 'false'
274
14b04b0 ry Remove SCONS deprecate WAF
ry authored
275
276 def configure_libz(o):
d03b848 T.C. Hollingsworth build: support shared zlib
tchollingsworth authored
277 o['variables']['node_shared_zlib'] = b(options.shared_zlib)
278
279 # assume shared_zlib if one of these is set?
280 if options.shared_zlib_libpath:
281 o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
282 if options.shared_zlib_libname:
283 o['libraries'] += ['-l%s' % options.shared_zlib_libname]
284 elif options.shared_zlib:
285 o['libraries'] += ['-lz']
286 if options.shared_zlib_includes:
287 o['include_dirs'] += [options.shared_zlib_includes]
14b04b0 ry Remove SCONS deprecate WAF
ry authored
288
289
290 def configure_v8(o):
a033261 Ben Noordhuis build: DRY configure script
bnoordhuis authored
291 o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
292 o['variables']['node_shared_v8'] = b(options.shared_v8)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
293
294 # assume shared_v8 if one of these is set?
295 if options.shared_v8_libpath:
296 o['libraries'] += ['-L%s' % options.shared_v8_libpath]
297 if options.shared_v8_libname:
298 o['libraries'] += ['-l%s' % options.shared_v8_libname]
59ecf2c isaacs Revert "Revert "build: support shared V8 properly""
isaacs authored
299 elif options.shared_v8:
300 o['libraries'] += ['-lv8']
14b04b0 ry Remove SCONS deprecate WAF
ry authored
301 if options.shared_v8_includes:
302 o['include_dirs'] += [options.shared_v8_includes]
59ecf2c isaacs Revert "Revert "build: support shared V8 properly""
isaacs authored
303 o['variables']['node_shared_v8_includes'] = options.shared_v8_includes
14b04b0 ry Remove SCONS deprecate WAF
ry authored
304
305
306 def configure_openssl(o):
a033261 Ben Noordhuis build: DRY configure script
bnoordhuis authored
307 o['variables']['node_use_openssl'] = b(not options.without_ssl)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
308
309 if options.without_ssl:
310 return
311
312 if options.no_ssl2:
313 o['defines'] += ['OPENSSL_NO_SSL2=1']
314
e61de70 ry gyp: use built-in openssl by default
ry authored
315 if not options.openssl_use_sys:
316 o['variables']['node_use_system_openssl'] = b(False)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
317 else:
e61de70 ry gyp: use built-in openssl by default
ry authored
318 out = pkg_config('openssl')
319 (libs, cflags) = out if out else ('', '')
14b04b0 ry Remove SCONS deprecate WAF
ry authored
320
e61de70 ry gyp: use built-in openssl by default
ry authored
321 if options.openssl_libpath:
322 o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto']
323 else:
324 o['libraries'] += libs.split()
325
326 if options.openssl_includes:
327 o['include_dirs'] += [options.openssl_includes]
328 else:
329 o['cflags'] += cflags.split()
14b04b0 ry Remove SCONS deprecate WAF
ry authored
330
e61de70 ry gyp: use built-in openssl by default
ry authored
331 o['variables']['node_use_system_openssl'] = b(
332 libs or cflags or options.openssl_libpath or options.openssl_includes)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
333
334
335 output = {
336 'variables': {},
337 'include_dirs': [],
338 'libraries': [],
339 'defines': [],
340 'cflags': [],
341 }
342
343 configure_node(output)
344 configure_libz(output)
345 configure_v8(output)
346 configure_openssl(output)
347
348 # variables should be a root level element,
349 # move everything else to target_defaults
350 variables = output['variables']
351 del output['variables']
352 output = {
353 'variables': variables,
354 'target_defaults': output
355 }
624f70e ry GYP: rename options.gypi to config.gypi
ry authored
356 pprint.pprint(output, indent=2)
14b04b0 ry Remove SCONS deprecate WAF
ry authored
357
e493b29 Ben Noordhuis build: respect --debug configure switch
bnoordhuis authored
358 def write(filename, data):
359 filename = os.path.join(root_dir, filename)
360 print "creating ", filename
fdeeabb Nathan Rajlich configure: don't use "with" for Python 2.5 and older
TooTallNate authored
361 f = open(filename, 'w+')
362 f.write(data)
e493b29 Ben Noordhuis build: respect --debug configure switch
bnoordhuis authored
363
364 write('config.gypi', "# Do not edit. Generated by the configure script.\n" +
9b7a6c5 Nathan Rajlich configure: output a newline at the end of config.gypi
TooTallNate authored
365 pprint.pformat(output, indent=2) + "\n")
e493b29 Ben Noordhuis build: respect --debug configure switch
bnoordhuis authored
366
367 write('config.mk', "# Do not edit. Generated by the configure script.\n" +
368 ("BUILDTYPE=%s\n" % ('Debug' if options.debug else 'Release')))
97c9745 ry Back to WAF
ry authored
369
dc75232 Nathan Rajlich vcbuild: run the 'configure' script in vcbuild.bat
TooTallNate authored
370 if os.name == 'nt':
371 subprocess.call(['python', 'tools/gyp_node', '-f', 'msvs',
372 '-G', 'msvs_version=2010'])
373 else:
374 subprocess.call(['tools/gyp_node', '-f', 'make'])
Something went wrong with that request. Please try again.