about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRob Vermaas <rob.vermaas@gmail.com>2009-11-27 10:56:07 +0000
committerRob Vermaas <rob.vermaas@gmail.com>2009-11-27 10:56:07 +0000
commit746c502acc7ef0e7dee2375ae9dfed323ba28dc6 (patch)
tree9aa4dfb90d4ebb4554d5ebd256b4ddd19683420a
parentd8800474f775a4ecaf61f13890b42ef007fd574f (diff)
changes for x86_64-darwin support
svn path=/nixpkgs/trunk/; revision=18667
-rw-r--r--pkgs/development/compilers/gcc-apple64/builder.sh125
-rw-r--r--pkgs/development/compilers/gcc-apple64/debug_list.patch30
-rw-r--r--pkgs/development/compilers/gcc-apple64/default.nix30
-rw-r--r--pkgs/development/compilers/gcc-apple64/no-sys-dirs.patch126
-rw-r--r--pkgs/development/compilers/gcc-apple64/pass-cxxcpp.patch21
-rw-r--r--pkgs/stdenv/nix/prehook.sh2
-rw-r--r--pkgs/top-level/all-packages.nix9
7 files changed, 338 insertions, 5 deletions
diff --git a/pkgs/development/compilers/gcc-apple64/builder.sh b/pkgs/development/compilers/gcc-apple64/builder.sh
new file mode 100644
index 0000000000000..cb7c0901eb51f
--- /dev/null
+++ b/pkgs/development/compilers/gcc-apple64/builder.sh
@@ -0,0 +1,125 @@
+source $stdenv/setup
+
+
+export NIX_FIXINC_DUMMY=$NIX_BUILD_TOP/dummy
+mkdir $NIX_FIXINC_DUMMY
+
+
+# libstdc++ needs this; otherwise it will use /lib/cpp, which is a Bad
+# Thing.
+export CPP="gcc -E"
+
+
+if test "$noSysDirs" = "1"; then
+
+    # Figure out what extra flags to pass to the gcc compilers being
+    # generated to make sure that they use our glibc.
+    if test -e $NIX_GCC/nix-support/orig-glibc; then
+        glibc=$(cat $NIX_GCC/nix-support/orig-glibc)
+
+        # Ugh.  Copied from gcc-wrapper/builder.sh.  We can't just
+        # source in $NIX_GCC/nix-support/add-flags, since that would
+        # cause *this* GCC to be linked against the *previous* GCC.
+        # Need some more modularity there.
+        extraCFlags="-B$glibc/lib -isystem $glibc/include"
+        extraLDFlags="-B$glibc/lib -L$glibc/lib -Wl,-s \
+          -Wl,-dynamic-linker,$glibc/lib/ld-linux.so.2"
+
+        # Oh, what a hack.  I should be shot for this.  In stage 1, we
+        # should link against the previous GCC, but not afterwards.
+        # Otherwise we retain a dependency.  However, ld-wrapper,
+        # which adds the linker flags for the previous GCC, is also
+        # used in stage 2/3.  We can prevent it from adding them by
+        # NIX_GLIBC_FLAGS_SET, but then gcc-wrapper will also not add
+        # them, thereby causing stage 1 to fail.  So we use a trick to
+        # only set the flags in gcc-wrapper.
+        hook=$(pwd)/ld-wrapper-hook
+        echo "NIX_GLIBC_FLAGS_SET=1" > $hook
+        export NIX_LD_WRAPPER_START_HOOK=$hook
+
+        # Use *real* header files, otherwise a limits.h is generated
+        # that does not include Glibc's limits.h (notably missing
+        # SSIZE_MAX, which breaks the build).
+        export NIX_FIXINC_DUMMY=$glibc/include
+    fi
+
+    export NIX_EXTRA_CFLAGS=$extraCFlags
+    export NIX_EXTRA_LDFLAGS=$extraLDFlags
+    export CFLAGS=$extraCFlags
+    export CXXFLAGS=$extraCFlags
+    export LDFLAGS=$extraLDFlags
+fi
+
+
+preConfigure() {
+    
+    # Determine the frontends to build.
+    langs="c"
+    if test -n "$langCC"; then
+        langs="$langs,c++"
+    fi
+    if test -n "$langF77"; then
+        langs="$langs,f95"
+    fi
+
+    # Perform the build in a different directory.
+    mkdir ../build
+    cd ../build
+
+    configureScript=../$sourceRoot/configure
+    configureFlags="--enable-languages=$langs --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-multilib --with-gxx-include-dir=${STDCXX_INCDIR}"
+}
+
+
+postInstall() {
+    # Remove precompiled headers for now.  They are very big and
+    # probably not very useful yet.
+    find $out/include -name "*.gch" -exec rm -rf {} \; -prune
+
+    # Remove `fixincl' to prevent a retained dependency on the
+    # previous gcc.
+    rm -rf $out/libexec/gcc/*/*/install-tools
+}
+
+postUnpack() {
+  mv $libstdcxx/libstdcxx $sourceRoot/
+}
+
+STDCXX_INCDIR="$out/include/c++/4.2.1"
+
+genericBuild
+
+
+echo '-------------------------------------------------------------------------------------------------------------------------'
+echo 'libstdcxx-16'
+echo '-------------------------------------------------------------------------------------------------------------------------'
+
+cd ..
+pwd
+
+preConfigure() {
+    # Perform the build in a different directory.
+    mkdir ../build_libstdcxx
+    cd ../build_libstdcxx
+
+    ln -s ../build/gcc gcc
+    
+    configureScript=../$sourceRoot/libstdcxx/configure
+    configureFlags="--disable-libstdcxx-pch --disable-libstdcxx-debug --disable-multilib --with-gxx-include-dir=${STDCXX_INCDIR}"
+}
+
+unpackPhase () {
+  echo '-'
+}
+
+postInstall() {
+  echo '-'
+  echo "cp -v ${STDCXX_INCDIR}/*/bits/* ${STDCXX_INCDIR}/bits/"
+  cp -v ${STDCXX_INCDIR}/*/bits/* ${STDCXX_INCDIR}/bits/
+}
+
+patchPhase() {
+  echo '-'
+}
+
+genericBuild
diff --git a/pkgs/development/compilers/gcc-apple64/debug_list.patch b/pkgs/development/compilers/gcc-apple64/debug_list.patch
new file mode 100644
index 0000000000000..b26f15e6512f1
--- /dev/null
+++ b/pkgs/development/compilers/gcc-apple64/debug_list.patch
@@ -0,0 +1,30 @@
+diff -rc libstdcxx-16-orig/libstdcxx/libstdc++-v3/src/Makefile.in libstdcxx-16/libstdcxx/libstdc++-v3/src/Makefile.in
+*** libstdcxx-16-orig/libstdcxx/libstdc++-v3/src/Makefile.in	Thu Jul 23 19:13:52 2009
+--- libstdcxx-16/libstdcxx/libstdc++-v3/src/Makefile.in	Thu Jul 23 19:38:23 2009
+***************
+*** 65,71 ****
+  	numeric_members.lo time_members.lo
+  am__objects_2 = basic_file.lo c++locale.lo
+  am__objects_3 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \
+! 	codecvt.lo complex_io.lo ctype.lo debug.lo debug_list.lo \
+  	functexcept.lo globals_locale.lo globals_io.lo ios.lo \
+  	ios_failure.lo ios_init.lo ios_locale.lo limits.lo list.lo \
+  	locale.lo locale_init.lo locale_facets.lo localename.lo \
+--- 65,71 ----
+  	numeric_members.lo time_members.lo
+  am__objects_2 = basic_file.lo c++locale.lo
+  am__objects_3 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \
+! 	codecvt.lo complex_io.lo ctype.lo debug.lo \
+  	functexcept.lo globals_locale.lo globals_io.lo ios.lo \
+  	ios_failure.lo ios_init.lo ios_locale.lo limits.lo list.lo \
+  	locale.lo locale_init.lo locale_facets.lo localename.lo \
+***************
+*** 315,321 ****
+  	complex_io.cc \
+  	ctype.cc \
+  	debug.cc \
+- 	debug_list.cc \
+  	functexcept.cc \
+  	globals_locale.cc \
+  	globals_io.cc \
+--- 315,320 ----
diff --git a/pkgs/development/compilers/gcc-apple64/default.nix b/pkgs/development/compilers/gcc-apple64/default.nix
new file mode 100644
index 0000000000000..b87cd596a5b3a
--- /dev/null
+++ b/pkgs/development/compilers/gcc-apple64/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, noSysDirs
+, langC ? true, langCC ? true, langF77 ? false
+, profiledCompiler ? false
+, gmp ? null, mpfr ? null, bison ? null, flex ? null
+}:
+
+assert langC;
+assert stdenv.isDarwin;
+assert langF77 -> gmp != null;
+
+stdenv.mkDerivation ({
+  name = "gcc-4.2.1-apple-5646";
+  builder = ./builder.sh;
+  src = 
+    stdenv.lib.optional /*langC*/ true (fetchurl {
+      url = http://www.opensource.apple.com/tarballs/gcc/gcc-5646.tar.gz;
+      sha256 = "13jghyb098104kfym96iwwdvbj6snnws2c92h48lbd4fmyf1iv24";
+    }) ++
+    stdenv.lib.optional langCC (fetchurl {
+      url = http://www.opensource.apple.com/tarballs/libstdcxx/libstdcxx-39.tar.gz ;
+      sha256 = "1fy6j41rhxdsm19sib9wygjl5l54g8pm13c6y5x13f40mavw1mma";
+    }) ;
+
+  libstdcxx = "libstdcxx-39";
+  sourceRoot = "gcc-5646/";
+  patches =
+    [./pass-cxxcpp.patch ]
+    ++ (if noSysDirs then [./no-sys-dirs.patch] else []);
+  inherit noSysDirs langC langCC langF77 profiledCompiler;
+} // (if langF77 then {buildInputs = [gmp mpfr bison flex];} else {}))
diff --git a/pkgs/development/compilers/gcc-apple64/no-sys-dirs.patch b/pkgs/development/compilers/gcc-apple64/no-sys-dirs.patch
new file mode 100644
index 0000000000000..b7b93d6944cc4
--- /dev/null
+++ b/pkgs/development/compilers/gcc-apple64/no-sys-dirs.patch
@@ -0,0 +1,126 @@
+diff -ruN gcc-4.1.0/gcc/cppdefault.c gcc-4.1.0.new/gcc/cppdefault.c
+--- gcc-4.1.0/gcc/cppdefault.c	2005-06-25 04:02:01.000000000 +0200
++++ gcc-4.1.0.new/gcc/cppdefault.c	2006-03-01 18:48:58.000000000 +0100
+@@ -41,6 +41,10 @@
+ # undef CROSS_INCLUDE_DIR
+ #endif
+ 
++#undef LOCAL_INCLUDE_DIR
++#undef SYSTEM_INCLUDE_DIR
++#undef STANDARD_INCLUDE_DIR
++
+ const struct default_include cpp_include_defaults[]
+ #ifdef INCLUDE_DEFAULTS
+ = INCLUDE_DEFAULTS;
+diff -ruN gcc-4.1.0/gcc/Makefile.in gcc-4.1.0.new/gcc/Makefile.in
+--- gcc-4.1.0/gcc/Makefile.in	2006-02-16 16:23:24.000000000 +0100
++++ gcc-4.1.0.new/gcc/Makefile.in	2006-03-01 18:55:12.000000000 +0100
+@@ -219,7 +219,7 @@
+ CPPFLAGS = @CPPFLAGS@
+ 
+ # These exists to be overridden by the x-* and t-* files, respectively.
+-X_CFLAGS =
++X_CFLAGS = $(NIX_EXTRA_CFLAGS) $(NIX_EXTRA_LDFLAGS)
+ T_CFLAGS =
+ 
+ X_CPPFLAGS =
+@@ -383,7 +383,11 @@
+ MD5_H	    = $(srcdir)/../include/md5.h
+ 
+ # Default native SYSTEM_HEADER_DIR, to be overridden by targets.
+-NATIVE_SYSTEM_HEADER_DIR = /usr/include
++# Nix: we override NATIVE_SYSTEM_HEADER_DIR in order to prevent
++# `fixinc' from fixing header files in /usr/include.  However,
++# NATIVE_SYSTEM_HEADER_DIR must point to an existing directory, so set
++# it to some dummy directory.
++NATIVE_SYSTEM_HEADER_DIR = $(NIX_FIXINC_DUMMY)
+ # Default cross SYSTEM_HEADER_DIR, to be overridden by targets.
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+@@ -395,7 +399,7 @@
+ STMP_FIXINC = @STMP_FIXINC@
+ 
+ # Test to see whether <limits.h> exists in the system header files.
+-LIMITS_H_TEST = [ -f $(SYSTEM_HEADER_DIR)/limits.h ]
++LIMITS_H_TEST = true
+ 
+ # Directory for prefix to system directories, for
+ # each of $(system_prefix)/usr/include, $(system_prefix)/usr/lib, etc.
+@@ -3002,7 +3006,7 @@
+   -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
+   -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \
+   -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \
+-  -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \
++  -DLOCAL_INCLUDE_DIR=\"/no-such-dir\" \
+   -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \
+   -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
+   @TARGET_SYSTEM_ROOT_DEFINE@
+diff -ruN gcc-4.1.0/libstdc++-v3/include/Makefile.in gcc-4.1.0.new/libstdc++-v3/include/Makefile.in
+--- gcc-4.1.0/libstdc++-v3/include/Makefile.in	2006-01-10 18:14:00.000000000 +0100
++++ gcc-4.1.0.new/libstdc++-v3/include/Makefile.in	2006-03-01 18:57:32.000000000 +0100
+@@ -1257,8 +1257,8 @@
+ 	if [ ! -d "${pch_output_builddir}" ]; then \
+ 	  mkdir -p ${pch_output_builddir}; \
+ 	fi; \
+-	$(CXX) $(PCHFLAGS) $(AM_CPPFLAGS) ${pch_source} -O0 -g -o ${pch_output_builddir}/O0g.gch; \
+-	$(CXX) $(PCHFLAGS) $(AM_CPPFLAGS) ${pch_source} -O2 -g -o ${pch_output_builddir}/O2g.gch;
++	$(CXX) $(CFLAGS) $(PCHFLAGS) $(AM_CPPFLAGS) ${pch_source} -O0 -g -o ${pch_output_builddir}/O0g.gch; \
++	$(CXX) $(CFLAGS) $(PCHFLAGS) $(AM_CPPFLAGS) ${pch_source} -O2 -g -o ${pch_output_builddir}/O2g.gch;
+ 
+ # For robustness sake (in light of junk files or in-source
+ # configuration), copy from the build or source tree to the install
+diff -ruN gcc-4.1.0/ltcf-cxx.sh gcc-4.1.0.new/ltcf-cxx.sh
+--- gcc-4.1.0/ltcf-cxx.sh	2005-07-16 04:30:53.000000000 +0200
++++ gcc-4.1.0.new/ltcf-cxx.sh	2006-03-01 18:58:15.000000000 +0100
+@@ -989,7 +989,7 @@
+   # the conftest object file.
+   pre_test_object_deps_done=no
+ 
+-  for p in `eval $output_verbose_link_cmd`; do
++  for p in `true`; do
+ 
+     case $p in
+ 
+diff -ruN gcc-4.1.0/ltconfig gcc-4.1.0.new/ltconfig
+--- gcc-4.1.0/ltconfig	2005-07-16 04:30:53.000000000 +0200
++++ gcc-4.1.0.new/ltconfig	2006-03-01 18:59:58.000000000 +0100
+@@ -2322,6 +2322,11 @@
+ # A language-specific compiler.
+ CC=$CC
+ 
++# Ugly hack to get libmudflap (and possibly other libraries) to build.
++# Libtool filters out \`-B' flags when linking (why?), so the \`-B' flag
++# to Glibc gets lost.  Here we forcibly add it to any invocation.
++CC="\$CC $NIX_EXTRA_LDFLAGS"
++
+ # Is the compiler the GNU C compiler?
+ with_gcc=$with_gcc
+ 
+diff -ruN gcc-4.1.0/Makefile.in gcc-4.1.0.new/Makefile.in
+--- gcc-4.1.0/Makefile.in	2005-12-15 15:02:02.000000000 +0100
++++ gcc-4.1.0.new/Makefile.in	2006-03-01 19:41:04.000000000 +0100
+@@ -286,7 +286,7 @@
+ WINDRES = @WINDRES@
+ 
+ CFLAGS = @CFLAGS@
+-LDFLAGS = 
++LDFLAGS = $(NIX_EXTRA_LDFLAGS)
+ LIBCFLAGS = $(CFLAGS)
+ CXXFLAGS = @CXXFLAGS@
+ LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+@@ -329,12 +329,12 @@
+ # CFLAGS will be just -g.  We want to ensure that TARGET libraries
+ # (which we know are built with gcc) are built with optimizations so
+ # prepend -O2 when setting CFLAGS_FOR_TARGET.
+-CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
++CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) $(NIX_EXTRA_CFLAGS)
+ SYSROOT_CFLAGS_FOR_TARGET = @SYSROOT_CFLAGS_FOR_TARGET@
+-CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
++CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) $(NIX_EXTRA_CFLAGS)
+ LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET)
+ LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates
+-LDFLAGS_FOR_TARGET = 
++LDFLAGS_FOR_TARGET = $(NIX_EXTRA_LDFLAGS)
+ PICFLAG_FOR_TARGET = 
+ 
+ # ------------------------------------
diff --git a/pkgs/development/compilers/gcc-apple64/pass-cxxcpp.patch b/pkgs/development/compilers/gcc-apple64/pass-cxxcpp.patch
new file mode 100644
index 0000000000000..4f9a29ae51bb1
--- /dev/null
+++ b/pkgs/development/compilers/gcc-apple64/pass-cxxcpp.patch
@@ -0,0 +1,21 @@
+diff -rc gcc-orig/Makefile.in gcc-4.1.1/Makefile.in
+*** gcc-orig/Makefile.in	Wed Jun 21 13:40:23 2006
+--- gcc-4.1.1/Makefile.in	Wed Jun 21 14:19:44 2006
+***************
+*** 213,219 ****
+  RAW_CXX_TARGET_EXPORTS = \
+  	$(BASE_TARGET_EXPORTS) \
+  	CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \
+! 	CXX="$(RAW_CXX_FOR_TARGET)"; export CXX;
+  
+  NORMAL_TARGET_EXPORTS = \
+  	$(BASE_TARGET_EXPORTS) \
+--- 213,220 ----
+  RAW_CXX_TARGET_EXPORTS = \
+  	$(BASE_TARGET_EXPORTS) \
+  	CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \
+! 	CXX="$(RAW_CXX_FOR_TARGET)"; export CXX; \
+! 	CXXCPP="$(RAW_CXX_FOR_TARGET) $(CFLAGS_FOR_BUILD) -E"; export CXXCPP;
+  
+  NORMAL_TARGET_EXPORTS = \
+  	$(BASE_TARGET_EXPORTS) \
diff --git a/pkgs/stdenv/nix/prehook.sh b/pkgs/stdenv/nix/prehook.sh
index fbc3b9a6ef0ab..55389b7d77168 100644
--- a/pkgs/stdenv/nix/prehook.sh
+++ b/pkgs/stdenv/nix/prehook.sh
@@ -1,7 +1,7 @@
 export NIX_ENFORCE_PURITY=1
 export NIX_IGNORE_LD_THROUGH_GCC=1
 
-if test "$system" = "i686-darwin" -o "$system" = "powerpc-darwin"; then
+if test "$system" = "i686-darwin" -o "$system" = "powerpc-darwin" -o "$system" = "x86_64-darwin"; then
     export NIX_DONT_SET_RPATH=1
     export NIX_NO_SELF_RPATH=1
     dontFixLibtool=1
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index c4464718b13b2..64404f1d7d91d 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -1761,10 +1761,11 @@ let
     profiledCompiler = true;
   }));
 
-  gccApple = wrapGCC (import ../development/compilers/gcc-apple {
-    inherit fetchurl stdenv noSysDirs;
-    profiledCompiler = true;
-  });
+  gccApple = 
+    wrapGCC ( (if stdenv.system == "i686-darwin" then import ../development/compilers/gcc-apple else import ../development/compilers/gcc-apple64) {
+      inherit fetchurl stdenv noSysDirs;
+      profiledCompiler = true;
+    }) ;
 
   gccupc40 = wrapGCCUPC (import ../development/compilers/gcc-upc-4.0 {
     inherit fetchurl stdenv bison autoconf gnum4 noSysDirs;