#!/bin/sh # cccl # Wrapper around MS's cl.exe and link.exe to make them act more like # Unix cc and ld # # Copyright (C) 2000-2003 Geoffrey Wossum (gwossum@acm.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # usage() { cat <<EOF Usage: cccl [OPTIONS] cccl is a wrapper around Microsoft's cl.exe and link.exe. It translates parameters that Unix cc's and ld's understand to parameters that cl and link understand. EOF exit $1 } case $MACHTYPE in *-msys) slash="//" ;; *) slash="/" ;; esac # prog specifies the program that should be run (cl.exe or link.exe) # We'll assume cl to start out prog=cl # opts specifies the command line to pass to the MSVC program clopt="${slash}nologo" linkopt="${slash}nologo" # gotparam is 0 if we didn't ever see a param, in which case we show usage() gotparam= # We want exceptions clopt="$clopt ${slash}EHsc" ### Run through every option and convert it to the proper MS one while test $# -gt 0; do case "$1" in -D*) optarg= ;; -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac gotparam=1 case "$1" in --version) cat <<EOF cccl 0.03 Copyright 2000-2003 Geoffrey Wossum This is free software; see the source for copying conditions. There is NO waranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EOF exit 1; ;; -ansi) clopt="$clopt ${slash}Za" ;; -c) # -c (compile only) is actually the same, but for clarity... clopt="$clopt ${slash}c" ;; -g[0-9] | -g) # cl only supports one debugging level clopt="$clopt ${slash}Zi ${slash}MDd" ;; -L*) path=`echo "$1" | sed 's/-L//'` linkopt="$linkopt /LIBPATH:$path" ;; -l*) lib=`echo "$1" | sed 's/-l//'` if [ $lib != "dnsapi" -a $lib != "ws2_32" -a $lib != "wsock32" ]; then lib="lib$lib.lib" else lib="$lib.lib" fi clopt="$clopt $lib" linkopt="$linkopt $lib" ;; -m386) clopt="$clopt ${slash}G3" ;; -m486) clopt="$clopt ${slash}G4" ;; -mpentium) clopt="$clopt ${slash}G5" ;; -mpentiumpro) clopt="$clopt ${slash}G6" ;; -o) # specifying output file, is it an object or an executable shift case "$1" in *.o | *.obj) clopt="$clopt ${slash}Fo$1" ;; *) clopt="$clopt ${slash}Fe$1"; linkopt="$linkopt ${slash}out:$1" ;; esac;; -pedantic) #ignore pedantic ;; -W*) #ignore warnings ;; -isystem) shift clopt="$clopt -I$1" ;; -MT) exit 0 ;; -mno-cygwin) ;; *.cc | *.cxx | *.C) # C++ source file with non .cpp extension, make sure cl understand # that it is C++ clopt="$clopt ${slash}Tp$1" ;; *.o | *.obj | *.a | *.lib) # Object files/libraries seen, this command will require link # Switch the prog to link linkopt="$linkopt $1" prog="link" ;; *) clopt="$clopt $1" linkopt="$linkopt $1" if test x$optarg != x ; then clopt="$clopt=$optarg" linkopt="$linkopt=$optarg" fi ;; esac shift done if test x$gotparam = x ; then usage exit 1 fi # choose which opts we built up based on which program will actually run if test x$prog = xcl ; then opts=$clopt else opts=$linkopt fi #echo "$prog $opts" exec $prog $opts exit 0