• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#
3# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4#
5# This program and the accompanying materials
6# are licensed and made available under the terms and conditions of the BSD License
7# which accompanies this distribution.  The full text of the license may be found at
8#
9# http://opensource.org/licenses/bsd-license.php
10#
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13#
14
15#
16# ARMCC tools do not support cygwin paths. Ths script converts cygwin paths to DOS paths
17# in any arguments.
18#
19# armcc_wrapper.py ToolToExec [command line to convert]
20#
21# anthing with the / will be converted via cygpath cygwin call or manually.
22# -I/cygpath/c/example is a special case as you can not pass -I to cygpath
23#
24# ExceptionList if a tool takes an argument with a / add it to the exception list
25#
26import sys
27import os
28import subprocess
29import pipes
30
31#
32# Convert using cygpath command line tool
33# Currently not used, but just in case we need it in the future
34#
35def ConvertCygPathToDosViacygpath(CygPath):
36  p = subprocess.Popen("cygpath -m " + pipes.quote(CygPath), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
37  return p.stdout.read().strip()
38
39#
40#
41#
42def ConvertCygPathToDos(CygPath):
43  if CygPath.find("/cygdrive/") == 0:
44    # convert /cygdrive/c/Xyz to c:/Xyz
45    DosPath = CygPath[10] + ':' + CygPath[11:]
46  else:
47    DosPath = CygPath
48
49  # pipes.quote will add the extra \\ for us.
50  return DosPath.replace('/','\\')
51
52
53# we receive our options as a list, but we will be passing them to the shell as a line
54# this means we have to requote things as they will get one round of unquoting.
55# we can't set "shell=False" because we are running commands from the PATH and
56# if you don't use the shell you don't get a PATH search.
57def main(argv):
58
59  # use 1st argument as name of tool to call
60  Command = pipes.quote(sys.argv[1]);
61
62  ExceptionList = ["/interwork"]
63
64  for arg in argv:
65    if arg.find('/') == -1:
66      # if we don't need to convert just add to the command line
67      Command = Command + ' ' + pipes.quote(arg)
68    elif arg in ExceptionList:
69      # if it is in the list, then don't do a cygpath
70      # assembler stuff after --apcs has the /.
71      Command = Command + ' ' + pipes.quote(arg)
72    else:
73      if ((arg[0] == '-') and (arg[1] == 'I' or arg[1] == 'i')):
74        CygPath = arg[0] + arg[1] + ConvertCygPathToDos(arg[2:])
75      else:
76        CygPath = ConvertCygPathToDos(arg)
77
78      Command = Command + ' ' + pipes.quote(CygPath)
79
80  # call the real tool with the converted paths
81  return subprocess.call(Command, shell=True)
82
83
84if __name__ == "__main__":
85  try:
86     ret = main(sys.argv[2:])
87
88  except:
89    print "exiting: exception from " + sys.argv[0]
90    ret = 2
91
92  sys.exit(ret)
93
94