Fedora and Cross Compiling

Lennert Buytenhek buytenh at wantstofly.org
Wed Jun 27 13:54:14 UTC 2007


On Tue, Jun 12, 2007 at 04:31:51PM +0100, David Woodhouse wrote:

> > As gcc matures, it's likely that the libgcc problem will go away by it 
> > being split out.  At that time, the chicken/egg problem will be solved 
> > without having to resort to clever hacks.
> 
> I think we need to accelerate that rather than waiting for it.
> 
> Binutils at least should be relatively easy. Here's a patch against
> binutils/F-7 which lets me:
>   make DIST_DEFINES='--define "binutils_target i686-linux-gnu"' ppc

Works fine for me on arm.  (One packaging issue with 'as'/'nm', see
below.)

Attached is a very hacky patch to the gcc spec file to make it cross
build (Fedora -> Fedora.)  It requires that you already have glibc and
kernel headers installed in your sysroot (/usr/%{_target_platform}).
(If you're doing Fedora -> Fedora, presumably you already have glibc
packages for the target, which will suffice for bootstrapping.)

There's a couple of issues:
- Whereas your binutils patch is pretty clean, I can't really seem
  to find a way to make the cross changes to the gcc spec file not
  very intrusive.

  I'm starting to wonder whether the gcc cross stuff should just be
  in a separate spec file.  We _do_ want to use exactly the same
  sources to build the cross-compiler, so maybe the regular gcc
  package can provide gcc-source, which can then be pulled in by
  the gcc-cross variant?

- binutils puts as/nm binaries into the sysroot, even though they are
  host binaries.  Your binutils spec patch doesn't package those, which
  makes sense (I don't fully understand why binutils puts them there to
  begin with), but gcc insists on being able to invoke the target 'as'
  as 'as'.  I've hacked around that by making
  /usr/libexec/gcc/$target/$version/as a symlink to $target-as (and the
  same thing with 'nm'), which seems to work.

- There's also two issues with building libstdc++ -- it doesn't pick
  up the sysroot info correctly (and subsequently tries to link against
  the host's /lib/libc.so.6 after reading the target libc.so script in
  the sysroot), and its install target installs various target files
  not in the sysroot but in the host's directory space.



Index: SPECS/gcc41.spec
===================================================================
--- SPECS.orig/gcc41.spec
+++ SPECS/gcc41.spec
@@ -1,32 +1,32 @@
+%if "%{?gcc_target}" == ""
+%define gcc_target %{_target_platform}
+%define isnative 1
+%else
+%define isnative 0
+%define cross %{gcc_target}-
+%endif
+
 %define DATE 20070503
 %define gcc_version 4.1.2
 %define gcc_release 12
 %define _unpackaged_files_terminate_build 0
 %define multilib_64_archs sparc64 ppc64 s390x x86_64
 %define include_gappletviewer 1
+%if !%{isnative}
+%define build_ada 0
+%else
 %ifarch %{ix86} x86_64 ia64 ppc alpha
 %define build_ada 1
 %else
 %define build_ada 0
 %endif
+%endif
 %define build_fortran 0
 %define build_java 0
 %define build_objc 0
 %define run_tests 0
-%ifarch s390x
-%define multilib_32_arch s390
-%endif
-%ifarch sparc64
-%define multilib_32_arch sparc
-%endif
-%ifarch ppc64
-%define multilib_32_arch ppc
-%endif
-%ifarch x86_64
-%define multilib_32_arch i386
-%endif
 Summary: Various compilers (C, C++, Objective-C, Java, ...)
-Name: gcc
+Name: %{?cross}gcc
 Version: %{gcc_version}
 Release: %{gcc_release}.fa1
 License: GPL
@@ -44,7 +44,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version
 # Need binutils which support --hash-style=gnu >= 2.17.50.0.2-7
 # Need binutils which support mffgpr and mftgpr >= 2.17.50.0.2-8
 # Need binutils which support 2-argument .movsp >= 2.17.50.0.5
-BuildRequires: binutils >= 2.17.50.0.5
+BuildRequires: %{?cross}binutils >= 2.17.50.0.5
 BuildRequires: zlib-devel, gettext, dejagnu, bison, flex, texinfo, sharutils
 %if %{build_java}
 BuildRequires: gcc-java, libgcj, /usr/share/java/eclipse-ecj.jar, zip, unzip
@@ -52,7 +52,7 @@ BuildRequires: gcc-java, libgcj, /usr/sh
 # Make sure pthread.h doesn't contain __thread tokens
 # Make sure glibc supports stack protector
 # Make sure glibc supports DT_GNU_HASH
-BuildRequires: glibc-devel >= 2.4.90-13
+BuildRequires: %{?cross}glibc-devel >= 2.4.90-13
 BuildRequires: elfutils-devel >= 0.72
 %ifarch ppc ppc64 s390 s390x sparc sparcv9 alpha
 # Make sure glibc supports TFmode long double
