diff options
Diffstat (limited to 'winsup/utils/mingw')
-rwxr-xr-x | winsup/utils/mingw | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/winsup/utils/mingw b/winsup/utils/mingw new file mode 100755 index 000000000..0c7b9b469 --- /dev/null +++ b/winsup/utils/mingw @@ -0,0 +1,89 @@ +#!/bin/sh +# Front-end kludge to cause a Cygwin gcc to default to +# an installed version of the MinGW components. + +# +# Find the path to the compiler +# +compiler=$1; shift +case "$compiler" in + */*) ;; + *) compiler=($(type "$compiler")) + compiler=${compiler[2]} ;; +esac + +# +# The mingw32 directory should live somewhere close by to the +# compiler. Search for it. +# +updir=$(dirname "$compiler") +dir=$(cd "$updir"/..; pwd) +[ "$dir" = '/' ] && dir='' +mingw_dir='' +for d in "$dir"/*-mingw32 "$dir"/usr/*-mingw32 "$dir"/*-mingw* "$dir"/usr/*-mingw*; do + case "$d" in + *\**) continue ;; + *) mingw_dir=$d; break; + esac +done + +if [ -z "$mingw_dir" ]; then + echo "$0: couldn't find i686-pc-mingw32 directory" 1>&2 + exit 1 +fi + +# +# Inspect each argument throwing away ones that seem to try to include the +# Cygwin environment. +# +newargs=() +sawcomp() { return 1; } +sawcfile() { return 1; } +sawofile() { return 1; } +eatnext() { return 1; } +pushnext() { return 1; } +for f do + if eatnext; then + eatnext() { return 1; } + continue; + fi + if pushnext; then + pushnext() { return 1; } + else + case "$f" in + *cygwin/include*|*newlib*) continue ;; + -c|-E) sawcomp() { return 0; } ;; + -isystem) eatnext() { return 0; }; continue ;; + -o) pushnext() { return 0; } ; /bin/true ;; + -*) ;; + *.cc|*.c) sawcfile() { return 0; } ;; + *.o) sawofile() { return 0; }; /bin/true ;; + esac + fi + newargs[${#newargs[*]}]="$f" +done + +# Set up a new set of arguments + also search the installed mingw +# directory. +set -- -B"$mingw_dir"/lib/ "${newargs[@]}" + +# Add some default options depending on whether this looks like +# an attempt to link, compile, or both. +if sawcomp || sawcfile; then + ccdir=$(dirname $($compiler -print-libgcc-file-name)) + set -- -isystem "$ccdir"/include -D__MINGW32__ -D__MSVCRT__ -DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ -U__CYGWIN__ -Uunix -U__unix__ -U__unix -U __CYGWIN32__ -I"${mingw_dir}"/include "$@" + case "$compiler" in + *++*) set -- -nostdinc++ "$@" ;; + *) set -- -nostdinc "$@" ;; + esac +fi + +if sawofile || ! sawcfile || ! sawcomp; then + w32api=$($compiler -print-file-name=libc.a) + w32api=$(cd $(dirname "$w32api")/w32api; pwd) + set -- "$@" -nostdlib -Wl,-nostdlib -L"$w32api" -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -lmingw32 -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt + { sawofile || sawcfile; } && set -- "$mingw_dir"/lib/crt2.o "$@" +fi + +# Execute the compiler with new mingw-specific options. +exec $compiler "$@" |