[PATCH] cross-compilation for binutils.

Jan Kratochvil jan.kratochvil at redhat.com
Sat Jul 26 04:02:52 UTC 2008


Hi David,

made some minor updates upon yours:
* Fixed the testsuite run for cross-builds.
* Fixed omitted --with-sysroot for the cross-builds.
* Replaced --with-sysroot /usr with %{_prefix}.
* Fixed %if F-10 rpm compatibility.

OK to commit it for Rawhide?


Regards,
Jan
-------------- next part --------------
--- ./binutils.spec	16 Jul 2008 18:39:54 -0000	1.134
+++ ./binutils.spec	26 Jul 2008 03:48:29 -0000
@@ -1,7 +1,19 @@
+# rpmbuild parameters:
+# --define "binutils_target arm-linux-gnu" to create arm-linux-gnu-binutils.
+# --without testsuite: Do not run the testsuite.  Default is to run it.
+
+%if 0%{!?binutils_target:1}
+%define binutils_target %{_target_platform}
+%define isnative 1
+%else
+%define cross %{binutils_target}-
+%define isnative 0
+%endif
+
 Summary: A GNU collection of binary utilities.
-Name: binutils
+Name: %{?cross}binutils
 Version: 2.18.50.0.6
-Release: 4%{?dist}
+Release: 5%{?dist}
 License: GPLv3+
 Group: Development/Tools
 URL: http://sources.redhat.com/binutils
@@ -54,7 +66,7 @@ have a stable ABI.  Developers starting 
 to consider using libelf instead of BFD.
 
 %prep
-%setup -q
+%setup -q -n binutils-%{version}
 %patch1 -p0 -b .ltconfig-multilib~
 %patch2 -p0 -b .ppc64-pie~
 %patch3 -p0 -b .place-orphan~
@@ -68,7 +80,7 @@ to consider using libelf instead of BFD.
 %patch7 -p0 -b .version~
 %patch8 -p0 -b .pclmul~
 
-# On ppc64 we might use 64K pages
+# On ppc64 we might use 64KiB pages
 sed -i -e '/#define.*ELF_COMMONPAGESIZE/s/0x1000$/0x10000/' bfd/elf*ppc.c
 # LTP sucks
 perl -pi -e 's/i\[3-7\]86/i[34567]86/g' */conf*
@@ -80,38 +92,65 @@ sed -i -e 's/^libbfd_la_LDFLAGS = /&-Wl,
 sed -i -e 's/^libopcodes_la_LDFLAGS = /&-Wl,-Bsymbolic-functions /' opcodes/Makefile.{am,in}
 fi
 touch */configure
+# $PACKAGE is used for the gettext catalog name.
+sed -i -e 's/^ PACKAGE=/ PACKAGE=%{?cross}/' */configure
+# Undo the name change to run the testsuite.
+for tool in binutils gas ld
+do
+  sed -i -e "2aDEJATOOL = $tool" $tool/Makefile.am
+  sed -i -e "s/^DEJATOOL = .*/DEJATOOL = $tool/" $tool/Makefile.in
+done
 
 %build
-mkdir build-%{_target_platform}
-cd build-%{_target_platform}
+echo target is %{binutils_target}
+mkdir build-%{binutils_target}
+cd build-%{binutils_target}
 CARGS=
-%ifarch sparc ppc s390
-CARGS=--enable-64-bit-bfd
-%endif
-%ifarch ia64
-CARGS=--enable-targets=i386-linux
-%endif
+case %{binutils_target} in
+    sparc*|ppc*|s390*)
+       CARGS="--enable-64-bit-bfd"
+       ;;
+    ia64*)
+       CARGS="--enable-targets=i386-linux"
+       ;;
+esac
+# We could optimize the cross builds size by --enable-shared but the produced
+# binaries may be less convenient in the embedded environment.
 CC="gcc -L`pwd`/bfd/.libs/" CFLAGS="${CFLAGS:-%optflags}" ../configure \
-  %{_target_platform} --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} \
+%if %{isnative}
+  %{binutils_target} \
+  --enable-shared \
+%else
+  --target %{binutils_target} --enable-targets=%{_host} \
+  --disable-shared \
+  --with-sysroot=%{_prefix}/%{binutils_target}/sys-root \
+%endif
+  $CARGS \
+  --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} \
   --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} \
   --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} \
   --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} \
   --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir} \
-  --infodir=%{_infodir} --enable-shared $CARGS --disable-werror \
+  --infodir=%{_infodir} --disable-werror \
   --with-bugurl=http://bugzilla.redhat.com/bugzilla/
 make %{_smp_mflags} tooldir=%{_prefix} all
 make %{_smp_mflags} tooldir=%{_prefix} info
+%if 0%{?_without_testsuite:1}
+echo ====================TESTSUITE DISABLED=========================
+%else
 make -k check < /dev/null > check.log 2>&1 || :
 echo ====================TESTING=========================
 cat check.log
 echo ====================TESTING END=====================
 cd ..
+%endif
 
 %install
 rm -rf %{buildroot}
 mkdir -p %{buildroot}%{_prefix}
-cd build-%{_target_platform}
+cd build-%{binutils_target}
 %makeinstall