@@ -69,7 +69,7 @@ BuildRequires: gcc-gnat >= 3.1, libgnat 
 %ifarch ia64
 BuildRequires: libunwind >= 0.98
 %endif
-Requires: cpp = %{version}-%{release}
+Requires: %{?cross}cpp = %{version}-%{release}
 # Need .eh_frame ld optimizations
 # Need proper visibility support
 # Need -pie support
@@ -80,37 +80,39 @@ Requires: cpp = %{version}-%{release}
 # Need binutils that supports --hash-style=gnu
 # Need binutils that support mffgpr/mftgpr
 # Need binutils that support 2-argument .movsp >= 2.17.50.0.5
-Requires: binutils >= 2.17.50.0.5
+Requires: %{?cross}binutils >= 2.17.50.0.5
 # Make sure gdb will understand DW_FORM_strp
-Conflicts: gdb < 5.1-2
-Requires: glibc-devel >= 2.2.90-12
+Conflicts: %{?cross}gdb < 5.1-2
+Requires: %{?cross}glibc-devel >= 2.2.90-12
 %ifarch ppc ppc64 s390 s390x sparc sparcv9 alpha
 # Make sure glibc supports TFmode long double
-Requires: glibc >= 2.3.90-35
+Requires: %{?cross}glibc >= 2.3.90-35
+%endif
+Requires: %{?cross}libgcc >= %{version}-%{release}
+%if %{isnative}
+Requires: %{?cross}libgomp = %{version}-%{release}
 %endif
-Requires: libgcc >= %{version}-%{release}
-Requires: libgomp = %{version}-%{release}
-Obsoletes: gcc3
-Obsoletes: egcs
+Obsoletes: %{?cross}gcc3
+Obsoletes: %{?cross}egcs
 %ifarch sparc
-Obsoletes: gcc-sparc32
-Obsoletes: gcc-c++-sparc32
+Obsoletes: %{?cross}gcc-sparc32
+Obsoletes: %{?cross}gcc-c++-sparc32
 %endif
 %ifarch ppc
-Obsoletes: gcc-ppc32
-Obsoletes: gcc-c++-ppc32
+Obsoletes: %{?cross}gcc-ppc32
+Obsoletes: %{?cross}gcc-c++-ppc32
 %endif
-Obsoletes: gcc-chill
+Obsoletes: %{?cross}gcc-chill
 %if !%{build_ada}
-Obsoletes: gcc-gnat < %{version}-%{release}
-Obsoletes: libgnat < %{version}-%{release}
+Obsoletes: %{?cross}gcc-gnat < %{version}-%{release}
+Obsoletes: %{?cross}libgnat < %{version}-%{release}
 %endif
 %ifarch sparc sparc64
-Obsoletes: egcs64
+Obsoletes: %{?cross}egcs64
 %endif
-Obsoletes: gcc34
-Obsoletes: gcc35
-Obsoletes: gcc4
+Obsoletes: %{?cross}gcc34
+Obsoletes: %{?cross}gcc35
+Obsoletes: %{?cross}gcc4
 Prereq: /sbin/install-info
 AutoReq: true
 
@@ -160,6 +162,7 @@ Patch40: gcc41-unbreak-armv4t.patch
 %ifnarch %{arm}
 %define _gnu %{nil}
 %endif
+%if "%{?gcc_target}" == ""
 %ifarch sparc
 %define gcc_target_platform sparc64-%{_vendor}-%{_target_os}
 %endif
@@ -169,17 +172,20 @@ Patch40: gcc41-unbreak-armv4t.patch
 %ifnarch sparc ppc
 %define gcc_target_platform %{_target_platform}
 %endif
+%else
+%define gcc_target_platform %{gcc_target}
+%endif
 
 %description
 The gcc package contains the GNU Compiler Collection version 4.1.
 You'll need this package in order to compile C code.
 
-%package -n libgcc
+%package -n %{?cross}libgcc
 Summary: GCC version 4.1 shared support library
 Group: System Environment/Libraries
 Autoreq: false
 
-%description -n libgcc
+%description -n %{?cross}libgcc
 This package contains GCC shared support library which is needed
 e.g. for exception handling support.
 
@@ -200,18 +206,18 @@ This package adds C++ support to the GNU
 It includes support for most of the current C++ specification,
 including templates and exception handling.
 
-%package -n libstdc++
+%package -n %{?cross}libstdc++
 Summary: GNU Standard C++ Library
 Group: System Environment/Libraries
 Obsoletes: libstdc++3
 Obsoletes: libstdc++34
 Autoreq: true
 
-%description -n libstdc++
+%description -n %{?cross}libstdc++
 The libstdc++ package contains a rewritten standard compliant GCC Standard
 C++ Library.
 
-%package -n libstdc++-devel
+%package -n %{?cross}libstdc++-devel
 Summary: Header files and libraries for C++ development
 Group: Development/Libraries
 Requires: libstdc++ = %{version}-%{release}, %{_prefix}/%{_lib}/libstdc++.so.6
@@ -219,7 +225,7 @@ Obsoletes: libstdc++3-devel
 Obsoletes: libstdc++34-devel
 Autoreq: true
 
