summaryrefslogtreecommitdiff
path: root/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
blob: 69fd2d54413e975352b54f026fe8c7f102051d3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python
#
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
#
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#

#
# ARMCC tools do not support cygwin paths. Ths script converts cygwin paths to DOS paths
# in any arguments. 
#
# armcc_wrapper.py ToolToExec [command line to convert]
#
# anthing with the / will be converted via cygpath cygwin call or manually. 
# -I/cygpath/c/example is a special case as you can not pass -I to cygpath
#
# ExceptionList if a tool takes an argument with a / add it to the exception list
#
import sys
import os
import subprocess
import pipes

#
# Convert using cygpath command line tool
# Currently not used, but just in case we need it in the future
#
def ConvertCygPathToDosViacygpath(CygPath):
  p = subprocess.Popen("cygpath -m " + pipes.quote(CygPath), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
  return p.stdout.read().strip()

#
#
#
def ConvertCygPathToDos(CygPath):
  if CygPath.find("/cygdrive/") == 0:
    # convert /cygdrive/c/Xyz to c:/Xyz
    DosPath = CygPath[10] + ':' + CygPath[11:]
  else:
    DosPath = CygPath
  
  # pipes.quote will add the extra \\ for us.
  return DosPath.replace('/','\\')


# we receive our options as a list, but we will be passing them to the shell as a line
# this means we have to requote things as they will get one round of unquoting.
# we can't set "shell=False" because we are running commands from the PATH and
# if you don't use the shell you don't get a PATH search.
def main(argv):

  # use 1st argument as name of tool to call
  Command = pipes.quote(sys.argv[1]);
  
  ExceptionList = ["/interwork"]
  
  for arg in argv:
    if arg.find('/') == -1:
      # if we don't need to convert just add to the command line
      Command = Command + ' ' + pipes.quote(arg)
    elif arg in ExceptionList:
      # if it is in the list, then don't do a cygpath
      # assembler stuff after --apcs has the /.
      Command = Command + ' ' + pipes.quote(arg)
    else:
      if ((arg[0] == '-') and (arg[1] == 'I' or arg[1] == 'i')):
        CygPath = arg[0] + arg[1] + ConvertCygPathToDos(arg[2:])
      else:
        CygPath = ConvertCygPathToDos(arg)

      Command = Command + ' ' + pipes.quote(CygPath)
    
  # call the real tool with the converted paths
  return subprocess.call(Command, shell=True)

 
if __name__ == "__main__":
  try:
     ret = main(sys.argv[2:])

  except:
    print "exiting: exception from " + sys.argv[0]
    ret = 2

  sys.exit(ret)