Introduce infrastructure for cross-compiling Fedora kernels

Intended to assist building for secondary architectures like ppc64, s390x,
  and arm.

  To use, create an .src.rpm using "fedpkg srpm" and then run
  "rpmbuild --rebuild --with cross --without perf --without tools \
    kernel*.src.rpm" to cross compile. This requires binutils and gcc
  packages named like %_target_cpu, which all but powerpc64 currently provides
  in rawhide/F-19. Can't (currently) cross compile perf or kernel-tools, since
  libc is missing from the cross environment.
This commit is contained in:
Kyle McMartin 2013-06-13 17:24:01 -04:00
parent 2afa3c7952
commit 43d64b26e6
1 changed files with 33 additions and 13 deletions

View File

@ -147,6 +147,9 @@ Summary: The Linux kernel
# should we do C=1 builds with sparse # should we do C=1 builds with sparse
%define with_sparse %{?_with_sparse: 1} %{?!_with_sparse: 0} %define with_sparse %{?_with_sparse: 1} %{?!_with_sparse: 0}
# #
# Cross compile requested?
%define with_cross %{?_with_cross: 1} %{?!_with_cross: 0}
#
# build a release kernel on rawhide # build a release kernel on rawhide
%define with_release %{?_with_release: 1} %{?!_with_release: 0} %define with_release %{?_with_release: 1} %{?!_with_release: 0}
@ -534,6 +537,11 @@ BuildRequires: openssl
BuildRequires: pesign >= 0.10-4 BuildRequires: pesign >= 0.10-4
%endif %endif
%if %{with_cross}
BuildRequires: binutils-%{_build_arch}-linux-gnu, gcc-%{_build_arch}-linux-gnu
%define cross_opts CROSS_COMPILE=%{_build_arch}-linux-gnu-
%endif
Source0: ftp://ftp.kernel.org/pub/linux/kernel/v3.0/linux-%{kversion}.tar.xz Source0: ftp://ftp.kernel.org/pub/linux/kernel/v3.0/linux-%{kversion}.tar.xz
%if %{signmodules} %if %{signmodules}
@ -1507,6 +1515,8 @@ mkdir configs
rm -f kernel-%{version}-*debug.config rm -f kernel-%{version}-*debug.config
%endif %endif
%define make make %{?cross_opts}
# now run oldconfig over all the config files # now run oldconfig over all the config files
for i in *.config for i in *.config
do do
@ -1600,7 +1610,7 @@ BuildKernel() {
# and now to start the build process # and now to start the build process
make -s mrproper %{make} -s mrproper
cp configs/$Config .config cp configs/$Config .config
%if %{signmodules} %if %{signmodules}
@ -1613,11 +1623,11 @@ BuildKernel() {
echo USING ARCH=$Arch echo USING ARCH=$Arch
make -s ARCH=$Arch oldnoconfig >/dev/null make -s ARCH=$Arch oldnoconfig >/dev/null
make -s ARCH=$Arch V=1 %{?_smp_mflags} $MakeTarget %{?sparse_mflags} %{?kernel_mflags} %{make} -s ARCH=$Arch V=1 %{?_smp_mflags} $MakeTarget %{?sparse_mflags} %{?kernel_mflags}
make -s ARCH=$Arch V=1 %{?_smp_mflags} modules %{?sparse_mflags} || exit 1 %{make} -s ARCH=$Arch V=1 %{?_smp_mflags} modules %{?sparse_mflags} || exit 1
%ifarch %{arm} %ifarch %{arm}
make -s ARCH=$Arch V=1 dtbs %{make} -s ARCH=$Arch V=1 dtbs
mkdir -p $RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer mkdir -p $RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer
install -m 644 arch/arm/boot/dts/*.dtb $RPM_BUILD_ROOT/boot/dtb-$KernelVer/ install -m 644 arch/arm/boot/dts/*.dtb $RPM_BUILD_ROOT/boot/dtb-$KernelVer/
rm -f arch/arm/boot/dts/*.dtb rm -f arch/arm/boot/dts/*.dtb
@ -1656,10 +1666,10 @@ BuildKernel() {
mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer
# Override $(mod-fw) because we don't want it to install any firmware # Override $(mod-fw) because we don't want it to install any firmware
# we'll get it from the linux-firmware package and we don't want conflicts # we'll get it from the linux-firmware package and we don't want conflicts
make -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT modules_install KERNELRELEASE=$KernelVer mod-fw= %{make} -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT modules_install KERNELRELEASE=$KernelVer mod-fw=
%ifarch %{vdso_arches} %ifarch %{vdso_arches}
make -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT vdso_install KERNELRELEASE=$KernelVer %{make} -s ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT vdso_install KERNELRELEASE=$KernelVer
if [ ! -s ldconfig-kernel.conf ]; then if [ ! -s ldconfig-kernel.conf ]; then
echo > ldconfig-kernel.conf "\ echo > ldconfig-kernel.conf "\
# Placeholder file, no vDSO hwcap entries used in this kernel." # Placeholder file, no vDSO hwcap entries used in this kernel."
@ -1828,7 +1838,7 @@ BuildKernel %make_target %kernel_image smp
%endif %endif
%global perf_make \ %global perf_make \
make %{?_smp_mflags} -C tools/perf -s V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix} make -s %{?cross_opts} %{?_smp_mflags} -C tools/perf V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix}
%if %{with_perf} %if %{with_perf}
# perf # perf
%{perf_make} all %{perf_make} all
@ -1840,23 +1850,23 @@ BuildKernel %make_target %kernel_image smp
# cpupower # cpupower
# make sure version-gen.sh is executable. # make sure version-gen.sh is executable.
chmod +x tools/power/cpupower/utils/version-gen.sh chmod +x tools/power/cpupower/utils/version-gen.sh
make %{?_smp_mflags} -C tools/power/cpupower CPUFREQ_BENCH=false %{make} %{?_smp_mflags} -C tools/power/cpupower CPUFREQ_BENCH=false
%ifarch %{ix86} %ifarch %{ix86}
pushd tools/power/cpupower/debug/i386 pushd tools/power/cpupower/debug/i386
make %{?_smp_mflags} centrino-decode powernow-k8-decode %{make} %{?_smp_mflags} centrino-decode powernow-k8-decode
popd popd
%endif %endif
%ifarch x86_64 %ifarch x86_64
pushd tools/power/cpupower/debug/x86_64 pushd tools/power/cpupower/debug/x86_64
make %{?_smp_mflags} centrino-decode powernow-k8-decode %{make} %{?_smp_mflags} centrino-decode powernow-k8-decode
popd popd
%endif %endif
%ifarch %{ix86} x86_64 %ifarch %{ix86} x86_64
pushd tools/power/x86/x86_energy_perf_policy/ pushd tools/power/x86/x86_energy_perf_policy/
make %{make}
popd popd
pushd tools/power/x86/turbostat pushd tools/power/x86/turbostat
make %{make}
popd popd
%endif #turbostat/x86_energy_perf_policy %endif #turbostat/x86_energy_perf_policy
%endif %endif
@ -1990,7 +2000,7 @@ find $RPM_BUILD_ROOT/usr/include \
%if %{with_tools} %if %{with_tools}
%ifarch %{cpupowerarchs} %ifarch %{cpupowerarchs}
make -C tools/power/cpupower DESTDIR=$RPM_BUILD_ROOT libdir=%{_libdir} mandir=%{_mandir} CPUFREQ_BENCH=false install %{make} -C tools/power/cpupower DESTDIR=$RPM_BUILD_ROOT libdir=%{_libdir} mandir=%{_mandir} CPUFREQ_BENCH=false install
rm -f %{buildroot}%{_libdir}/*.{a,la} rm -f %{buildroot}%{_libdir}/*.{a,la}
%find_lang cpupower %find_lang cpupower
mv cpupower.lang ../ mv cpupower.lang ../
@ -2281,6 +2291,16 @@ fi
# ||----w | # ||----w |
# || || # || ||
%changelog %changelog
* Thu Jun 13 2013 Kyle McMartin <kyle@redhat.com>
- Introduce infrastructure for cross-compiling Fedora kernels. Intended to
assist building for secondary architectures like ppc64, s390x, and arm.
To use, create an .src.rpm using "fedpkg srpm" and then run
"rpmbuild --rebuild --with cross --without perf --without tools \
kernel*.src.rpm" to cross compile. This requires binutils and gcc
packages named like %_target_cpu, which all but powerpc64 currently provides
in rawhide/F-19. Can't (currently) cross compile perf or kernel-tools, since
libc is missing from the cross environment.
* Thu Jun 13 2013 Kyle McMartin <kyle@redhat.com> * Thu Jun 13 2013 Kyle McMartin <kyle@redhat.com>
- arm-export-read_current_timer.patch: drop upstream patch - arm-export-read_current_timer.patch: drop upstream patch
(results in duplicate exports) (results in duplicate exports)