-%description -n libstdc++-devel
+%description -n %{?cross}libstdc++-devel
 This is the GNU implementation of the standard C++ libraries.  This
 package includes the header files and libraries needed for C++
 development. This includes rewritten implementation of STL.
@@ -246,12 +252,12 @@ Autoreq: true
 %description objc++
 gcc-objc++ package provides Objective-C++ support for the GCC.
 
-%package -n libobjc
+%package -n %{?cross}libobjc
 Summary: Objective-C runtime
 Group: System Environment/Libraries
 Autoreq: true
 
-%description -n libobjc
+%description -n %{?cross}libobjc
 This package contains Objective-C shared library which is needed to run
 Objective-C dynamically linked programs.
 
@@ -271,39 +277,39 @@ Autoreq: true
 The gcc-gfortran package provides support for compiling Fortran 95
 programs with the GNU Compiler Collection.
 
-%package -n libgfortran
+%package -n %{?cross}libgfortran
 Summary: Fortran 95 runtime
 Group: System Environment/Libraries
 Obsoletes: libf2c
 Autoreq: true
 
-%description -n libgfortran
+%description -n %{?cross}libgfortran
 This package contains Fortran 95 shared library which is needed to run
 Fortran 95 dynamically linked programs.
 
-%package -n libgomp
+%package -n %{?cross}libgomp
 Summary: GCC OpenMP 2.5 shared support library
 Group: System Environment/Libraries
 
-%description -n libgomp
+%description -n %{?cross}libgomp
 This package contains GCC shared support library which is needed
 for OpenMP 2.5 support.
 
-%package -n libmudflap
+%package -n %{?cross}libmudflap
 Summary: GCC mudflap shared support library
 Group: System Environment/Libraries
 
-%description -n libmudflap
+%description -n %{?cross}libmudflap
 This package contains GCC shared support library which is needed
 for mudflap support.
 
-%package -n libmudflap-devel
+%package -n %{?cross}libmudflap-devel
 Summary: GCC mudflap support
 Group: Development/Libraries
 Requires: libmudflap = %{version}-%{release}
 Requires: gcc = %{version}-%{release}
 
-%description -n libmudflap-devel
+%description -n %{?cross}libmudflap-devel
 This package contains headers and static libraries for building
 mudflap-instrumented programs.
 
@@ -329,7 +335,7 @@ Autoreq: true
 This package adds support for compiling Java(tm) programs and
 bytecode into native code.
 
-%package -n libgcj
+%package -n %{?cross}libgcj
 Summary: Java runtime library for gcc
 Group: System Environment/Libraries
 Prereq: /sbin/install-info
@@ -352,11 +358,11 @@ Obsoletes: libgcj34
 Obsoletes: libgcj4
 Autoreq: true
 
-%description -n libgcj
+%description -n %{?cross}libgcj
 The Java(tm) runtime library. You will need this package to run your Java
 programs compiled using the Java compiler from GNU Compiler Collection (gcj).
 
-%package -n libgcj-devel
+%package -n %{?cross}libgcj-devel
 Summary: Libraries for Java development using GCC
 Group: Development/Languages
 Requires: libgcj = %{version}-%{release}, %{_prefix}/%{_lib}/libgcj.so.8rh
@@ -368,21 +374,21 @@ Obsoletes: libgcj4-devel
 Autoreq: false
 Autoprov: false
 
-%description -n libgcj-devel
+%description -n %{?cross}libgcj-devel
 The Java(tm) static libraries and C header files. You will need this
 package to compile your Java programs using the GCC Java compiler (gcj).
 
-%package -n libgcj-src
+%package -n %{?cross}libgcj-src
 Summary: Java library sources from GCC4 preview
 Group: System Environment/Libraries
 Requires: libgcj = %{version}-%{release}
 Obsoletes: libgcj4-src
 Autoreq: true
 
-%description -n libgcj-src
+%description -n %{?cross}libgcj-src
 The Java(tm) runtime library sources for use in Eclipse.
 
-%package -n cpp
+%package -n %{?cross}cpp
 Summary: The C Preprocessor.
 Group: Development/Languages
 Prereq: /sbin/install-info
@@ -391,7 +397,7 @@ Obsoletes: gnupro
 %endif
 Autoreq: true
 
-%description -n cpp
+%description -n %{?cross}cpp
 Cpp is the GNU C-Compatible Compiler Preprocessor.
 Cpp is a macro processor which is used automatically
 by the C compiler to transform your program before actual
@@ -425,13 +431,13 @@ Autoreq: true
 GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools,
 the documents and Ada 95 compiler.
 
-%package -n libgnat
+%package -n %{?cross}libgnat
 Summary: GNU Ada 95 runtime shared libraries
 Group: System Environment/Libraries
 Obsoletes: gnat libgnat3
 Autoreq: true
 
-%description -n libgnat
+%description -n %{?cross}libgnat
 GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries,
 which are required to run programs compiled with the GNAT.
 
