support visual studio 10
[charm.git] / src / arch / win64 / unix2nt_cc
1 #!/bin/sh
2 ##############################################################################
3 # unix2nt_cc:  for VC++ ver 8 and later (VS 2003, 2008, 2010)
4 # Maps UNIX C/C++ compiler command-line options to 
5 # Microsoft Visual C++ command line options.
6 # That is, this script is a UNIX-ifying wrapper for 
7 # the NT CL and LINK commands. 
8 #
9 # Known bugs: pathnames with spaces cause quoting problems.
10 ##############################################################################
11
12 #TMP environment variable seems get lost in sub shell
13 export TMP=`cygpath -w /tmp`
14 export TEMP=`cygpath -w /tmp`
15 if [ ! -d "$TMP" ]
16 then
17         echo "Error no $TMP"
18         echo "unix2nt_cc exiting..." 1>&2
19         exit 1
20 fi
21
22 # Configurable option: Location of MSDEV
23 if test -z "$VCINSTALLDIR"
24 then
25   VCC_DIR="C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC"
26 else
27   VCC_DIR=$VCINSTALLDIR
28 fi
29 if test ! -d "`cygpath -u "$VCC_DIR"`"
30 then
31   echo VCC_DIR: $VCC_DIR is not set properly!
32   exit 1
33 fi
34 if test -n "$WINDOWSSDKDIR"
35 then
36   SDK_DIR=$WINDOWSSDKDIR
37 elif test -n "$WindowsSdkDir"
38 then
39   SDK_DIR=$WindowsSdkDir
40 else
41   SDK_DIR="C:/Program Files/Microsoft SDKs/Windows/v6.0A"
42 fi
43 if test ! -d "`cygpath -u "$SDK_DIR"`"
44 then
45   echo SDK_DIR: $SDK_DIR is not set properly!
46   exit 1
47 fi
48
49 #CL command-line options for -O and -g mode
50 #only for the environment that has set corresponding environmental variables
51 CL_CMD="CL.EXE"
52 CL_COMMON=' /nologo /W1 /EHsc /D_WINDOWS'
53 CL_COMMON="$CL_COMMON /I`cygpath -d \"$SDK_DIR/Include\"`"
54 CL_COMMON="$CL_COMMON /I`cygpath -d \"$VCC_DIR/Include\"`"
55 CL_O=$CL_COMMON" /DNDEBUG /MT /Ox"
56 CL_DEF=$CL_COMMON" /MT"
57 CL_G=$CL_COMMON" /Z7 /MTd /Od"
58 CL_DLL="/LD"
59
60 #LINK command-line options for -O and -g mode
61 #only for the environment that has set corresponding environmental variables
62 #Here, the full path to "link.exe" has to be added because, in cygwin, there
63 #is a file "/usr/bin/link" which has the same name, and takes higher precedence
64 #than the microsoft one.
65 #LINK_CMD="link.exe"
66 if test -d "`cygpath -u \"$VCC_DIR/BIN/amd64\"`"
67 then
68 LINK_CMD="$VCC_DIR/BIN/amd64/LINK.EXE"
69 else
70 LINK_CMD="$VCC_DIR/BIN/LINK.EXE"
71 fi
72 LINK_COMMON='/nologo /subsystem:console '
73 if test -d "`cygpath -u \"$SDK_DIR/Lib/x64\"`"
74 then
75 LINK_COMMON="$LINK_COMMON /LIBPATH:`cygpath -d \"$SDK_DIR/Lib/x64\"`"
76 else
77 LINK_COMMON="$LINK_COMMON /LIBPATH:`cygpath -d \"$VCC_DIR/Lib/\"`"
78 fi
79 LINK_O=$LINK_COMMON
80 LINK_DEF=$LINK_COMMON
81 LINK_G="$LINK_COMMON /DEBUG"
82 #LINK_POST='ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib 
83 #  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib 
84 #  odbc32.lib odbccp32.lib /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /MACHINE:IX86 '
85 LINK_POST='ws2_32.lib kernel32.lib user32.lib psapi.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /MACHINE:X64 /ERRORREPORT:PROMPT '
86
87 if [ "x$LIB" = "x" ]
88 then
89         echo "Variables already set!"
90 #       export INCLUDE="$VCC_DIR/include"
91 #       export LIB="$VCC_DIR/lib"
92 fi
93
94 ###################################################################
95 #
96 #  Utility routines used below
97 #
98 ###################################################################
99
100 # PrintUsage: prints a helpful command-line usage message and quits
101 # Args: any additional messages
102 printUsage() {
103     echo "Usage: unix2nt_cc [ flags ] <files>"
104     echo
105     echo "  flags:"
106     echo "        -c <file> -o <target> -g -O"
107     echo "        -D<define> -I<include path> -L<lib path> -l<library>"
108         echo "  files: <fName>.c <fName>.C <fName>.cpp <fName>.cxx"
109     echo
110     echo "  Compiles C, C++ programs using NT CL and LINK commands."
111         echo "Version 1.0, Parallel Programming Lab, UIUC, 2001"
112     echo $*
113     exit 1
114 }
115
116 # End blows away the temporary files (unless SAVE is true) and exits
117 # Args: <exit code>
118 End() {
119     exit $1
120 }
121
122 # This procedure prints an error message and exits.
123 # ("1>&2" redirects the echo output to stderr).
124 # Args: written to stderr
125 Abort() {
126         echo "unix2nt_cc Fatal Error in directory "`pwd` 1>&2
127         echo "   $*" 1>&2
128         echo "unix2nt_cc exiting..." 1>&2
129         End 1
130 }
131
132 # This procedure removes the extention (the ".c" in "./main.c") from
133 # its first argument, and prints the result. Unlike the builtin command
134 # basename, it keeps the directory path.
135 # Args: <name to strip>
136 stripExtention() {
137         se_base=`echo $1 | awk -F/ '{print $NF}'`
138         se_strip=`echo $se_base | awk -F. '{ORS="";print $1;for (i=2;i<NF;i++) print "."$i}'`
139         se_ret=`echo $1 | awk -F/ '{ORS="";for (i=1;i<NF;i++) print $i"/"}'`"$se_strip"
140         echo $se_ret
141 }
142
143 # GetExtention returns the extention on the given file name
144 # or "" if none.  (e.g. "./bob/snack.c" returns ".c")
145 # Args: <name to find extention of>
146 getExtention() {
147         se_base=`echo $1 | awk -F/ '{print $NF}'`
148         se_ret=`echo $se_base | awk -F. '{if (NF<=1) print ""; else print "."$NF}'`
149         echo $se_ret
150 }
151
152 ##############################################################################
153 #
154 # Parse & convert the arguments
155 #
156 ##############################################################################
157
158 #Program state:
159 VERBOSE="no"
160 DEBUG_SCRIPT=""
161 SAVE=""
162
163 DOCOMPILE="no"
164 DOLINK="no"
165 OUTPUT=""
166 CL_OPTS=$CL_DEF
167 LINK_OPTS=$LINK_DEF
168 LIBDIR=""
169 LIBDIRS=""
170
171 #NT CL and LINK command-line arguments:
172 LINK=""
173 CL=""
174
175 [ $# -eq 0 ] && printUsage "Error: No arguments given."
176
177 while [ ! $# -eq 0 ]
178 do
179         arg="$1"
180         shift
181
182         case "$arg" in
183         -verbose)
184                 VERBOSE="yes"
185                 ;;
186         -E)
187                 CL="$CL /E"
188                 ;;
189         -O|-O1|-O2|-O3)
190                 CL_OPTS=$CL_O
191                 LINK_OPTS=$LINK_O
192                 ;;
193         -g)
194                 CL_OPTS=$CL_G
195                 LINK_OPTS=$LINK_G
196                 ;;
197         -c) 
198                 CL="$CL /c";;
199         -D)
200                 CL="$CL /D$1"
201                 shift
202                 ;;
203         -D*)
204                 def=`echo $arg | awk -F@ '{print substr($1,3)}'`
205                 CL="$CL /D$def"
206                 ;;
207         -I)
208                 CL="$CL /I`cygpath -w $1`"
209                 shift
210                 ;;
211         -I*)
212                 path=`echo $arg | awk -F@ '{print substr($1,3)}'`
213                 CL="$CL /I`cygpath -w $path`"
214                 ;;
215         -L)
216                 LIBDIR="`cygpath -w $1`"
217                 LIBDIRS="$LIBDIRS `cygpath -u $LIBDIR`"
218                 LINK=$LINK"     /LIBPATH:$LIBDIR"
219                 shift
220                 ;;
221         -L*)
222                 LIBDIR=`echo $arg | awk -F@ '{print substr($1,3)}'`
223                 LIBDIR="`cygpath -w $LIBDIR`"
224                 LIBDIRS="$LIBDIRS `cygpath -u $LIBDIR`"
225                 LINK=$LINK"     /LIBPATH:$LIBDIR"
226                 ;;
227         -l*)
228                 if [ "$arg" != "-lm" ]
229                 then
230 #Convert -lfoo to path-to-foo.a
231                         L=`echo $arg | awk -F@ '{print substr($1,3)}'`
232                         D="no"
233                         [ -r "$L" ] && D="$L"
234                         [ -r "$L.a" ] && D="$L.a"
235                         [ -r "$L.lib" ] && D="$L.lib"
236                         [ -r "lib$L.a" ] && D="lib$L.a"
237                         [ -r "lib$L.lib" ] && D="lib$L.lib"
238                         test -n "$LIBDIRS" &&   \
239                         for dir in $LIBDIRS
240                         do
241                           [ -r "$dir/lib$L" ] && D="$dir/lib$L"
242                           [ -r "$dir/lib$L.a" ] && D="$dir/lib$L.a"
243                           [ -r "$dir/$L.lib" ] && D="$dir/$L.lib"
244                           [ -r "$dir/lib$L.lib" ] && D="$dir/lib$L.lib"
245                         done
246                         [ $D = no ] && Abort "Couldn't find library $L in . or $LIBDIRS"
247                         LINK="$LINK `cygpath -w $D`"
248                 fi
249                 ;;
250         -o)
251                 out=$1
252                 shift
253                 if [ "x`getExtention $out`" = "x.o" ]
254                 then
255 #It's a .o output filename-- tell CL
256                         OUTPUT="/Fo`cygpath -w $out`"
257                 elif [ "x`getExtention $out`" = "x.obj" ]
258                 then
259                         OUTPUT="/Fo`cygpath -w $out`"
260                 elif [ "x`getExtention $out`" = "x.so" ]
261                 then
262                         OUTPUT="/Fo`cygpath -w $out`"
263                 elif [ "x`getExtention $out`" = "x.exe" ]
264                 then
265                         LINK="$LINK /out:$out"
266                         DOLINK="yes"
267                 else
268 #It's an exe filename-- tell LINK
269                         LINK="$LINK /out:$out.exe"
270                         DOLINK="yes"
271                 fi
272                 ;;
273         
274 #Object file or library-- add to link
275         *.o|*.a|*.lib|*.obj)
276                 if [ "$DOCOMPILE" = "yes" ]
277                 then
278                   CL="$CL `cygpath -w $arg`"
279                 else
280                   LINK="$LINK `cygpath -w $arg`"
281                   DOLINK="yes"
282                 fi
283                 ;;
284 #C source file
285         *.c)
286                 base=`stripExtention $arg`
287                 CL="$CL /Tc`cygpath -w $arg`"
288                 OBJ_OUTPUT="/Fo$base.o"
289                 LINK="$LINK $base.o"
290                 DOCOMPILE="yes"
291                 ;;
292 #C++ source file
293         *.C|*.cxx|*.cpp)
294                 base=`stripExtention $arg`
295                 CL="$CL /Tp`cygpath -w $arg`"
296 #               OUTPUT="/Fo$base.o"
297                 LINK="$LINK $base.o"
298                 DOCOMPILE="yes"
299                 ;;
300 # Default
301         *)
302 #               printUsage  "Error: Unrecognized argument $arg"
303                 echo  "Ignored Unrecognized argument $arg"
304                 ;;
305         esac
306 done
307
308 #if [ "x$CL" != "x" ]
309 if [ $DOCOMPILE = yes ]
310 then
311         OPTS="$CL_OPTS $OUTPUT $CL"
312         [ "$DOLINK" = yes -a -z "$OUTPUT" ] && OPTS="$OPTS $OBJ_OUTPUT"
313         [ $VERBOSE = yes ] && echo "unix2nt_cc> $CL_CMD" $OPTS
314         "$CL_CMD" $OPTS
315         if [ $? != 0 ]
316         then
317                 Abort "Error executing" "$CL_CMD" $OPTS
318         fi
319 fi
320
321 if [ $DOLINK = yes ]
322 then
323         OPTS="$LINK_OPTS $LINK $LINK_POST"
324         [ $VERBOSE = yes ] && echo "unix2nt_cc> $LINK_CMD" $OPTS
325         "$LINK_CMD" $OPTS
326         if [ $? != 0 ]
327         then
328                 Abort "Error executing" "$LINK_CMD" $OPTS 
329         fi      
330 fi
331
332 exit 0