summaryrefslogtreecommitdiffstats
path: root/winsup/utils/mingw
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/utils/mingw')
-rwxr-xr-xwinsup/utils/mingw89
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 "$@"