1#!/bin/sh 2# 3# Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 4# 5# Simple script to generate a debian/ directory for a Linux kernel. 6 7set -e 8 9is_enabled() { 10 grep -q "^$1=y" include/config/auto.conf 11} 12 13if_enabled_echo() { 14 if is_enabled "$1"; then 15 echo -n "$2" 16 elif [ $# -ge 3 ]; then 17 echo -n "$3" 18 fi 19} 20 21set_debarch() { 22 if [ -n "$KBUILD_DEBARCH" ] ; then 23 debarch="$KBUILD_DEBARCH" 24 return 25 fi 26 27 # Attempt to find the correct Debian architecture 28 case "$UTS_MACHINE" in 29 i386|ia64|alpha|m68k|riscv*) 30 debarch="$UTS_MACHINE" ;; 31 x86_64) 32 debarch=amd64 ;; 33 sparc*) 34 debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;; 35 s390*) 36 debarch=s390x ;; 37 ppc*) 38 if is_enabled CONFIG_64BIT; then 39 debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el) 40 else 41 debarch=powerpc$(if_enabled_echo CONFIG_SPE spe) 42 fi 43 ;; 44 parisc*) 45 debarch=hppa ;; 46 mips*) 47 if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then 48 debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el 49 elif is_enabled CONFIG_CPU_MIPSR6; then 50 debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6 51 else 52 debarch=mips 53 fi 54 ;; 55 aarch64|arm64) 56 debarch=arm64 ;; 57 arm*) 58 if is_enabled CONFIG_AEABI; then 59 debarch=arm$(if_enabled_echo CONFIG_VFP hf el) 60 else 61 debarch=arm 62 fi 63 ;; 64 openrisc) 65 debarch=or1k ;; 66 sh) 67 if is_enabled CONFIG_CPU_SH3; then 68 debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) 69 elif is_enabled CONFIG_CPU_SH4; then 70 debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb) 71 fi 72 ;; 73 esac 74 if [ -z "$debarch" ]; then 75 debarch=$(dpkg-architecture -qDEB_HOST_ARCH) 76 echo "" >&2 77 echo "** ** ** WARNING ** ** **" >&2 78 echo "" >&2 79 echo "Your architecture doesn't have its equivalent" >&2 80 echo "Debian userspace architecture defined!" >&2 81 echo "Falling back to the current host architecture ($debarch)." >&2 82 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 83 echo "" >&2 84 fi 85} 86 87rm -rf debian 88 89# Some variables and settings used throughout the script 90version=$KERNELRELEASE 91if [ -n "$KDEB_PKGVERSION" ]; then 92 packageversion=$KDEB_PKGVERSION 93 revision=${packageversion##*-} 94else 95 revision=$($srctree/init/build-version) 96 packageversion=$version-$revision 97fi 98sourcename=$KDEB_SOURCENAME 99 100if [ "$ARCH" = "um" ] ; then 101 packagename=user-mode-linux 102else 103 packagename=linux-image 104fi 105 106debarch= 107set_debarch 108 109email=${DEBEMAIL-$EMAIL} 110 111# use email string directly if it contains <email> 112if echo $email | grep -q '<.*>'; then 113 maintainer=$email 114else 115 # or construct the maintainer string 116 user=${KBUILD_BUILD_USER-$(id -nu)} 117 name=${DEBFULLNAME-$user} 118 if [ -z "$email" ]; then 119 buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)} 120 email="$user@$buildhost" 121 fi 122 maintainer="$name <$email>" 123fi 124 125# Try to determine distribution 126if [ -n "$KDEB_CHANGELOG_DIST" ]; then 127 distribution=$KDEB_CHANGELOG_DIST 128# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog 129elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then 130 : # nothing to do in this case 131else 132 distribution="unstable" 133 echo >&2 "Using default distribution of 'unstable' in the changelog" 134 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" 135fi 136 137mkdir -p debian/source/ 138echo "1.0" > debian/source/format 139 140# Ugly: ignore anything except .config or debian/ 141cat<<'EOF' > debian/source/local-options 142diff-ignore 143 144extend-diff-ignore = ^[^.d] 145 146extend-diff-ignore = ^\.[^c] 147extend-diff-ignore = ^\.c($|[^o]) 148extend-diff-ignore = ^\.co($|[^n]) 149extend-diff-ignore = ^\.con($|[^f]) 150extend-diff-ignore = ^\.conf($|[^i]) 151extend-diff-ignore = ^\.confi($|[^g]) 152extend-diff-ignore = ^\.config. 153 154extend-diff-ignore = ^d($|[^e]) 155extend-diff-ignore = ^de($|[^b]) 156extend-diff-ignore = ^deb($|[^i]) 157extend-diff-ignore = ^debi($|[^a]) 158extend-diff-ignore = ^debia($|[^n]) 159extend-diff-ignore = ^debian[^/] 160EOF 161 162echo $debarch > debian/arch 163extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)" 164extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)" 165 166# Generate a simple changelog template 167cat <<EOF > debian/changelog 168$sourcename ($packageversion) $distribution; urgency=low 169 170 * Custom built Linux kernel. 171 172 -- $maintainer $(date -R) 173EOF 174 175# Generate copyright file 176cat <<EOF > debian/copyright 177This is a packacked upstream version of the Linux kernel. 178 179The sources may be found at most Linux archive sites, including: 180https://www.kernel.org/pub/linux/kernel 181 182Copyright: 1991 - 2018 Linus Torvalds and others. 183 184The git repository for mainline kernel development is at: 185git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 186 187 This program is free software; you can redistribute it and/or modify 188 it under the terms of the GNU General Public License as published by 189 the Free Software Foundation; version 2 dated June, 1991. 190 191On Debian GNU/Linux systems, the complete text of the GNU General Public 192License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 193EOF 194 195# Generate a control file 196cat <<EOF > debian/control 197Source: $sourcename 198Section: kernel 199Priority: optional 200Maintainer: $maintainer 201Rules-Requires-Root: no 202Build-Depends: bc, rsync, kmod, cpio, bison, flex $extra_build_depends 203Homepage: https://www.kernel.org/ 204 205Package: $packagename-$version 206Architecture: $debarch 207Description: Linux kernel, version $version 208 This package contains the Linux kernel, modules and corresponding other 209 files, version: $version. 210 211Package: linux-libc-dev 212Section: devel 213Provides: linux-kernel-headers 214Architecture: $debarch 215Description: Linux support headers for userspace development 216 This package provides userspaces headers from the Linux kernel. These headers 217 are used by the installed headers for GNU glibc and other system libraries. 218Multi-Arch: same 219EOF 220 221if is_enabled CONFIG_MODULES; then 222cat <<EOF >> debian/control 223 224Package: linux-headers-$version 225Architecture: $debarch 226Description: Linux kernel headers for $version on $debarch 227 This package provides kernel header files for $version on $debarch 228 . 229 This is useful for people who need to build external modules 230EOF 231fi 232 233if is_enabled CONFIG_DEBUG_INFO; then 234cat <<EOF >> debian/control 235 236Package: linux-image-$version-dbg 237Section: debug 238Architecture: $debarch 239Description: Linux kernel debugging symbols for $version 240 This package will come in handy if you need to debug the kernel. It provides 241 all the necessary debug symbols for the kernel and its modules. 242EOF 243fi 244 245cat <<EOF > debian/rules 246#!$(command -v $MAKE) -f 247 248srctree ?= . 249 250build-indep: 251build-arch: 252 \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ 253 KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile 254 255build: build-arch 256 257binary-indep: 258binary-arch: build-arch 259 \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ 260 KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg 261 262clean: 263 rm -rf debian/files debian/linux-* 264 \$(MAKE) clean 265 266binary: binary-arch 267EOF 268chmod +x debian/rules 269 270exit 0 271