diff --git a/pkgs/development/compilers/gcc-apple64/builder.sh b/pkgs/development/compilers/gcc-apple64/builder.sh new file mode 100644 index 000000000000..cb7c0901eb51 --- /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 000000000000..b26f15e6512f --- /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 000000000000..b87cd596a5b3 --- /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 000000000000..b7b93d6944cc --- /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 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 000000000000..4f9a29ae51bb --- /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 fbc3b9a6ef0a..55389b7d7716 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 c4464718b13b..64404f1d7d91 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;