summary refs log tree commit diff
path: root/pkgs/stdenv/mingw/gcc-wrapper/builder.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/stdenv/mingw/gcc-wrapper/builder.sh')
-rw-r--r--pkgs/stdenv/mingw/gcc-wrapper/builder.sh91
1 files changed, 91 insertions, 0 deletions
diff --git a/pkgs/stdenv/mingw/gcc-wrapper/builder.sh b/pkgs/stdenv/mingw/gcc-wrapper/builder.sh
new file mode 100644
index 0000000000000..e67a73adb44af
--- /dev/null
+++ b/pkgs/stdenv/mingw/gcc-wrapper/builder.sh
@@ -0,0 +1,91 @@
+source $STDENV/setup
+source $SUBSTITUTE
+
+if test -z "$out"; then
+  out="$OUT"
+  shell="$SHELL"
+  gcc="$GCC"
+  binutils="$BINUTILS"
+fi
+
+# Force gcc to use ld-wrapper.sh when calling ld.
+# cflagsCompile="-B $OUT/bin/"
+
+# The "-B$glibc/lib/" flag is a quick hack to force gcc to link
+# against the crt1.o from our own glibc, rather than the one in
+# /usr/lib.  The real solution is of course to prevent those paths
+# from being used by gcc in the first place.
+# The dynamic linker is passed in `ldflagsBefore' to allow
+# explicit overrides of the dynamic linker by callers to gcc/ld
+# (the *last* value counts, so ours should come first).
+# cflagsCompile="$cflagsCompile -B $MINGWRUNTIME/lib/ -B $W32API/lib/ -isystem $MINGWRUNTIME/include -isystem $W32API/include"
+# ldflags="$ldflags -L$MINGWRUNTIME/lib -L$W32API"
+# ldflagsBefore="-dynamic-linker $glibc/lib/ld-linux.so.2"  Martin: no idea what to do with this on mingw.
+
+
+ldflags="$ldflags -L$gcc/lib"
+gccPath="$gcc/bin"
+ldPath="$BINUTILS/bin"
+
+mkdir $out
+mkdir $out/bin
+mkdir $out/nix-support
+
+doSubstitute() {
+    local src=$1
+    local dst=$2
+    substitute "$src" "$dst" \
+        --subst-var "out" \
+        --subst-var "shell" \
+        --subst-var "gcc" \
+        --subst-var "gccProg" \
+        --subst-var "binutils" \
+        --subst-var "cflagsCompile" \
+        --subst-var "cflagsLink" \
+        --subst-var "ldflags" \
+        --subst-var "ldflagsBefore" \
+        --subst-var-by "ld" "$ldPath/ld"
+}
+
+
+# Make wrapper scripts around gcc, g++, and g77.  Also make symlinks
+# cc, c++, and f77.
+mkGccWrapper() {
+    local dst=$1
+    local src=$2
+
+    if ! test -f "$src"; then
+        echo "$src does not exist (skipping)"
+        return
+    fi
+
+    gccProg="$src"
+    doSubstitute "$GCCWRAPPER" "$dst"
+    chmod +x "$dst"
+}
+
+echo "gccpath: $gccPath"
+mkGccWrapper $out/bin/gcc $gccPath/gcc.exe
+ln -s $out/bin/gcc $out/bin/cc
+
+# mkGccWrapper $out/bin/g++ $gccPath/g++.exe
+# ln -s $out/bin/g++ $out/bin/c++
+
+# mkGccWrapper $out/bin/g77 $gccPath/g77.exe
+# ln -s $out/bin/g77 $out/bin/f77
+
+# Make a wrapper around the linker.
+doSubstitute "$LDWRAPPER" "$out/bin/ld"
+chmod +x "$out/bin/ld"
+
+
+# Emit a setup hook.  Also store the path to the original GCC and
+# Glibc.
+test -n "$GCC" && echo $GCC > $out/nix-support/orig-gcc
+# test -n "$glibc" && echo $glibc > $out/nix-support/orig-glibc
+
+doSubstitute "$ADDFLAGS" "$out/nix-support/add-flags"
+
+doSubstitute "$SETUPHOOK" "$out/nix-support/setup-hook"
+
+cp -p $UTILS $out/nix-support/utils