OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 |
| 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. |
| 6 # |
| 7 # This script takes libcmt.lib for VS2013 and removes the allocation related |
| 8 # functions from it. |
| 9 # |
| 10 # Usage: prep_libc.py <VCLibDir> <OutputDir> <arch> [<environment_file>] |
| 11 # |
| 12 # VCLibDir is the path where VC is installed, something like: |
| 13 # C:\Program Files\Microsoft Visual Studio 8\VC\lib |
| 14 # |
| 15 # OutputDir is the directory where the modified libcmt file should be stored. |
| 16 # arch is one of: 'ia32', 'x86' or 'x64'. ia32 and x86 are synonyms. |
| 17 # |
| 18 # If the environment_file argument is set, the environment variables in the |
| 19 # given file will be used to execute the VC tools. This file is in the same |
| 20 # format as the environment block passed to CreateProcess. |
| 21 |
| 22 import os |
| 23 import shutil |
| 24 import subprocess |
| 25 import sys |
| 26 |
| 27 def run(command, env_dict): |
| 28 """Run |command|. If any lines that match an error condition then |
| 29 terminate. |
| 30 |
| 31 The env_dict, will be used for the environment. None can be used to get the |
| 32 default environment.""" |
| 33 error = 'cannot find member object' |
| 34 # Need shell=True to search the path in env_dict for the executable. |
| 35 popen = subprocess.Popen( |
| 36 command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, |
| 37 env=env_dict) |
| 38 out, _ = popen.communicate() |
| 39 for line in out.splitlines(): |
| 40 print line |
| 41 if error and line.find(error) != -1: |
| 42 print 'prep_libc.py: Error stripping object from C runtime.' |
| 43 sys.exit(1) |
| 44 |
| 45 def main(): |
| 46 bindir = 'SELF_X86' |
| 47 objdir = 'INTEL' |
| 48 vs_install_dir = sys.argv[1] |
| 49 outdir = sys.argv[2] |
| 50 if "x64" in sys.argv[3]: |
| 51 bindir = 'SELF_64_amd64' |
| 52 objdir = 'amd64' |
| 53 vs_install_dir = os.path.join(vs_install_dir, 'amd64') |
| 54 |
| 55 if len(sys.argv) == 5: |
| 56 env_pairs = open(sys.argv[4]).read()[:-2].split('\0') |
| 57 env_dict = dict([item.split('=', 1) for item in env_pairs]) |
| 58 else: |
| 59 env_dict = None # Use the default environment. |
| 60 |
| 61 output_lib = os.path.join(outdir, 'libcmt.lib') |
| 62 shutil.copyfile(os.path.join(vs_install_dir, 'libcmt.lib'), output_lib) |
| 63 shutil.copyfile(os.path.join(vs_install_dir, 'libcmt.pdb'), |
| 64 os.path.join(outdir, 'libcmt.pdb')) |
| 65 cvspath = 'f:\\binaries\\Intermediate\\vctools\\crt_bld\\' + bindir + \ |
| 66 '\\crt\\prebuild\\build\\' + objdir + '\\mt_obj\\nativec\\\\'; |
| 67 cppvspath = 'f:\\binaries\\Intermediate\\vctools\\crt_bld\\' + bindir + \ |
| 68 '\\crt\\prebuild\\build\\' + objdir + '\\mt_obj\\nativecpp\\\\'; |
| 69 |
| 70 cobjfiles = ['malloc', 'free', 'realloc', 'heapinit', 'calloc', 'recalloc', |
| 71 'calloc_impl'] |
| 72 cppobjfiles = ['new', 'new2', 'delete', 'delete2', 'new_mode', 'newopnt', |
| 73 'newaopnt'] |
| 74 for obj in cobjfiles: |
| 75 cmd = ('lib /nologo /ignore:4006,4221 /remove:%s%s.obj %s' % |
| 76 (cvspath, obj, output_lib)) |
| 77 run(cmd, env_dict) |
| 78 for obj in cppobjfiles: |
| 79 cmd = ('lib /nologo /ignore:4006,4221 /remove:%s%s.obj %s' % |
| 80 (cppvspath, obj, output_lib)) |
| 81 run(cmd, env_dict) |
| 82 |
| 83 if __name__ == "__main__": |
| 84 sys.exit(main()) |
OLD | NEW |