@@ -511,6 +517,7 @@ if [ -d libstdc++-v3/config/abi/sparc64-
   rm -rf libstdc++-v3/config/abi/sparc64-linux-gnu/32
 fi
 %endif
+find -name configure | xargs sed -i -e 's/^ PACKAGE=/ PACKAGE=%{?cross}/'
 
 %build
 
@@ -583,6 +590,7 @@ case "$OPT_FLAGS" in
       ../gcc/Makefile.in
     ;;
 esac
+%if %{isnative}
 CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$OPT_FLAGS" XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \
 	GCJFLAGS="$OPT_FLAGS" \
 	../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
@@ -632,7 +640,6 @@ CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$
 	--host=%{gcc_target_platform}
 %endif
 
-#GCJFLAGS="$OPT_FLAGS" make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" bootstrap
 GCJFLAGS="$OPT_FLAGS" make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" profiledbootstrap
 
 %if %{run_tests}
@@ -663,6 +670,19 @@ rm -rf testlogs-%{_target_platform}-%{ve
 
 # Make protoize
 make -C gcc CC="./xgcc -B ./ -O2" proto
+%else
+CC="$CC" CFLAGS="-O2 -g" CXXFLAGS="-O2 -g" XCFLAGS="-O2 -g" TCFLAGS="-O2 -g" \
+	GCJFLAGS="-O2 -g" \
+	../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
+	--enable-shared --enable-threads=posix --enable-checking=release \
+	--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions \
+	--enable-languages=c --disable-libgcj --disable-libssp \
+	--disable-libgomp --disable-libmudflap \
+	--with-sysroot=/usr/%{gcc_target_platform} \
+	--target=%{gcc_target_platform}
+
+GCJFLAGS="-O2 -g" make %{?_smp_mflags} BOOT_CFLAGS="-O2 -g"
+%endif
 
 # Make generated man pages even if Pod::Man is not new enough
 perl -pi -e 's/head3/head2/' ../contrib/texi2pod.pl
@@ -730,10 +750,10 @@ fi
 export PATH=`pwd`/java_hacks${PATH:+:$PATH}
 %endif
 
-TARGET_PLATFORM=%{gcc_target_platform}
-
+%if %{isnative}
 # There are some MP bugs in libstdc++ Makefiles
 make -C %{gcc_target_platform}/libstdc++-v3
+%endif
 
 make prefix=$RPM_BUILD_ROOT%{_prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \
   infodir=$RPM_BUILD_ROOT%{_infodir} install
@@ -748,16 +768,26 @@ FULLPATH=$RPM_BUILD_ROOT%{_prefix}/lib/g
 FULLEPATH=$RPM_BUILD_ROOT%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
 
 # fix some things
+%if %{isnative}
 ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/cc
 mkdir -p $RPM_BUILD_ROOT/lib
 ln -sf ..%{_prefix}/bin/cpp $RPM_BUILD_ROOT/lib/cpp
+%endif
 %if %{build_fortran}
 ln -sf gfortran $RPM_BUILD_ROOT%{_prefix}/bin/f95
 %endif
 rm -f $RPM_BUILD_ROOT%{_infodir}/dir
 gzip -9 $RPM_BUILD_ROOT%{_infodir}/*.info*
+%if %{build_ada}
 ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/gnatgcc
+%endif
 
+%if !%{isnative}
+ln -s ../../../../bin/%{gcc_target}-as $FULLEPATH/as
+ln -s ../../../../bin/%{gcc_target}-nm $FULLEPATH/nm
+%endif
+
+%if %{isnative}
 cxxconfig="`find %{gcc_target_platform}/libstdc++-v3/include -name c++config.h`"
 for i in `find %{gcc_target_platform}/[36]*/libstdc++-v3/include -name c++config.h 2>/dev/null`; do
   if ! diff -up $cxxconfig $i; then
@@ -783,6 +813,7 @@ EOF
     break
   fi
 done
+%endif
 
 %ifarch sparc sparc64
 ln -f $RPM_BUILD_ROOT%{_prefix}/bin/%{gcc_target_platform}-gcc \
@@ -818,11 +849,13 @@ sed -i -e 's/lib: /&%%{static:%%eJava pr
   $FULLPATH/libgcj.spec
 %endif
 
+%if %{isnative}
 mkdir -p $RPM_BUILD_ROOT/%{_lib}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
 chmod 755 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
 ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s.so.1
 ln -sf /%{_lib}/libgcc_s.so.1 $FULLPATH/libgcc_s.so
+%endif
 %ifarch sparc ppc
 ln -sf /lib64/libgcc_s.so.1 $FULLPATH/64/libgcc_s.so
 %endif
@@ -830,8 +863,10 @@ ln -sf /lib64/libgcc_s.so.1 $FULLPATH/64
 ln -sf /lib/libgcc_s.so.1 $FULLPATH/32/libgcc_s.so
 %endif
 
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgomp.spec $FULLPATH/
 mv -f $RPM_BUILD_ROOT%{_prefix}/include/omp.h $FULLPATH/include/
+%endif
 
 %if %{build_ada}
 mv -f $FULLPATH/adalib/libgnarl-*.so $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
@@ -856,16 +891,21 @@ fi
 
 pushd $FULLPATH
 if [ "%{_lib}" = "lib" ]; then
+true
 %if %{build_objc}
 ln -sf ../../../libobjc.so.1 libobjc.so
 %endif
+%if %{isnative}
 ln -sf ../../../libstdc++.so.6.* libstdc++.so
+%endif
 %if %{build_fortran}
 ln -sf ../../../libgfortran.so.1.* libgfortran.so
 %endif
+%if %{isnative}
 ln -sf ../../../libgomp.so.1.* libgomp.so
 ln -sf ../../../libmudflap.so.0.* libmudflap.so
 ln -sf ../../../libmudflapth.so.0.* libmudflapth.so
+%endif
 %if %{build_java}
 ln -sf ../../../libgcj.so.8rh.* libgcj.so
 ln -sf ../../../libgcj-tools.so.8rh.* libgcj-tools.so
@@ -883,7 +923,9 @@ else
 %if %{build_objc}
 ln -sf ../../../../%{_lib}/libobjc.so.1 libobjc.so
 %endif
+%if %{isnative}
 ln -sf ../../../../%{_lib}/libstdc++.so.6.* libstdc++.so
+%endif
 %if %{build_fortran}
 ln -sf ../../../../%{_lib}/libgfortran.so.1.* libgfortran.so
 %endif
@@ -907,8 +949,10 @@ fi
 %if %{build_java}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcj_bc.so $FULLLPATH/
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libstdc++.*a $FULLLPATH/
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libsupc++.*a .
+%endif
 %if %{build_fortran}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgfortran.*a .
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgfortranbegin.*a .
@@ -916,21 +960,27 @@ mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
 %if %{build_objc}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libobjc.*a .
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgomp.*a .
 mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libmudflap{,th}.*a .
 mv -f $RPM_BUILD_ROOT%{_prefix}/include/mf-runtime.h include/
+%endif
 
 %ifarch sparc ppc
 %if %{build_objc}
 ln -sf ../../../../../lib64/libobjc.so.1 64/libobjc.so
 %endif
+%if %{isnative}
 ln -sf ../`echo ../../../../lib/libstdc++.so.6.* | sed s~/lib/~/lib64/~` 64/libstdc++.so
+%endif
 %if %{build_fortran}
 ln -sf ../`echo ../../../../lib/libgfortran.so.1.* | sed s~/lib/~/lib64/~` 64/libgfortran.so
 %endif
+%if %{isnative}
 ln -sf ../`echo ../../../../lib/libgomp.so.1.* | sed s~/lib/~/lib64/~` 64/libgomp.so
 ln -sf ../`echo ../../../../lib/libmudflap.so.0.* | sed s~/lib/~/lib64/~` 64/libmudflap.so
 ln -sf ../`echo ../../../../lib/libmudflapth.so.0.* | sed s~/lib/~/lib64/~` 64/libmudflapth.so
+%endif
 %if %{build_java}
 ln -sf ../`echo ../../../../lib/libgcj.so.8rh.* | sed s~/lib/~/lib64/~` 64/libgcj.so
 ln -sf ../`echo ../../../../lib/libgcj-tools.so.8rh.* | sed s~/lib/~/lib64/~` 64/libgcj-tools.so
@@ -938,7 +988,9 @@ ln -sf ../`echo ../../../../lib/libgij.s
 ln -sf lib32/libgcj_bc.so libgcj_bc.so
 ln -sf ../lib64/libgcj_bc.so 64/libgcj_bc.so
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libsupc++.*a 64/
+%endif
 %if %{build_fortran}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libgfortran.*a 64/
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libgfortranbegin.*a 64/
@@ -946,29 +998,37 @@ mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/li
 %if %{build_objc}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libobjc.*a 64/
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libgomp.*a 64/
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib64/libmudflap{,th}.*a 64/
 ln -sf lib32/libstdc++.a libstdc++.a
 ln -sf ../lib64/libstdc++.a 64/libstdc++.a
 %endif
+%endif
 %ifarch %{multilib_64_archs}
 mkdir -p 32
 %if %{build_objc}
 ln -sf ../../../../libobjc.so.1 32/libobjc.so
 %endif
+%if %{isnative}
 ln -sf ../`echo ../../../../lib64/libstdc++.so.6.* | sed s~/../lib64/~/~` 32/libstdc++.so
+%endif
 %if %{build_fortran}
 ln -sf ../`echo ../../../../lib64/libgfortran.so.1.* | sed s~/../lib64/~/~` 32/libgfortran.so
 %endif
+%if %{isnative}
 ln -sf ../`echo ../../../../lib64/libgomp.so.1.* | sed s~/../lib64/~/~` 32/libgomp.so
 ln -sf ../`echo ../../../../lib64/libmudflap.so.0.* | sed s~/../lib64/~/~` 32/libmudflap.so
 ln -sf ../`echo ../../../../lib64/libmudflapth.so.0.* | sed s~/../lib64/~/~` 32/libmudflapth.so
+%endif
 %if %{build_java}
 ln -sf ../`echo ../../../../lib64/libgcj.so.8rh.* | sed s~/../lib64/~/~` 32/libgcj.so
 ln -sf ../`echo ../../../../lib64/libgcj-tools.so.8rh.* | sed s~/../lib64/~/~` 32/libgcj-tools.so
 ln -sf ../`echo ../../../../lib64/libgij.so.8rh.* | sed s~/../lib64/~/~` 32/libgij.so
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libsupc++.*a 32/
+%endif
 %if %{build_fortran}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libgfortran.*a 32/
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libgfortranbegin.*a 32/
@@ -976,21 +1036,41 @@ mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libg
 %if %{build_objc}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.*a 32/
 %endif
+%if %{isnative}
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libgomp.*a 32/
 mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libmudflap{,th}.*a 32/
 %endif
+%endif
 %ifarch sparc64 ppc64
+%if %{isnative}
 ln -sf ../lib32/libstdc++.a 32/libstdc++.a
 ln -sf lib64/libstdc++.a libstdc++.a
+%endif
 %if %{build_java}
 ln -sf ../lib32/libgcj_bc.so 32/libgcj_bc.so
 ln -sf lib64/libgcj_bc.so libgcj_bc.so
 %endif
 %else
+case %{gcc_target} in
+    s390x*)
+	MULTILIB_32_ARCH=s390
+	;;
+    sparc64*)
+	MULTILIB_32_ARCH=sparc
+	;;
+    ppc64*)
+	MULTILIB_32_ARCH=ppc
+	;;
+    x86_64*)
+	MULTILIB_32_ARCH=i386
+	;;
+esac
 %ifarch %{multilib_64_archs}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libstdc++.a 32/libstdc++.a
