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