+%if %{isnative}
 make prefix=%{buildroot}%{_prefix} infodir=%{buildroot}%{_infodir} install-info
 gzip -q9f %{buildroot}%{_infodir}/*.info*
 
@@ -141,10 +180,6 @@ rm -f %{buildroot}%{_prefix}/%{_lib}/lib
 # Remove libtool files, which reference the .so libs
 rm -f %{buildroot}%{_prefix}/%{_lib}/lib{bfd,opcodes}.la
 
-# This one comes from gcc
-rm -f %{buildroot}%{_infodir}/dir
-rm -rf %{buildroot}%{_prefix}/%{_target_platform}
-
 %ifarch %{ix86} x86_64 ppc ppc64 s390 s390x sparc sparc64
 sed -i -e '/^#include "ansidecl.h"/{p;s~^.*$~#include <bits/wordsize.h>~;}' \
 %ifarch %{ix86} x86_64
@@ -162,22 +197,36 @@ sed -i -e '/^#include "ansidecl.h"/{p;s~
 %endif
 touch -r ../bfd/bfd-in2.h %{buildroot}%{_prefix}/include/bfd.h
 
+%else # !%{isnative}
+# For cross-binutils we drop the documentation.
+rm -rf %{buildroot}%{_infodir}
+# We keep these as one can have native + cross binutils of different versions.
+#rm -rf %{buildroot}%{_prefix}/share/locale
+#rm -rf %{buildroot}%{_mandir}
+rm -rf %{buildroot}%{_prefix}/%{_lib}/libiberty.a
+%endif # !%{isnative}
+
+# This one comes from gcc
+rm -f %{buildroot}%{_infodir}/dir
+rm -rf %{buildroot}%{_prefix}/%{binutils_target}
+
 cd ..
-%find_lang binutils
-%find_lang opcodes
-%find_lang bfd
-%find_lang gas
-%find_lang ld
-%find_lang gprof
-cat opcodes.lang >> binutils.lang
-cat bfd.lang >> binutils.lang
-cat gas.lang >> binutils.lang
-cat ld.lang >> binutils.lang
-cat gprof.lang >> binutils.lang
+%find_lang %{?cross}binutils
+%find_lang %{?cross}opcodes
+%find_lang %{?cross}bfd
+%find_lang %{?cross}gas
+%find_lang %{?cross}ld
+%find_lang %{?cross}gprof
+cat %{?cross}opcodes.lang >> %{?cross}binutils.lang
+cat %{?cross}bfd.lang >> %{?cross}binutils.lang
+cat %{?cross}gas.lang >> %{?cross}binutils.lang
+cat %{?cross}ld.lang >> %{?cross}binutils.lang
+cat %{?cross}gprof.lang >> %{?cross}binutils.lang
 
 %clean
 rm -rf %{buildroot}
 
+%if %{isnative}
 %post
 /sbin/ldconfig
 /sbin/install-info --info-dir=%{_infodir} %{_infodir}/as.info.gz
@@ -208,12 +257,14 @@ exit 0
 if [ $1 = 0 ] ;then
   /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/bfd.info.gz || :
 fi
+%endif # %{isnative}
 
-%files -f binutils.lang
+%files -f %{?cross}binutils.lang
 %defattr(-,root,root)
 %doc README
 %{_prefix}/bin/*
 %{_mandir}/man1/*
+%if %{isnative}
 %{_prefix}/%{_lib}/lib*.so
 %{_infodir}/[^b]*info*
 %{_infodir}/binutils*info*
@@ -223,8 +274,15 @@ fi
 %{_prefix}/include/*
 %{_prefix}/%{_lib}/lib*.a
 %{_infodir}/bfd*info*
+%endif # %{isnative}
 
 %changelog
+* Sat Jul 26 2008 Jan Kratochvil <jan.kratochvil at redhat.com> 2.18.50.0.6-5
+- Add %%{binutils_target} macro to support building cross-binutils.
+  (David Woodhouse)
+- Support `--without testsuite' to suppress the testsuite run.
+- Refresh the patchset with fuzz 0 (for new rpmbuild).
+
 * Wed Jul 16 2008 Jan Kratochvil <jan.kratochvil at redhat.com> 2.18.50.0.6-4
 - include the `dist' tag in the Release number
 - libbfd.a symbols visibility is now hidden (for #447426, suggested by Jakub)
--- ./binutils-2.18.50.0.6-place-orphan.patch	4 Apr 2008 09:48:39 -0000	1.1
+++ ./binutils-2.18.50.0.6-place-orphan.patch	26 Jul 2008 03:48:29 -0000
@@ -2,8 +2,8 @@
 
 	* emulparams/elf64ppc.sh (OTHER_GOT_RELOC_SECTIONS): Add .rela.opd.
 
---- ld/emulparams/elf64ppc.sh.jj	2003-07-28 10:24:45.000000000 -0400
-+++ ld/emulparams/elf64ppc.sh	2003-08-05 08:35:58.000000000 -0400
+--- ld/emulparams/elf64ppc.sh	2007-03-16 16:48:30.000000000 +0100
++++ ld/emulparams/elf64ppc.sh	2008-07-25 20:11:20.000000000 +0200
 @@ -28,7 +28,8 @@ else
    .toc		0 : { *(.toc) }"
  fi
@@ -12,5 +12,5 @@
 +  .rela.toc	${RELOCATING-0} : { *(.rela.toc) }
 +  .rela.opd	${RELOCATING-0} : { *(.rela.opd) }"
  OTHER_READWRITE_SECTIONS="
-   .toc1		${RELOCATING-0}${RELOCATING+ALIGN(8)} : { *(.toc1) }
-   .opd		${RELOCATING-0}${RELOCATING+ALIGN(8)} : { KEEP (*(.opd)) }"
+   .toc1		${RELOCATING-0} :${RELOCATING+ ALIGN(8)} { *(.toc1) }
+   .opd		${RELOCATING-0} :${RELOCATING+ ALIGN(8)} { KEEP (*(.opd)) }


More information about the fedora-devel-list mailing list