+%if %{isnative}
+ln -sf ../../../${MULTILIB_32_ARCH}-%{_vendor}-%{_target_os}/%{gcc_version}/libstdc++.a 32/libstdc++.a
+%endif
 %if %{build_java}
-ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}/%{gcc_version}/libgcj_bc.so 32/libgcj_bc.so
+ln -sf ../../../${MULTILIB_32_ARCH}-%{_vendor}-%{_target_os}/%{gcc_version}/libgcj_bc.so 32/libgcj_bc.so
 %endif
 %endif
 %endif
@@ -1003,8 +1083,10 @@ popd
 %if %{build_fortran}
 chmod 755 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgfortran.so.1.*
 %endif
+%if %{isnative}
 chmod 755 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgomp.so.1.*
 chmod 755 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libmudflap{,th}.so.0.*
+%endif
 %if %{build_objc}
 chmod 755 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libobjc.so.1.*
 %endif
@@ -1022,7 +1104,11 @@ for h in `find $FULLPATH/include -name \
   fi
 done
 
+%if %{isnative}
 cat > $RPM_BUILD_ROOT%{_prefix}/bin/c89 <<"EOF"
+%else
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/%{gcc_target_platform}-c89 <<"EOF"
+%endif
 #!/bin/sh
 fl="-std=c89"
 for opt; do
@@ -1034,7 +1120,11 @@ for opt; do
 done
 exec gcc $fl ${1+"$@"}
 EOF
+%if %{isnative}
 cat > $RPM_BUILD_ROOT%{_prefix}/bin/c99 <<"EOF"
+%else
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/%{gcc_target_platform}-c99 <<"EOF"
+%endif
 #!/bin/sh
 fl="-std=c99"
 for opt; do
@@ -1046,17 +1136,25 @@ for opt; do
 done
 exec gcc $fl ${1+"$@"}
 EOF
+%if %{isnative}
 chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/c?9
+%else
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/%{gcc_target_platform}-c?9
+%endif
 
+%if %{isnative}
 %ifnarch %{arm}
 mkdir -p $RPM_BUILD_ROOT%{_prefix}/sbin
 gcc -static -Os %{SOURCE1} -o $RPM_BUILD_ROOT%{_prefix}/sbin/libgcc_post_upgrade
 strip $RPM_BUILD_ROOT%{_prefix}/sbin/libgcc_post_upgrade
 %endif
+%endif
 
 cd ..
+%if %{isnative}
 %find_lang %{name}
 %find_lang cpplib
+%endif
 
 # Remove binaries we will not be including, so that they don't end up in
 # gcc-debuginfo
@@ -1102,11 +1200,11 @@ if [ $1 = 0 ]; then
     --info-dir=%{_infodir} %{_infodir}/gcc.info.gz || :
 fi
 
-%post -n cpp
+%post -n %{?cross}cpp
 /sbin/install-info \
   --info-dir=%{_infodir} %{_infodir}/cpp.info.gz || :
 
-%preun -n cpp
+%preun -n %{?cross}cpp
 if [ $1 = 0 ]; then
   /sbin/install-info --delete \
     --info-dir=%{_infodir} %{_infodir}/cpp.info.gz || :
@@ -1154,48 +1252,53 @@ fi
 # Because glibc Prereq's libgcc and /sbin/ldconfig
 # comes from glibc, it might not exist yet when
 # libgcc is installed
-%post -n libgcc -p %{_prefix}/sbin/libgcc_post_upgrade
+%post -n %{?cross}libgcc -p %{_prefix}/sbin/libgcc_post_upgrade
 %endif
 
-%post -n libstdc++ -p /sbin/ldconfig
+%post -n %{?cross}libstdc++ -p /sbin/ldconfig
 
-%postun -n libstdc++ -p /sbin/ldconfig
+%postun -n %{?cross}libstdc++ -p /sbin/ldconfig
 
-%post -n libobjc -p /sbin/ldconfig
+%post -n %{?cross}libobjc -p /sbin/ldconfig
 
-%postun -n libobjc -p /sbin/ldconfig
+%postun -n %{?cross}libobjc -p /sbin/ldconfig
 
-%post -n libgcj
+%post -n %{?cross}libgcj
 /sbin/ldconfig
 /sbin/install-info \
   --info-dir=%{_infodir} %{_infodir}/fastjar.info.gz || :
 
-%preun -n libgcj
+%preun -n %{?cross}libgcj
 if [ $1 = 0 ]; then
   /sbin/install-info --delete \
     --info-dir=%{_infodir} %{_infodir}/fastjar.info.gz || :
 fi
 
-%postun -n libgcj -p /sbin/ldconfig
+%postun -n %{?cross}libgcj -p /sbin/ldconfig
 
-%post -n libgfortran -p /sbin/ldconfig
+%post -n %{?cross}libgfortran -p /sbin/ldconfig
 
-%postun -n libgfortran -p /sbin/ldconfig
+%postun -n %{?cross}libgfortran -p /sbin/ldconfig
 
-%post -n libgnat -p /sbin/ldconfig
+%post -n %{?cross}libgnat -p /sbin/ldconfig
 
-%postun -n libgnat -p /sbin/ldconfig
+%postun -n %{?cross}libgnat -p /sbin/ldconfig
 
-%post -n libgomp -p /sbin/ldconfig
+%post -n %{?cross}libgomp -p /sbin/ldconfig
 
-%postun -n libgomp -p /sbin/ldconfig
+%postun -n %{?cross}libgomp -p /sbin/ldconfig
 
-%post -n libmudflap -p /sbin/ldconfig
+%post -n %{?cross}libmudflap -p /sbin/ldconfig
 
-%postun -n libmudflap -p /sbin/ldconfig
+%postun -n %{?cross}libmudflap -p /sbin/ldconfig
 
+%if %{isnative}
 %files -f %{name}.lang
+%else
+%files
+%endif
 %defattr(-,root,root)
+%if %{isnative}
 %{_prefix}/bin/cc
 %{_prefix}/bin/c89
 %{_prefix}/bin/c99
@@ -1203,6 +1306,11 @@ fi
 %{_prefix}/bin/gcov
 %{_prefix}/bin/protoize
 %{_prefix}/bin/unprotoize
+%else
+%{_prefix}/bin/%{gcc_target_platform}-c89
+%{_prefix}/bin/%{gcc_target_platform}-c99
+%{_prefix}/bin/%{gcc_target_platform}-gcov
+%endif
 %ifarch sparc ppc
 %{_prefix}/bin/%{_target_platform}-gcc
 %endif
@@ -1213,11 +1321,16 @@ fi
 %{_prefix}/bin/ppc-%{_vendor}-%{_target_os}-gcc
 %endif
 %{_prefix}/bin/%{gcc_target_platform}-gcc
+%if %{isnative}
 %{_mandir}/man1/gcc.1*
 %{_mandir}/man1/gcov.1*
 %{_mandir}/man1/protoize.1*
 %{_mandir}/man1/unprotoize.1*
 %{_infodir}/gcc*
+%else
+%{_mandir}/man1/%{gcc_target_platform}-gcc.1*
+%{_mandir}/man1/%{gcc_target_platform}-gcov.1*
+%endif
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}
@@ -1225,7 +1338,9 @@ fi
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include
+%if %{isnative}
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/SYSCALLS.c.X
+%endif
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/stddef.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/stdarg.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/varargs.h
@@ -1235,6 +1350,7 @@ fi
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/iso646.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/syslimits.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/unwind.h
+%if %{isnative}
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/omp.h
 %ifarch %{ix86} x86_64
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/mmintrin.h
@@ -1254,12 +1370,14 @@ fi
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/altivec.h
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/spe.h
 %endif
+%endif
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/README
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/collect2
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/crt*.o
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgcc.a
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgcov.a
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgcc_eh.a
+%if %{isnative}
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgcc_s.so
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgomp.spec
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libgomp.a
@@ -1284,30 +1402,50 @@ fi
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/32/libgomp.a
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/32/libgomp.so
 %endif
+%endif
+%if !%{isnative}
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/as
+%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/nm
+%endif
 %dir %{_prefix}/libexec/getconf
 %{_prefix}/libexec/getconf/default
 %doc gcc/README* rpm.doc/changelogs/gcc/ChangeLog* gcc/COPYING*
 
+%if %{isnative}
 %files -n cpp -f cpplib.lang
+%else
+%files -n %{?cross}cpp
+%endif
 %defattr(-,root,root)
+%if %{isnative}
 /lib/cpp
 %{_prefix}/bin/cpp
 %{_mandir}/man1/cpp.1*
 %{_infodir}/cpp*
+%else
+%{_prefix}/bin/%{gcc_target_platform}-cpp
+%endif
 %dir %{_prefix}/libexec/gcc
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1
 
-%files -n libgcc
+%files -n %{?cross}libgcc
 %defattr(-,root,root)
+%if %{isnative}
 /%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
 /%{_lib}/libgcc_s.so.1
+%else
+/%{_prefix}/%{gcc_target_platform}/%{_lib}/libgcc_s.so.1
+%endif
+%if %{isnative)
 %ifnarch %{arm}
 %{_prefix}/sbin/libgcc_post_upgrade
 %endif
+%endif
 %doc gcc/COPYING.LIB
 
+%if %{isnative}
 %files c++
 %defattr(-,root,root)
 %{_prefix}/bin/%{gcc_target_platform}-*++
@@ -1342,11 +1480,11 @@ fi
 %endif
 %doc rpm.doc/changelogs/gcc/cp/ChangeLog*
 
-%files -n libstdc++
+%files -n %{?cross}libstdc++
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libstdc++.so.6*
 
-%files -n libstdc++-devel
+%files -n %{?cross}libstdc++-devel
 %defattr(-,root,root)
 %dir %{_prefix}/include/c++
 %dir %{_prefix}/include/c++/%{gcc_version}
@@ -1372,6 +1510,7 @@ fi
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/libsupc++.a
 %endif
 %doc rpm.doc/changelogs/libstdc++-v3/ChangeLog* libstdc++-v3/README* libstdc++-v3/docs/html/
+%endif
 
 %if %{build_objc}
 %files objc
@@ -1407,7 +1546,7 @@ fi
 %dir %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/cc1objplus
 
-%files -n libobjc
+%files -n %{?cross}libobjc
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libobjc.so.1*
 %endif
@@ -1448,7 +1587,7 @@ fi
 %endif
 %doc rpm.doc/gfortran/*
 
-%files -n libgfortran
+%files -n %{?cross}libgfortran
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libgfortran.so.1*
 %endif
@@ -1496,7 +1635,7 @@ fi
 %endif
 %doc rpm.doc/changelogs/gcc/java/ChangeLog*
 
-%files -n libgcj
+%files -n %{?cross}libgcj
 %defattr(-,root,root)
 %{_prefix}/bin/jv-convert
 %{_prefix}/bin/gij
@@ -1555,7 +1694,7 @@ fi
 %doc rpm.doc/README.libgcjwebplugin.so
 %endif
 
-%files -n libgcj-devel
+%files -n %{?cross}libgcj-devel
 %defattr(-,root,root)
 %{_prefix}/bin/addr2name.awk
 %dir %{_prefix}/lib/gcc
@@ -1589,7 +1728,7 @@ fi
 %doc rpm.doc/boehm-gc/* rpm.doc/fastjar/* rpm.doc/libffi/*
 %doc rpm.doc/libjava/*
 
-%files -n libgcj-src
+%files -n %{?cross}libgcj-src
 %defattr(-,root,root)
 %dir %{_prefix}/share/java
 %{_prefix}/share/java/src*.zip
@@ -1613,23 +1752,24 @@ fi
 %{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_version}/gnat1
 %doc rpm.doc/changelogs/gcc/ada/ChangeLog*
 
-%files -n libgnat
+%files -n %{?cross}libgnat
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libgnat-*.so
 %{_prefix}/%{_lib}/libgnarl-*.so
 %endif
 
-%files -n libgomp
+%if %{isnative}
+%files -n %{?cross}libgomp
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libgomp.so.1*
 %doc rpm.doc/changelogs/libgomp/ChangeLog*
 
-%files -n libmudflap
+%files -n %{?cross}libmudflap
 %defattr(-,root,root)
 %{_prefix}/%{_lib}/libmudflap.so.0*
 %{_prefix}/%{_lib}/libmudflapth.so.0*
 
-%files -n libmudflap-devel
+%files -n %{?cross}libmudflap-devel
 %defattr(-,root,root)
 %dir %{_prefix}/lib/gcc
 %dir %{_prefix}/lib/gcc/%{gcc_target_platform}
@@ -1655,6 +1795,7 @@ fi
 %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/32/libmudflapth.so
 %endif
 %doc rpm.doc/changelogs/libmudflap/ChangeLog*
+%endif
 
 %changelog
 * Thu May  3 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-12




More information about the fedora-devel-list mailing list