From a375ffa53fd61f6091e7b88096b825e23c569071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Fri, 3 Aug 2012 19:23:51 +0200 Subject: [PATCH] Adding gccgo for gcc4.7. I tested hello world, and it works. --- pkgs/build-support/gcc-wrapper/buildergo.sh | 194 ++++++++++++++++++ pkgs/build-support/gcc-wrapper/default.nix | 11 +- .../development/compilers/gcc/4.7/default.nix | 6 +- pkgs/top-level/all-packages.nix | 15 +- 4 files changed, 218 insertions(+), 8 deletions(-) create mode 100644 pkgs/build-support/gcc-wrapper/buildergo.sh diff --git a/pkgs/build-support/gcc-wrapper/buildergo.sh b/pkgs/build-support/gcc-wrapper/buildergo.sh new file mode 100644 index 00000000000..cb6bfd7f051 --- /dev/null +++ b/pkgs/build-support/gcc-wrapper/buildergo.sh @@ -0,0 +1,194 @@ +source $stdenv/setup + + +mkdir -p $out/bin +mkdir -p $out/nix-support + + +if test -z "$nativeLibc"; then + dynamicLinker="$libc/lib/$dynamicLinker" + echo $dynamicLinker > $out/nix-support/dynamic-linker + + if test -e $libc/lib/32/ld-linux.so.2; then + echo $libc/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 + fi + + # The "-B$libc/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. (This is only an issue when using an `impure' + # compiler/linker, i.e., one that searches /usr/lib and so on.) + # + # Unfortunately, setting -B appears to override the default search + # path. Thus, the gcc-specific "../includes-fixed" directory is + # now longer searched and glibc's header fails to + # compile, because it uses "#include_next " to find the + # limits.h file in ../includes-fixed. To remedy the problem, + # another -idirafter is necessary to add that directory again. + echo "-B$libc/lib/ -idirafter $libc/include -idirafter $gcc/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags + + echo "-L$libc/lib" > $out/nix-support/libc-ldflags + + # 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). + echo "-dynamic-linker $dynamicLinker" > $out/nix-support/libc-ldflags-before +fi + +if test -n "$nativeTools"; then + gccPath="$nativePrefix/bin" + ldPath="$nativePrefix/bin" +else + if test -e "$gcc/lib64"; then + gccLDFlags="$gccLDFlags -L$gcc/lib64" + fi + gccLDFlags="$gccLDFlags -L$gcc/lib" + if [ -n "$langVhdl" ]; then + gccLDFlags="$gccLDFlags -L$zlib/lib" + fi + echo "$gccLDFlags" > $out/nix-support/gcc-ldflags + + # GCC shows $gcc/lib in `gcc -print-search-dirs', but not + # $gcc/lib64 (even though it does actually search there...).. + # This confuses libtool. So add it to the compiler tool search + # path explicitly. + if test -e "$gcc/lib64"; then + gccCFlags="$gccCFlags -B$gcc/lib64" + fi + + # Find the gcc libraries path (may work only without multilib) + if [ -n "$langAda" ]; then + basePath=`echo $gcc/lib/*/*/*` + gccCFlags="$gccCFlags -B$basePath -I$basePath/adainclude" + + gnatCFlags="-aI$basePath/adainclude -aO$basePath/adalib" + echo "$gnatCFlags" > $out/nix-support/gnat-cflags + fi + echo "$gccCFlags" > $out/nix-support/gcc-cflags + + gccPath="$gcc/bin" + ldPath="$binutils/bin" +fi + + +doSubstitute() { + local src=$1 + local dst=$2 + # Can't use substitute() here, because replace may not have been + # built yet (in the bootstrap). + sed \ + -e "s^@out@^$out^g" \ + -e "s^@shell@^$shell^g" \ + -e "s^@gcc@^$gcc^g" \ + -e "s^@gccProg@^$gccProg^g" \ + -e "s^@gnatProg@^$gnatProg^g" \ + -e "s^@gnatlinkProg@^$gnatlinkProg^g" \ + -e "s^@binutils@^$binutils^g" \ + -e "s^@coreutils@^$coreutils^g" \ + -e "s^@libc@^$libc^g" \ + -e "s^@ld@^$ldPath/ld^g" \ + < "$src" > "$dst" +} + + +# Make wrapper scripts around gcc, g++, and gfortran. 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 1 + fi + + gccProg="$src" + doSubstitute "$gccWrapper" "$dst" + chmod +x "$dst" +} + +mkGnatWrapper() { + local dst=$1 + local src=$2 + + if ! test -f "$src"; then + echo "$src does not exist (skipping)" + return 1 + fi + + gnatProg="$src" + doSubstitute "$gnatWrapper" "$dst" + chmod +x "$dst" +} + +mkGnatLinkWrapper() { + local dst=$1 + local src=$2 + + if ! test -f "$src"; then + echo "$src does not exist (skipping)" + return 1 + fi + + gnatlinkProg="$src" + doSubstitute "$gnatlinkWrapper" "$dst" + chmod +x "$dst" +} + +if mkGccWrapper $out/bin/gcc $gccPath/gcc +then + ln -sv gcc $out/bin/cc +fi + +if mkGccWrapper $out/bin/g++ $gccPath/g++ +then + ln -sv g++ $out/bin/c++ +fi + +if mkGccWrapper $out/bin/gfortran $gccPath/gfortran +then + ln -sv gfortran $out/bin/g77 + ln -sv gfortran $out/bin/f77 +fi + +mkGccWrapper $out/bin/gcj $gccPath/gcj || true + +mkGccWrapper $out/bin/gccgo $gccPath/gccgo || true + +mkGccWrapper $out/bin/gnatgcc $gccPath/gnatgcc || true +mkGnatWrapper $out/bin/gnatmake $gccPath/gnatmake || true +mkGnatWrapper $out/bin/gnatbind $gccPath/gnatbind || true +mkGnatLinkWrapper $out/bin/gnatlink $gccPath/gnatlink || true + +if [ -f $gccPath/ghdl ]; then + ln -sf $gccPath/ghdl $out/bin/ghdl +fi + +# Create a symlink to as (the assembler). This is useful when a +# gcc-wrapper is installed in a user environment, as it ensures that +# the right assembler is called. +ln -s $ldPath/as $out/bin/as + + +# 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 "$libc" && echo $libc > $out/nix-support/orig-libc + +doSubstitute "$addFlags" "$out/nix-support/add-flags.sh" + +doSubstitute "$setupHook" "$out/nix-support/setup-hook" + +cp -p $utils $out/nix-support/utils.sh + + +# Propagate the wrapped gcc so that if you install the wrapper, you get +# tools like gcov, the manpages, etc. as well (including for binutils +# and Glibc). +if test -z "$nativeTools"; then + echo $gcc $binutils $libc > $out/nix-support/propagated-user-env-packages +fi diff --git a/pkgs/build-support/gcc-wrapper/default.nix b/pkgs/build-support/gcc-wrapper/default.nix index d3fe5a0569f..5e50a5c7dfb 100644 --- a/pkgs/build-support/gcc-wrapper/default.nix +++ b/pkgs/build-support/gcc-wrapper/default.nix @@ -21,10 +21,11 @@ let gccVersion = (builtins.parseDrvName gcc.name).version; gccName = (builtins.parseDrvName gcc.name).name; - + + langGo = if nativeTools then false else gcc ? langGo && gcc.langGo; in -stdenv.mkDerivation { +stdenv.mkDerivation ({ name = (if name != "" then name else gccName + "-wrapper") + (if gcc != null && gccVersion != "" then "-" + gccVersion else ""); @@ -90,3 +91,9 @@ stdenv.mkDerivation { abort "don't know the name of the dynamic linker for this platform") else ""; } +# This go wrapper should be reworked in stdenv-updates. +// (if langGo then +{ + inherit langGo; + builder = ./buildergo.sh; +} else {})) diff --git a/pkgs/development/compilers/gcc/4.7/default.nix b/pkgs/development/compilers/gcc/4.7/default.nix index 5edcdfdd193..961f0d8cc4a 100644 --- a/pkgs/development/compilers/gcc/4.7/default.nix +++ b/pkgs/development/compilers/gcc/4.7/default.nix @@ -52,7 +52,7 @@ let version = "4.7.1"; crossGNU = cross != null && cross.config == "i586-pc-gnu"; patches = [ ] - ++ optional (cross != null || langGo) ./libstdc++-target.patch + ++ optional (cross != null) ./libstdc++-target.patch # ++ optional noSysDirs ./no-sys-dirs.patch # The GNAT Makefiles did not pay attention to CFLAGS_FOR_TARGET for its # target libraries and tools. @@ -249,6 +249,10 @@ stdenv.mkDerivation ({ (ppl != null && ppl ? dontDisableStatic && ppl.dontDisableStatic) [ "--with-host-libstdcxx=-lstdc++ -lgcc_s" ]; + # 'iant' at #go-nuts@freenode, gccgo maintainer, said that + # they have a bug in 4.7.1 if adding "--disable-static" + dontDisableStatic = langGo; + configureFlags = " ${if enableMultilib then "" else "--disable-multilib"} ${if enableShared then "" else "--disable-shared"} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 438db4c127d..9e0f129410b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2028,11 +2028,9 @@ let gcc47_real = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.7 { inherit noSysDirs; - - # bootstrapping a profiled compiler does not work in the sheevaplug: - # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43944 - # To be reviewed. Maybe it is fixed already in 4.7. - profiledCompiler = if stdenv.isArm then false else true; + # I'm not sure if profiling with enableParallelBuilding helps a lot. + # We can enable it back some day. This makes the *gcc* builds faster now. + profiledCompiler = false; # When building `gcc.hostDrv' (a "Canadian cross", with host == target # and host != build), `cross' must be null but the cross-libc must still @@ -2217,6 +2215,13 @@ let langGo = true; }); + gccgo47 = wrapGCC (gcc47_real.gcc.override { + name = "gccgo"; + langCC = true; #required for go + langC = true; + langGo = true; + }); + ghdl = wrapGCC (import ../development/compilers/gcc/4.3 { inherit stdenv fetchurl texinfo gmp mpfr noSysDirs gnat; name = "ghdl";