OLD | NEW |
---|---|
(Empty) | |
1 #!/usr/bin/env python | |
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. | |
5 | |
6 import glob | |
7 import os | |
8 import shutil | |
9 import subprocess | |
10 import sys | |
11 import tempfile | |
12 | |
13 BUILD_DIR = 'build' | |
14 | |
15 | |
16 def run_with_vsvars(cmd, tmpdir=None): | |
17 fd, filename = tempfile.mkstemp('.bat', text=True) | |
18 with os.fdopen(fd, 'w') as f: | |
19 print >> f, '@echo off' | |
20 print >> f, r'call "%VS100COMNTOOLS%\vsvars32.bat"' | |
21 if tmpdir: | |
22 print >> f, r'cd %s' % tmpdir | |
23 print >> f, cmd | |
24 try: | |
25 p = subprocess.Popen([filename], shell=True, stdout=subprocess.PIPE, | |
26 universal_newlines=True) | |
27 out, _ = p.communicate() | |
28 return p.returncode, out | |
29 finally: | |
30 os.unlink(filename) | |
31 | |
32 | |
33 def get_vc_dir(): | |
34 _, out = run_with_vsvars('echo VCINSTALLDIR=%VCINSTALLDIR%') | |
35 for line in out.splitlines(): # pylint: disable-msg=E1103 | |
36 if line.startswith('VCINSTALLDIR='): | |
37 return line[len('VCINSTALLDIR='):] | |
38 return None | |
39 | |
40 | |
41 def build(infile): | |
42 if not os.path.exists(BUILD_DIR): | |
43 os.makedirs(BUILD_DIR) | |
44 outfile = 'limiter.exe' | |
45 outpath = os.path.join(BUILD_DIR, outfile) | |
46 cpptime = os.path.getmtime(infile) | |
47 if not os.path.exists(outpath) or cpptime > os.path.getmtime(outpath): | |
48 print 'Building %s...' % outfile | |
49 rc, out = run_with_vsvars( | |
50 'cl /nologo /Ox /Zi /W4 /WX /D_UNICODE /DUNICODE' | |
51 ' /D_CRT_SECURE_NO_WARNINGS /EHsc %s /link /out:%s' | |
52 % (os.path.join('..', infile), outfile), BUILD_DIR) | |
53 if rc: | |
54 print out | |
55 print 'Failed to build %s' % outfile | |
56 sys.exit(1) | |
57 else: | |
58 print '%s already built' % outfile | |
59 return outpath | |
60 | |
61 | |
62 def main(): | |
63 # Switch to our own dir. | |
64 os.chdir(os.path.dirname(os.path.abspath(__file__))) | |
65 | |
66 if sys.argv[-1] == 'clean': | |
67 if os.path.exists(BUILD_DIR): | |
68 shutil.rmtree(BUILD_DIR) | |
69 for exe in glob.glob('*.exe'): | |
70 os.unlink(exe) | |
71 return 0 | |
72 | |
73 vcdir = os.environ.get('VCINSTALLDIR') | |
74 if not vcdir: | |
75 vcdir = get_vc_dir() | |
76 if not vcdir: | |
77 print "Couldn't get VCINSTALLDIR. Run vsvars32.bat?" | |
cmp
2012/08/01 23:36:42
nit: single quotes
iannucci1
2012/08/01 23:52:39
even for the contained "'"?
cmp
2012/08/02 00:00:04
Thanks for pointing that out, I overlooked it. I'
| |
78 return 1 | |
79 os.environ['PATH'] += (';' + os.path.join(vcdir, 'bin') + | |
80 ';' + os.path.join(vcdir, r'..\Common7\IDE')) | |
81 | |
82 # Verify that we can find link.exe. | |
83 link = os.path.join(vcdir, 'bin', 'link.exe') | |
84 if not os.path.exists(link): | |
85 print 'link.exe not found at %s' % link | |
86 return 1 | |
87 | |
88 exe_name = build('limiter.cc') | |
89 for shim_exe in ('lib.exe', 'link.exe'): | |
90 newpath = '%s__LIMITER.exe' % shim_exe | |
91 shutil.copyfile(exe_name, newpath) | |
92 print '%s shim built. Use with msbuild like: "/p:LinkToolExe=%s"' \ | |
93 % (shim_exe, os.path.abspath(newpath)) | |
94 | |
95 return 0 | |
96 | |
97 | |
98 if __name__ == '__main__': | |
99 sys.exit(main()) | |
OLD | NEW |