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