15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# This script takes libcmt.lib for VS2005/08/10/12/13 and removes the allocation 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# related functions from it. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Usage: prep_libc.py <VCLibDir> <OutputDir> <arch> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# VCLibDir is the path where VC is installed, something like: 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# C:\Program Files\Microsoft Visual Studio 8\VC\lib 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OutputDir is the directory where the modified libcmt file should be stored. 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# arch is one of: 'ia32', 'x86' or 'x64'. ia32 and x86 are synonyms. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import shutil 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import subprocess 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def run(command, filter=None): 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Run |command|, removing any lines that match |filter|. The filter is 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to remove the echoing of input filename that 'lib' does.""" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popen = subprocess.Popen( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out, _ = popen.communicate() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for line in out.splitlines(): 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if filter and line.strip() != filter: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print line 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return popen.returncode 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(): 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bindir = 'SELF_X86' 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) objdir = 'INTEL' 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs_install_dir = sys.argv[1] 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outdir = sys.argv[2] 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if "x64" in sys.argv[3]: 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bindir = 'SELF_64_amd64' 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) objdir = 'amd64' 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vs_install_dir = os.path.join(vs_install_dir, 'amd64') 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_lib = os.path.join(outdir, 'libcmt.lib') 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copyfile(os.path.join(vs_install_dir, 'libcmt.lib'), output_lib) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copyfile(os.path.join(vs_install_dir, 'libcmt.pdb'), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.path.join(outdir, 'libcmt.pdb')) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vspaths = [ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'build\\intel\\mt_obj\\', 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'f:\\dd\\vctools\\crt_bld\\' + bindir + \ 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '\\crt\\src\\build\\' + objdir + '\\mt_obj\\', 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'F:\\dd\\vctools\\crt_bld\\' + bindir + \ 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '\\crt\\src\\build\\' + objdir + '\\mt_obj\\nativec\\\\', 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'F:\\dd\\vctools\\crt_bld\\' + bindir + \ 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '\\crt\\src\\build\\' + objdir + '\\mt_obj\\nativecpp\\\\', 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'f:\\binaries\\Intermediate\\vctools\\crt_bld\\' + bindir + \ 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) '\\crt\\prebuild\\build\\INTEL\\mt_obj\\cpp_obj\\\\', 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ] 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objfiles = ['malloc', 'free', 'realloc', 'new', 'delete', 'new2', 'delete2', 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'align', 'msize', 'heapinit', 'expand', 'heapchk', 'heapwalk', 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'heapmin', 'sbheap', 'calloc', 'recalloc', 'calloc_impl', 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 'new_mode', 'newopnt', 'newaopnt'] 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for obj in objfiles: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for vspath in vspaths: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd = ('lib /nologo /ignore:4006,4014,4221 /remove:%s%s.obj %s' % 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (vspath, obj, output_lib)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run(cmd, obj + '.obj') 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == "__main__": 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(main()) 71