1eda14cbcSMatt Macy#!/usr/bin/env bash 2b0c251b0SMartin Matuska# shellcheck disable=SC2086 3eda14cbcSMatt Macy 4eda14cbcSMatt Macy# kmodtool - Helper script for building kernel module RPMs 5eda14cbcSMatt Macy# Copyright (c) 2003-2012 Ville Skyttä <[email protected]>, 6eda14cbcSMatt Macy# Thorsten Leemhuis <[email protected]> 7eda14cbcSMatt Macy# Nicolas Chauvet <[email protected]> 8eda14cbcSMatt Macy# 9eda14cbcSMatt Macy# Permission is hereby granted, free of charge, to any person obtaining 10eda14cbcSMatt Macy# a copy of this software and associated documentation files (the 11eda14cbcSMatt Macy# "Software"), to deal in the Software without restriction, including 12eda14cbcSMatt Macy# without limitation the rights to use, copy, modify, merge, publish, 13eda14cbcSMatt Macy# distribute, sublicense, and/or sell copies of the Software, and to 14eda14cbcSMatt Macy# permit persons to whom the Software is furnished to do so, subject to 15eda14cbcSMatt Macy# the following conditions: 16eda14cbcSMatt Macy# 17eda14cbcSMatt Macy# The above copyright notice and this permission notice shall be 18eda14cbcSMatt Macy# included in all copies or substantial portions of the Software. 19eda14cbcSMatt Macy# 20eda14cbcSMatt Macy# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21eda14cbcSMatt Macy# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22eda14cbcSMatt Macy# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23eda14cbcSMatt Macy# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24eda14cbcSMatt Macy# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25eda14cbcSMatt Macy# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26eda14cbcSMatt Macy# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27eda14cbcSMatt Macy 28eda14cbcSMatt Macyshopt -s extglob 29eda14cbcSMatt Macy 30eda14cbcSMatt Macymyprog="kmodtool-${repo}" 31eda14cbcSMatt Macymyver="0.12.1" 32eda14cbcSMatt Macy 33eda14cbcSMatt Macykmodname= 34eda14cbcSMatt Macybuild_kernels="current" 35eda14cbcSMatt Macykernels_known_variants= 36eda14cbcSMatt Macykernel_versions= 37eda14cbcSMatt Macykernel_versions_to_build_for= 38eda14cbcSMatt Macyprefix= 39eda14cbcSMatt Macyfilterfile= 40eda14cbcSMatt Macytarget= 41eda14cbcSMatt Macybuildroot= 42b0c251b0SMartin Matuskadashvariant= 43eda14cbcSMatt Macy 44eda14cbcSMatt Macyerror_out() 45eda14cbcSMatt Macy{ 46eda14cbcSMatt Macy local errorlevel=${1} 47eda14cbcSMatt Macy shift 48b0c251b0SMartin Matuska echo "Error: $*" >&2 49eda14cbcSMatt Macy # the next line is not multi-line safe -- not needed *yet* 50b0c251b0SMartin Matuska echo "%global kmodtool_check echo \"kmodtool error: $*\"; exit ${errorlevel};" 51b0c251b0SMartin Matuska exit "${errorlevel}" 52eda14cbcSMatt Macy} 53eda14cbcSMatt Macy 54eda14cbcSMatt Macyprint_rpmtemplate_header() 55eda14cbcSMatt Macy{ 56eda14cbcSMatt Macy echo 57eda14cbcSMatt Macy echo '%global kmodinstdir_prefix '${prefix}/lib/modules/ 58eda14cbcSMatt Macy echo '%global kmodinstdir_postfix '/extra/${kmodname}/ 59eda14cbcSMatt Macy echo '%global kernel_versions '${kernel_versions} 60eda14cbcSMatt Macy echo 61eda14cbcSMatt Macy} 62eda14cbcSMatt Macy 63eda14cbcSMatt Macyprint_akmodtemplate () 64eda14cbcSMatt Macy{ 65eda14cbcSMatt Macy echo 66eda14cbcSMatt Macy cat <<EOF 67eda14cbcSMatt Macy 68eda14cbcSMatt Macy%global akmod_install mkdir -p \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/; \\\ 69eda14cbcSMatt MacyLANG=C rpmbuild --define "_sourcedir %{_sourcedir}" \\\ 70eda14cbcSMatt Macy--define "_srcrpmdir \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/" \\\ 71eda14cbcSMatt Macy-bs --nodeps %{_specdir}/%{name}.spec ; \\\ 72eda14cbcSMatt Macyln -s \$(ls \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/) \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/${kmodname}-kmod.latest 73eda14cbcSMatt Macy 74eda14cbcSMatt Macy%package -n akmod-${kmodname} 75eda14cbcSMatt MacySummary: Akmod package for ${kmodname} kernel module(s) 76eda14cbcSMatt MacyGroup: System Environment/Kernel 77eda14cbcSMatt MacyRequires: kmodtool 78eda14cbcSMatt MacyRequires: akmods 79eda14cbcSMatt Macy%{?AkmodsBuildRequires:Requires: %{AkmodsBuildRequires}} 80eda14cbcSMatt Macy# same requires and provides as a kmods package would have 81eda14cbcSMatt MacyRequires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version} 82eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 83eda14cbcSMatt MacyEOF 84eda14cbcSMatt Macy 85eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 86eda14cbcSMatt Macy echo "Provides: akmod-${obsolete_name} = ${obsolete_version}" 87eda14cbcSMatt Macy echo "Obsoletes: akmod-${obsolete_name} < ${obsolete_version}" 88eda14cbcSMatt Macy fi 89eda14cbcSMatt Macy 90eda14cbcSMatt Macy cat <<EOF 91eda14cbcSMatt Macy 92eda14cbcSMatt Macy%description -n akmod-${kmodname} 93eda14cbcSMatt MacyThis package provides the akmod package for the ${kmodname} kernel modules. 94eda14cbcSMatt Macy 95eda14cbcSMatt Macy%posttrans -n akmod-${kmodname} 96eda14cbcSMatt Macynohup ${prefix}/sbin/akmods --from-akmod-posttrans --akmod ${kmodname} &> /dev/null & 97eda14cbcSMatt Macy 98eda14cbcSMatt Macy%files -n akmod-${kmodname} 99eda14cbcSMatt Macy%defattr(-,root,root,-) 100eda14cbcSMatt Macy%{_usrsrc}/akmods/* 101eda14cbcSMatt Macy 102eda14cbcSMatt MacyEOF 103eda14cbcSMatt Macy} 104eda14cbcSMatt Macy 105eda14cbcSMatt Macyprint_akmodmeta () 106eda14cbcSMatt Macy{ 107eda14cbcSMatt Macy cat <<EOF 108eda14cbcSMatt Macy%package -n kmod-${kmodname} 109eda14cbcSMatt MacySummary: Metapackage which tracks in ${kmodname} kernel module for newest kernel${dashvariant} 110eda14cbcSMatt MacyGroup: System Environment/Kernel 111eda14cbcSMatt Macy 112eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 113eda14cbcSMatt MacyProvides: kmod-${kmodname}-xen = %{?epoch:%{epoch}:}%{version}-%{release} 114eda14cbcSMatt MacyProvides: kmod-${kmodname}-smp = %{?epoch:%{epoch}:}%{version}-%{release} 115eda14cbcSMatt MacyProvides: kmod-${kmodname}-PAE = %{?epoch:%{epoch}:}%{version}-%{release} 116eda14cbcSMatt MacyRequires: akmod-${kmodname} = %{?epoch:%{epoch}:}%{version}-%{release} 117eda14cbcSMatt MacyEOF 118eda14cbcSMatt Macy 119eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 120eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name} = ${obsolete_version}" 121eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name} < ${obsolete_version}" 122eda14cbcSMatt Macy fi 123eda14cbcSMatt Macycat <<EOF 124eda14cbcSMatt Macy 125eda14cbcSMatt Macy%description -n kmod-${kmodname}${dashvariant} 126eda14cbcSMatt MacyThis is a meta-package without payload which sole purpose is to require the 127eda14cbcSMatt Macy${kmodname} kernel module(s) for the newest kernel${dashvariant}, 128eda14cbcSMatt Macyto make sure you get it together with a new kernel. 129eda14cbcSMatt Macy 130eda14cbcSMatt Macy%files -n kmod-${kmodname}${dashvariant} 131eda14cbcSMatt Macy%defattr(644,root,root,755) 132eda14cbcSMatt MacyEOF 133eda14cbcSMatt Macy} 134eda14cbcSMatt Macy 135eda14cbcSMatt Macyprint_rpmtemplate_per_kmodpkg () 136eda14cbcSMatt Macy{ 137eda14cbcSMatt Macy if [[ "${1}" == "--custom" ]]; then 138eda14cbcSMatt Macy shift 139eda14cbcSMatt Macy local customkernel=true 140eda14cbcSMatt Macy elif [[ "${1}" == "--redhat" ]]; then 141eda14cbcSMatt Macy # this is needed for akmods 142eda14cbcSMatt Macy shift 143eda14cbcSMatt Macy local redhatkernel=true 144eda14cbcSMatt Macy fi 145eda14cbcSMatt Macy 146eda14cbcSMatt Macy local kernel_uname_r=${1} 147eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 148eda14cbcSMatt Macy 149eda14cbcSMatt Macy # Detect depmod install location 150eda14cbcSMatt Macy local depmod_path=/sbin/depmod 151eda14cbcSMatt Macy if [ ! -f ${depmod_path} ]; then 152eda14cbcSMatt Macy depmod_path=/usr/sbin/depmod 153eda14cbcSMatt Macy fi 154eda14cbcSMatt Macy 155eda14cbcSMatt Macy # first part 156eda14cbcSMatt Macy cat <<EOF 157eda14cbcSMatt Macy%package -n kmod-${kmodname}-${kernel_uname_r} 158eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) for ${kernel_uname_r} 159eda14cbcSMatt MacyGroup: System Environment/Kernel 160eda14cbcSMatt MacyProvides: kernel-modules-for-kernel = ${kernel_uname_r} 161eda14cbcSMatt MacyProvides: kmod-${kmodname}-uname-r = ${kernel_uname_r} 162eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 163eda14cbcSMatt MacyRequires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version} 164eda14cbcSMatt Macy 165eda14cbcSMatt Macy%if 0%{?rhel} == 6 || 0%{?centos} == 6 166eda14cbcSMatt MacyRequires(post): module-init-tools 167eda14cbcSMatt MacyRequires(postun): module-init-tools 168eda14cbcSMatt Macy%else 169eda14cbcSMatt MacyRequires(post): kmod 170eda14cbcSMatt MacyRequires(postun): kmod 171eda14cbcSMatt Macy%endif 172eda14cbcSMatt MacyEOF 173eda14cbcSMatt Macy 174eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 175eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-${kernel_uname_r} = ${obsolete_version}" 176eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-${kernel_uname_r} < ${obsolete_version}" 177eda14cbcSMatt Macy fi 178eda14cbcSMatt Macy 179eda14cbcSMatt Macy # second part 180eda14cbcSMatt Macy if [[ ! "${customkernel}" ]]; then 181eda14cbcSMatt Macy cat <<EOF 182eda14cbcSMatt MacyRequires: kernel-uname-r = ${kernel_uname_r} 183eda14cbcSMatt MacyBuildRequires: kernel-devel-uname-r = ${kernel_uname_r} 184eda14cbcSMatt Macy%{?KmodsRequires:Requires: %{KmodsRequires}-uname-r = ${kernel_uname_r}} 185eda14cbcSMatt Macy%{?KmodsRequires:BuildRequires: %{KmodsRequires}-uname-r = ${kernel_uname_r}} 186eda14cbcSMatt Macy%post -n kmod-${kmodname}-${kernel_uname_r} 18704c4bd7fSMartin Matuskaif [[ -f "/boot/System.map-${kernel_uname_r}" ]]; then 188eda14cbcSMatt Macy ${prefix}${depmod_path} -aeF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} > /dev/null || : 18904c4bd7fSMartin Matuskaelif [[ -f "/lib/modules/${kernel_uname_r}/System.map" ]]; then 19004c4bd7fSMartin Matuska ${prefix}${depmod_path} -aeF /lib/modules/${kernel_uname_r}/System.map ${kernel_uname_r} > /dev/null || : 19104c4bd7fSMartin Matuskaelse 19204c4bd7fSMartin Matuska ${prefix}${depmod_path} -ae ${kernel_uname_r} &> /dev/null || : 19304c4bd7fSMartin Matuskafi 194eda14cbcSMatt Macy%postun -n kmod-${kmodname}-${kernel_uname_r} 19504c4bd7fSMartin Matuskaif [[ -f "/boot/System.map-${kernel_uname_r}" ]]; then 196eda14cbcSMatt Macy ${prefix}${depmod_path} -aF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} &> /dev/null || : 19704c4bd7fSMartin Matuskaelif [[ -f "/lib/modules/${kernel_uname_r}/System.map" ]]; then 19804c4bd7fSMartin Matuska ${prefix}${depmod_path} -aF /lib/modules/${kernel_uname_r}/System.map ${kernel_uname_r} &> /dev/null || : 19904c4bd7fSMartin Matuskaelse 20004c4bd7fSMartin Matuska ${prefix}${depmod_path} -a ${kernel_uname_r} &> /dev/null || : 20104c4bd7fSMartin Matuskafi 202eda14cbcSMatt Macy 203eda14cbcSMatt MacyEOF 204eda14cbcSMatt Macy else 205eda14cbcSMatt Macy cat <<EOF 206eda14cbcSMatt Macy%post -n kmod-${kmodname}-${kernel_uname_r} 207eda14cbcSMatt Macy[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && ${prefix}${depmod_path} -a > /dev/null || : 208eda14cbcSMatt Macy%postun -n kmod-${kmodname}-${kernel_uname_r} 209eda14cbcSMatt Macy[[ "\$(uname -r)" == "${kernel_uname_r}" ]] && ${prefix}${depmod_path} -a > /dev/null || : 210eda14cbcSMatt Macy 211eda14cbcSMatt MacyEOF 212eda14cbcSMatt Macy fi 213eda14cbcSMatt Macy 214eda14cbcSMatt Macy # third part 215eda14cbcSMatt Macy cat <<EOF 216eda14cbcSMatt Macy%description -n kmod-${kmodname}-${kernel_uname_r} 217eda14cbcSMatt MacyThis package provides the ${kmodname} kernel modules built for the Linux 218eda14cbcSMatt Macykernel ${kernel_uname_r} for the %{_target_cpu} family of processors. 219eda14cbcSMatt Macy%files -n kmod-${kmodname}-${kernel_uname_r} 220eda14cbcSMatt Macy%defattr(644,root,root,755) 221eda14cbcSMatt Macy%dir $prefix/lib/modules/${kernel_uname_r}/extra 222eda14cbcSMatt Macy${prefix}/lib/modules/${kernel_uname_r}/extra/${kmodname}/ 223eda14cbcSMatt Macy 224eda14cbcSMatt Macy 225eda14cbcSMatt MacyEOF 226eda14cbcSMatt Macy} 227eda14cbcSMatt Macy 228eda14cbcSMatt Macyprint_rpmtemplate_kmoddevelpkg () 229eda14cbcSMatt Macy{ 230eda14cbcSMatt Macy if [[ "${1}" == "--custom" ]]; then 231eda14cbcSMatt Macy shift 232eda14cbcSMatt Macy local customkernel=true 233eda14cbcSMatt Macy elif [[ "${1}" == "--redhat" ]]; then 234eda14cbcSMatt Macy shift 235eda14cbcSMatt Macy local redhatkernel=true 236eda14cbcSMatt Macy fi 237eda14cbcSMatt Macy 238eda14cbcSMatt Macy local kernel_uname_r=${1} 239eda14cbcSMatt Macy 240eda14cbcSMatt Macy cat <<EOF 241eda14cbcSMatt Macy%package -n kmod-${kmodname}-devel 242eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) devel common 243eda14cbcSMatt MacyGroup: System Environment/Kernel 244eda14cbcSMatt MacyProvides: ${kmodname}-devel-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 245eda14cbcSMatt MacyEOF 246eda14cbcSMatt Macy 247eda14cbcSMatt Macy if [[ ! ${customkernel} ]] && [[ ! ${redhatkernel} ]]; then 248eda14cbcSMatt Macy echo "Requires: kmod-${kmodname}-devel-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release}" 249eda14cbcSMatt Macy fi 250eda14cbcSMatt Macy 251eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 252eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-devel = ${obsolete_version}" 253eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-devel < ${obsolete_version}" 254eda14cbcSMatt Macy fi 255eda14cbcSMatt Macy 256eda14cbcSMatt Macy cat <<EOF 257eda14cbcSMatt Macy%description -n kmod-${kmodname}-devel 258eda14cbcSMatt MacyThis package provides the common header files to build kernel modules 259eda14cbcSMatt Macywhich depend on the ${kmodname} kernel module. It may optionally require 260eda14cbcSMatt Macythe ${kmodname}-devel-<kernel> objects for the newest kernel. 261eda14cbcSMatt Macy 262eda14cbcSMatt Macy%files -n kmod-${kmodname}-devel 263eda14cbcSMatt Macy%defattr(644,root,root,755) 264eda14cbcSMatt Macy%{_usrsrc}/${kmodname}-%{version} 265eda14cbcSMatt MacyEOF 266eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 267eda14cbcSMatt Macy echo "%{_usrsrc}/${obsolete_name}-%{version}" 268eda14cbcSMatt Macy fi 269eda14cbcSMatt Macy 270eda14cbcSMatt Macy for kernel in ${1}; do 271eda14cbcSMatt Macy local kernel_uname_r=${kernel} 272eda14cbcSMatt Macy echo "%exclude %{_usrsrc}/${kmodname}-%{version}/${kernel_uname_r}" 273eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 274eda14cbcSMatt Macy echo "%exclude %{_usrsrc}/${obsolete_name}-%{version}/${kernel_uname_r}" 275eda14cbcSMatt Macy fi 276eda14cbcSMatt Macy done 277eda14cbcSMatt Macy 278eda14cbcSMatt Macy echo 279eda14cbcSMatt Macy echo 280eda14cbcSMatt Macy} 281eda14cbcSMatt Macy 282eda14cbcSMatt Macyprint_rpmtemplate_per_kmoddevelpkg () 283eda14cbcSMatt Macy{ 284eda14cbcSMatt Macy if [[ "${1}" == "--custom" ]]; then 285eda14cbcSMatt Macy shift 286eda14cbcSMatt Macy local customkernel=true 287eda14cbcSMatt Macy elif [[ "${1}" == "--redhat" ]]; then 288eda14cbcSMatt Macy # this is needed for akmods 289eda14cbcSMatt Macy shift 290eda14cbcSMatt Macy local redhatkernel=true 291eda14cbcSMatt Macy fi 292eda14cbcSMatt Macy 293eda14cbcSMatt Macy local kernel_uname_r=${1} 294eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 295eda14cbcSMatt Macy 296eda14cbcSMatt Macy # first part 297eda14cbcSMatt Macy cat <<EOF 298eda14cbcSMatt Macy%package -n kmod-${kmodname}-devel-${kernel_uname_r} 299eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) devel for ${kernel_uname_r} 300eda14cbcSMatt MacyGroup: System Environment/Kernel 301eda14cbcSMatt MacyProvides: kernel-objects-for-kernel = ${kernel_uname_r} 302eda14cbcSMatt MacyProvides: ${kmodname}-devel-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 303eda14cbcSMatt MacyProvides: kmod-${kmodname}-devel-uname-r = ${kernel_uname_r} 304eda14cbcSMatt MacyEOF 305eda14cbcSMatt Macy 306eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 307eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-devel-${kernel_uname_r} = ${obsolete_version}" 308eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-devel-${kernel_uname_r} < ${obsolete_version}" 309eda14cbcSMatt Macy fi 310eda14cbcSMatt Macy 311eda14cbcSMatt Macy # second part 312eda14cbcSMatt Macy if [[ ! "${customkernel}" ]]; then 313eda14cbcSMatt Macy cat <<EOF 314eda14cbcSMatt MacyRequires: kernel-devel-uname-r = ${kernel_uname_r} 315eda14cbcSMatt MacyBuildRequires: kernel-devel-uname-r = ${kernel_uname_r} 316eda14cbcSMatt Macy%{?KmodsDevelRequires:Requires: %{KmodsDevelRequires}-uname-r = ${kernel_uname_r}} 317eda14cbcSMatt Macy%{?KmodsDevelRequires:BuildRequires: %{KmodsDevelRequires}-uname-r = ${kernel_uname_r}} 318eda14cbcSMatt MacyEOF 319eda14cbcSMatt Macy fi 320eda14cbcSMatt Macy 321eda14cbcSMatt Macy # third part 322eda14cbcSMatt Macy cat <<EOF 323eda14cbcSMatt Macy%description -n kmod-${kmodname}-devel-${kernel_uname_r} 324eda14cbcSMatt MacyThis package provides objects and symbols required to build kernel modules 325eda14cbcSMatt Macywhich depend on the ${kmodname} kernel modules built for the Linux 326eda14cbcSMatt Macykernel ${kernel_uname_r} for the %{_target_cpu} family of processors. 327eda14cbcSMatt Macy%files -n kmod-${kmodname}-devel-${kernel_uname_r} 328eda14cbcSMatt Macy%defattr(644,root,root,755) 329eda14cbcSMatt Macy%{_usrsrc}/${kmodname}-%{version}/${kernel_uname_r} 330eda14cbcSMatt MacyEOF 331eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 332eda14cbcSMatt Macy echo "%{_usrsrc}/${obsolete_name}-%{version}/${kernel_uname_r}" 333eda14cbcSMatt Macy fi 334eda14cbcSMatt Macy} 335eda14cbcSMatt Macy 336eda14cbcSMatt Macyprint_rpmtemplate_kmodmetapkg () 337eda14cbcSMatt Macy{ 338eda14cbcSMatt Macy local kernel_uname_r=${1} 339eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 340eda14cbcSMatt Macy 341eda14cbcSMatt Macy cat <<EOF 342eda14cbcSMatt Macy%package -n kmod-${kmodname}${kernel_variant} 343eda14cbcSMatt MacySummary: Metapackage which tracks in ${kmodname} kernel module for newest kernel${kernel_variant} 344eda14cbcSMatt MacyGroup: System Environment/Kernel 345eda14cbcSMatt Macy 346eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 347eda14cbcSMatt MacyRequires: kmod-${kmodname}-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release} 348eda14cbcSMatt Macy%{?KmodsMetaRequires:Requires: %{?KmodsMetaRequires}} 349eda14cbcSMatt MacyEOF 350eda14cbcSMatt Macy 351eda14cbcSMatt Macy if [[ ${obsolete_name} ]]; then 352eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}${kernel_variant} = ${obsolete_version}" 353eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}${kernel_variant} < ${obsolete_version}" 354eda14cbcSMatt Macy fi 355eda14cbcSMatt Macy 356eda14cbcSMatt Macy cat <<EOF 357eda14cbcSMatt Macy 358eda14cbcSMatt Macy%description -n kmod-${kmodname}${kernel_variant} 359eda14cbcSMatt MacyThis is a meta-package without payload which sole purpose is to require the 360eda14cbcSMatt Macy${kmodname} kernel module(s) for the newest kernel${kernel_variant}. 361eda14cbcSMatt Macyto make sure you get it together with a new kernel. 362eda14cbcSMatt Macy 363eda14cbcSMatt Macy%files -n kmod-${kmodname}${kernel_variant} 364eda14cbcSMatt Macy%defattr(644,root,root,755) 365eda14cbcSMatt Macy 366eda14cbcSMatt Macy 367eda14cbcSMatt MacyEOF 368eda14cbcSMatt Macy} 369eda14cbcSMatt Macy 370eda14cbcSMatt Macyprint_customrpmtemplate () 371eda14cbcSMatt Macy{ 372eda14cbcSMatt Macy for kernel in ${1} 373eda14cbcSMatt Macy do 374eda14cbcSMatt Macy if [[ -e "${buildroot}/usr/src/kernels/${kernel}" ]] ; then 375eda14cbcSMatt Macy # this looks like a Fedora/RH kernel -- print a normal template (which includes the proper BR) and be happy :) 376eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel}___${buildroot}%{_usrsrc}/kernels/${kernel} " 377eda14cbcSMatt Macy 378eda14cbcSMatt Macy # parse kernel versions string and print template 379eda14cbcSMatt Macy local kernel_verrelarch=${kernel%%${kernels_known_variants}} 380eda14cbcSMatt Macy print_rpmtemplate_per_kmodpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 381eda14cbcSMatt Macy 382eda14cbcSMatt Macy # create development package 383eda14cbcSMatt Macy if [[ "${devel}" ]]; then 384eda14cbcSMatt Macy # create devel package including common headers 385eda14cbcSMatt Macy print_rpmtemplate_kmoddevelpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 386eda14cbcSMatt Macy 387eda14cbcSMatt Macy # create devel package 388eda14cbcSMatt Macy print_rpmtemplate_per_kmoddevelpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 389eda14cbcSMatt Macy fi 390eda14cbcSMatt Macy elif [[ -e ${prefix}/lib/modules/"${kernel}"/build/Makefile ]] ; then 391eda14cbcSMatt Macy # likely a user-build-kernel with available buildfiles 392eda14cbcSMatt Macy # fixme: we should check if uname from Makefile is the same as ${kernel} 393eda14cbcSMatt Macy 394eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel}___${prefix}/lib/modules/${kernel}/build/ " 395eda14cbcSMatt Macy print_rpmtemplate_per_kmodpkg --custom "${kernel}" 396eda14cbcSMatt Macy 397eda14cbcSMatt Macy # create development package 398eda14cbcSMatt Macy if [[ "${devel}" ]]; then 399eda14cbcSMatt Macy # create devel package including common headers 400eda14cbcSMatt Macy print_rpmtemplate_kmoddevelpkg --custom "${kernel}" 401eda14cbcSMatt Macy 402eda14cbcSMatt Macy # create devel package 403eda14cbcSMatt Macy print_rpmtemplate_per_kmoddevelpkg --custom "${kernel}" 404eda14cbcSMatt Macy fi 405eda14cbcSMatt Macy else 406eda14cbcSMatt Macy error_out 2 "Don't know how to handle ${kernel} -- ${prefix}/lib/modules/${kernel}/build/Makefile not found" 407eda14cbcSMatt Macy fi 408eda14cbcSMatt Macy done 409eda14cbcSMatt Macy 410eda14cbcSMatt Macy # well, it's no header anymore, but who cares ;-) 411eda14cbcSMatt Macy print_rpmtemplate_header 412eda14cbcSMatt Macy} 413eda14cbcSMatt Macy 414eda14cbcSMatt Macy 415eda14cbcSMatt Macyprint_rpmtemplate () 416eda14cbcSMatt Macy{ 417eda14cbcSMatt Macy # create kernel_versions var 418eda14cbcSMatt Macy for kernel_version in ${kernel_versions_to_build_for} 419eda14cbcSMatt Macy do 420eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel_version}___%{_usrsrc}/kernels/${kernel_version} " 421eda14cbcSMatt Macy done 422eda14cbcSMatt Macy 423eda14cbcSMatt Macy # and print it and some other required stuff as macro 424eda14cbcSMatt Macy print_rpmtemplate_header 425eda14cbcSMatt Macy 426eda14cbcSMatt Macy # now print the packages 427eda14cbcSMatt Macy for kernel in ${kernel_versions_to_build_for} ; do 428eda14cbcSMatt Macy 429eda14cbcSMatt Macy local kernel_verrelarch=${kernel%%${kernels_known_variants}} 430eda14cbcSMatt Macy 431eda14cbcSMatt Macy # create metapackage 432eda14cbcSMatt Macy print_rpmtemplate_kmodmetapkg ${kernel} ${kernel##${kernel_verrelarch}} 433eda14cbcSMatt Macy 434eda14cbcSMatt Macy # create package 435eda14cbcSMatt Macy print_rpmtemplate_per_kmodpkg ${kernel} ${kernel##${kernel_verrelarch}} 436eda14cbcSMatt Macy 437eda14cbcSMatt Macy if [[ "${devel}" ]]; then 438eda14cbcSMatt Macy # create devel package including common headers 439eda14cbcSMatt Macy print_rpmtemplate_kmoddevelpkg ${kernel} ${kernel##${kernel_verrelarch}} 440eda14cbcSMatt Macy 441eda14cbcSMatt Macy # create devel package 442eda14cbcSMatt Macy print_rpmtemplate_per_kmoddevelpkg ${kernel} ${kernel##${kernel_verrelarch}} 443eda14cbcSMatt Macy fi 444eda14cbcSMatt Macy done 445eda14cbcSMatt Macy} 446eda14cbcSMatt Macy 447eda14cbcSMatt Macymyprog_help () 448eda14cbcSMatt Macy{ 449*408fc218SMartin Matuska echo "Usage: ${0##*/} [OPTIONS]" 450eda14cbcSMatt Macy echo $'\n'"Creates a template to be used during kmod building" 451eda14cbcSMatt Macy echo $'\n'"Available options:" 452eda14cbcSMatt Macy echo " --filterfile <file> -- filter the results with grep --file <file>" 453eda14cbcSMatt Macy echo " --for-kernels <list> -- created templates only for these kernels" 454eda14cbcSMatt Macy echo " --kmodname <file> -- name of the kmod (required)" 455eda14cbcSMatt Macy echo " --devel -- make kmod-devel package" 456eda14cbcSMatt Macy echo " --noakmod -- no akmod package" 457eda14cbcSMatt Macy echo " --repo <name> -- use buildsys-build-<name>-kerneldevpkgs" 458eda14cbcSMatt Macy echo " --target <arch> -- target-arch (required)" 459eda14cbcSMatt Macy echo " --buildroot <dir> -- Build root (place to look for build files)" 460eda14cbcSMatt Macy} 461eda14cbcSMatt Macy 462eda14cbcSMatt Macywhile [ "${1}" ] ; do 463eda14cbcSMatt Macy case "${1}" in 464eda14cbcSMatt Macy --filterfile) 465eda14cbcSMatt Macy shift 466eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 467eda14cbcSMatt Macy error_out 2 "Please provide path to a filter-file together with --filterfile" >&2 468eda14cbcSMatt Macy elif [[ ! -e "${1}" ]]; then 469eda14cbcSMatt Macy error_out 2 "Filterfile ${1} not found" >&2 470eda14cbcSMatt Macy fi 471eda14cbcSMatt Macy filterfile="${1}" 472eda14cbcSMatt Macy shift 473eda14cbcSMatt Macy ;; 474eda14cbcSMatt Macy --kmodname) 475eda14cbcSMatt Macy shift 476eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 477eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod together with --kmodname" >&2 478eda14cbcSMatt Macy fi 479eda14cbcSMatt Macy # strip pending -kmod 480eda14cbcSMatt Macy kmodname="${1%%-kmod}" 481eda14cbcSMatt Macy shift 482eda14cbcSMatt Macy ;; 483eda14cbcSMatt Macy --devel) 484eda14cbcSMatt Macy shift 485eda14cbcSMatt Macy devel="true" 486eda14cbcSMatt Macy ;; 487eda14cbcSMatt Macy --prefix) 488eda14cbcSMatt Macy shift 489eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 490eda14cbcSMatt Macy error_out 2 "Please provide a prefix with --prefix" >&2 491eda14cbcSMatt Macy fi 492eda14cbcSMatt Macy prefix="${1}" 493eda14cbcSMatt Macy shift 494eda14cbcSMatt Macy ;; 495eda14cbcSMatt Macy --repo) 496eda14cbcSMatt Macy shift 497eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 498eda14cbcSMatt Macy error_out 2 "Please provide the name of the repo together with --repo" >&2 499eda14cbcSMatt Macy fi 500eda14cbcSMatt Macy repo=${1} 501eda14cbcSMatt Macy shift 502eda14cbcSMatt Macy ;; 503eda14cbcSMatt Macy --for-kernels) 504eda14cbcSMatt Macy shift 505eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 506eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod together with --kmodname" >&2 507eda14cbcSMatt Macy fi 508eda14cbcSMatt Macy for_kernels="${1}" 509eda14cbcSMatt Macy shift 510eda14cbcSMatt Macy ;; 511eda14cbcSMatt Macy --noakmod) 512eda14cbcSMatt Macy shift 513eda14cbcSMatt Macy noakmod="true" 514eda14cbcSMatt Macy ;; 515eda14cbcSMatt Macy --obsolete-name) 516eda14cbcSMatt Macy shift 517eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 518eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod to obsolete together with --obsolete-name" >&2 519eda14cbcSMatt Macy fi 520eda14cbcSMatt Macy obsolete_name="${1}" 521eda14cbcSMatt Macy shift 522eda14cbcSMatt Macy ;; 523eda14cbcSMatt Macy --obsolete-version) 524eda14cbcSMatt Macy shift 525eda14cbcSMatt Macy if [[ ! "${1}" ]] ; then 526eda14cbcSMatt Macy error_out 2 "Please provide the version of the kmod to obsolete together with --obsolete-version" >&2 527eda14cbcSMatt Macy fi 528eda14cbcSMatt Macy obsolete_version="${1}" 529eda14cbcSMatt Macy shift 530eda14cbcSMatt Macy ;; 531eda14cbcSMatt Macy --target) 532eda14cbcSMatt Macy shift 533eda14cbcSMatt Macy target="${1}" 534eda14cbcSMatt Macy shift 535eda14cbcSMatt Macy ;; 536eda14cbcSMatt Macy --akmod) 537eda14cbcSMatt Macy shift 538eda14cbcSMatt Macy build_kernels="akmod" 539eda14cbcSMatt Macy ;; 540eda14cbcSMatt Macy --newest) 541eda14cbcSMatt Macy shift 542eda14cbcSMatt Macy build_kernels="newest" 543eda14cbcSMatt Macy ;; 544eda14cbcSMatt Macy --current) 545eda14cbcSMatt Macy shift 546eda14cbcSMatt Macy build_kernels="current" 547eda14cbcSMatt Macy ;; 548eda14cbcSMatt Macy --buildroot) 549eda14cbcSMatt Macy shift 550eda14cbcSMatt Macy buildroot="${1}" 551eda14cbcSMatt Macy shift 552eda14cbcSMatt Macy ;; 553eda14cbcSMatt Macy --help) 554eda14cbcSMatt Macy myprog_help 555eda14cbcSMatt Macy exit 0 556eda14cbcSMatt Macy ;; 557eda14cbcSMatt Macy --version) 558eda14cbcSMatt Macy echo "${myprog} ${myver}" 559eda14cbcSMatt Macy exit 0 560eda14cbcSMatt Macy ;; 561eda14cbcSMatt Macy *) 562eda14cbcSMatt Macy echo "Error: Unknown option '${1}'." >&2 563eda14cbcSMatt Macy usage >&2 564eda14cbcSMatt Macy exit 2 565eda14cbcSMatt Macy ;; 566eda14cbcSMatt Macy esac 567eda14cbcSMatt Macydone 568eda14cbcSMatt Macy 569eda14cbcSMatt Macyif [[ -e ./kmodtool-kernel-variants ]]; then 570eda14cbcSMatt Macy kernels_known_variants="$(cat ./kmodtool-kernel-variants)" 571eda14cbcSMatt Macyelif [[ -e /usr/share/kmodtool/kernel-variants ]] ; then 572eda14cbcSMatt Macy kernels_known_variants="$(cat /usr/share/kmodtool/kernel-variants)" 573eda14cbcSMatt Macyelse 574eda14cbcSMatt Macy kernels_known_variants="@(smp?(-debug)|PAE?(-debug)|debug|kdump|xen|kirkwood|highbank|imx|omap|tegra)" 575eda14cbcSMatt Macyfi 576eda14cbcSMatt Macy 577eda14cbcSMatt Macy# general sanity checks 578eda14cbcSMatt Macyif [[ ! "${target}" ]]; then 579eda14cbcSMatt Macy error_out 2 "please pass target arch with --target" 580eda14cbcSMatt Macyelif [[ ! "${kmodname}" ]]; then 581eda14cbcSMatt Macy error_out 2 "please pass kmodname with --kmodname" 582eda14cbcSMatt Macyelif [[ ! "${kernels_known_variants}" ]] ; then 583eda14cbcSMatt Macy error_out 2 "could not determine known variants" 584b0c251b0SMartin Matuskaelif { [[ "${obsolete_name}" ]] && [[ ! "${obsolete_version}" ]]; } || { [[ ! "${obsolete_name}" ]] && [[ "${obsolete_version}" ]]; } ; then 585eda14cbcSMatt Macy error_out 2 "you need to provide both --obsolete-name and --obsolete-version" 586eda14cbcSMatt Macyfi 587eda14cbcSMatt Macy 588eda14cbcSMatt Macy# go 589eda14cbcSMatt Macyif [[ "${for_kernels}" ]]; then 590eda14cbcSMatt Macy # this is easy: 591eda14cbcSMatt Macy print_customrpmtemplate "${for_kernels}" 592eda14cbcSMatt Macyelif [[ "${build_kernels}" == "akmod" ]]; then 593eda14cbcSMatt Macy # do only a akmod package 594eda14cbcSMatt Macy print_akmodtemplate 595eda14cbcSMatt Macy print_akmodmeta 596eda14cbcSMatt Macyelse 597eda14cbcSMatt Macy # seems we are on out own to decide for which kernels to build 598eda14cbcSMatt Macy 599eda14cbcSMatt Macy # we need more sanity checks in this case 600eda14cbcSMatt Macy if [[ ! "${repo}" ]]; then 601eda14cbcSMatt Macy error_out 2 "please provide repo name with --repo" 602b0c251b0SMartin Matuska elif ! command -v "buildsys-build-${repo}-kerneldevpkgs" &> /dev/null ; then 603eda14cbcSMatt Macy error_out 2 "buildsys-build-${repo}-kerneldevpkgs not found" 604eda14cbcSMatt Macy fi 605eda14cbcSMatt Macy 606eda14cbcSMatt Macy # call buildsys-build-${repo}-kerneldevpkgs to get the list of kernels 607eda14cbcSMatt Macy cmdoptions="--target ${target}" 608eda14cbcSMatt Macy 609eda14cbcSMatt Macy # filterfile to filter list of kernels? 610eda14cbcSMatt Macy if [[ "${filterfile}" ]] ; then 611eda14cbcSMatt Macy cmdoptions="${cmdoptions} --filterfile ${filterfile}" 612eda14cbcSMatt Macy fi 613eda14cbcSMatt Macy 614eda14cbcSMatt Macy kernel_versions_to_build_for="$(buildsys-build-${repo}-kerneldevpkgs --${build_kernels} ${cmdoptions})" 615eda14cbcSMatt Macy returncode=$? 616b0c251b0SMartin Matuska if (( returncode != 0 )); then 617eda14cbcSMatt Macy error_out 2 "buildsys-build-${repo}-kerneldevpkgs failed: $(buildsys-build-${repo}-kerneldevpkgs --${build_kernels} ${cmdoptions})" 618eda14cbcSMatt Macy fi 619eda14cbcSMatt Macy 620eda14cbcSMatt Macy if [[ "${build_kernels}" == "current" ]] && [[ ! "${noakmod}" ]]; then 621eda14cbcSMatt Macy print_akmodtemplate 622eda14cbcSMatt Macy fi 623eda14cbcSMatt Macy 624eda14cbcSMatt Macy print_rpmtemplate 625eda14cbcSMatt Macyfi 626