Home | History | Annotate | Download | only in win
      1 #!/usr/bin/env python
      2 # Copyright 2016 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 hashlib
      7 import os
      8 import shutil
      9 import sys
     10 
     11 script_dir = os.path.dirname(os.path.realpath(__file__))
     12 src_build_dir = os.path.abspath(os.path.join(script_dir, os.pardir))
     13 sys.path.insert(0, src_build_dir)
     14 
     15 import vs_toolchain
     16 
     17 
     18 def _HexDigest(file_name):
     19   hasher = hashlib.sha256()
     20   afile = open(file_name, 'rb')
     21   blocksize = 65536
     22   buf = afile.read(blocksize)
     23   while len(buf) > 0:
     24     hasher.update(buf)
     25     buf = afile.read(blocksize)
     26   afile.close()
     27   return hasher.hexdigest()
     28 
     29 
     30 def _CopyImpl(file_name, target_dir, source_dir, verbose=False):
     31   """Copy |source| to |target| if it doesn't already exist or if it
     32   needs to be updated.
     33   """
     34   target = os.path.join(target_dir, file_name)
     35   source = os.path.join(source_dir, file_name)
     36   if (os.path.isdir(os.path.dirname(target)) and
     37       ((not os.path.isfile(target)) or
     38        _HexDigest(source) != _HexDigest(target))):
     39     if verbose:
     40       print 'Copying %s to %s...' % (source, target)
     41     if os.path.exists(target):
     42       os.unlink(target)
     43     shutil.copy(source, target)
     44 
     45 
     46 def _CopyCDBToOutput(output_dir, target_arch):
     47   """Copies the Windows debugging executable cdb.exe to the output
     48   directory, which is created if it does not exist. The output
     49   directory, and target architecture that should be copied, are
     50   passed. Supported values for the target architecture are the GYP
     51   values "ia32" and "x64" and the GN values "x86" and "x64".
     52   """
     53   if not os.path.isdir(output_dir):
     54     os.makedirs(output_dir)
     55   vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs()
     56   win_sdk_dir = os.path.normpath(os.environ['WINDOWSSDKDIR'])
     57   if target_arch == 'ia32' or target_arch == 'x86':
     58     src_arch = 'x86'
     59   elif target_arch == 'x64':
     60     src_arch = 'x64'
     61   else:
     62     print 'copy_cdb_to_output.py: unknown target_arch %s' % target_arch
     63     sys.exit(1)
     64   # We need to copy multiple files, so cache the computed source directory.
     65   src_dir = os.path.join(win_sdk_dir, 'Debuggers', src_arch)
     66   # Note that the outputs from the "copy_cdb_to_output" target need to
     67   # be kept in sync with this list.
     68   _CopyImpl('cdb.exe', output_dir, src_dir)
     69   _CopyImpl('dbgeng.dll', output_dir, src_dir)
     70   _CopyImpl('dbghelp.dll', output_dir, src_dir)
     71   _CopyImpl('dbgmodel.dll', output_dir, src_dir)
     72   return 0
     73 
     74 
     75 def main():
     76   if len(sys.argv) < 2:
     77     print >>sys.stderr, 'Usage: copy_cdb_to_output.py <output_dir> ' + \
     78         '<target_arch>'
     79     return 1
     80   return _CopyCDBToOutput(sys.argv[1], sys.argv[2])
     81 
     82 
     83 if __name__ == '__main__':
     84   sys.exit(main())
     85