2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 """Launch a local server on an ephemeral port, then launch a executable that
19 if sys
.version_info
< (2, 6, 0):
20 sys
.stderr
.write("python 2.6 or later is required run this script\n")
25 usage
= """usage: %prog [options] -- executable args...
27 This command creates a local server on an ephemeral port, then runs:
28 <executable> <args..> http://localhost:<port>/<page>.
30 Where <page> can be set by -P, or uses index.html by default."""
31 parser
= optparse
.OptionParser(usage
)
32 parser
.add_option('-C', '--serve-dir',
33 help='Serve files out of this directory.',
34 dest
='serve_dir', default
=os
.path
.abspath('.'))
35 parser
.add_option('-P', '--path', help='Path to load from local server.',
36 dest
='path', default
='index.html')
37 parser
.add_option('-D',
38 help='Add debug command-line when launching the chrome debug.',
39 dest
='debug', action
='append', default
=[])
40 parser
.add_option('-E',
41 help='Add environment variables when launching the executable.',
42 dest
='environ', action
='append', default
=[])
43 parser
.add_option('-p', '--port',
44 help='Port to run server on. Default is 5103, ephemeral is 0.',
45 type='int', default
=5103)
46 options
, args
= parser
.parse_args(args
)
48 parser
.error('No executable given.')
50 # 0 means use an ephemeral port.
51 server
= httpd
.LocalHTTPServer(options
.serve_dir
, options
.port
)
52 print 'Serving %s on %s...' % (options
.serve_dir
, server
.GetURL(''))
54 env
= copy
.copy(os
.environ
)
55 for e
in options
.environ
:
56 key
, value
= map(str.strip
, e
.split('='))
59 cmd
= args
+ [server
.GetURL(options
.path
)]
60 print 'Running: %s...' % (' '.join(cmd
),)
61 process
= subprocess
.Popen(cmd
, env
=env
)
63 # If any debug args are passed in, assume we want to debug
65 if getos
.GetPlatform() == 'linux':
66 cmd
= ['xterm', '-title', 'NaCl Debugger', '-e']
68 elif getos
.GetPlatform() == 'mac':
69 cmd
= ['osascript', '-e',
70 'tell application "Terminal" to do script "%s"' %
71 ' '.join(r
'\"%s\"' % x
for x
in options
.debug
)]
72 elif getos
.GetPlatform() == 'win':
73 cmd
= ['cmd.exe', '/c', 'start', 'cmd.exe', '/c']
75 print 'Starting debugger: ' + ' '.join(cmd
)
76 debug_process
= subprocess
.Popen(cmd
, env
=env
)
81 return server
.ServeUntilSubprocessDies(process
)
83 if process
.returncode
is None:
85 if debug_process
and debug_process
.returncode
is None:
88 if __name__
== '__main__':
89 sys
.exit(main(sys
.argv
[1:]))