]> Git Repo - linux.git/blob - scripts/package/builddeb
Linux 6.14-rc3
[linux.git] / scripts / package / builddeb
1 #!/bin/sh
2 #
3 # builddeb 1.3
4 # Copyright 2003 Wichert Akkerman <[email protected]>
5 #
6 # Simple script to generate a deb package for a Linux kernel. All the
7 # complexity of what to do with a kernel after it is installed or removed
8 # is left to other scripts and packages. Scripts can be placed into the
9 # preinst, postinst, prerm and postrm directories in /etc/kernel or
10 # /usr/share/kernel. A different list of search directories can be given
11 # via KDEB_HOOKDIR. Scripts in directories earlier in the list will
12 # override scripts of the same name in later directories.  The script will
13 # be called on package installation and removal.
14
15 set -eu
16
17 is_enabled() {
18         grep -q "^$1=y" include/config/auto.conf
19 }
20
21 if_enabled_echo() {
22         if is_enabled "$1"; then
23                 echo -n "$2"
24         elif [ $# -ge 3 ]; then
25                 echo -n "$3"
26         fi
27 }
28
29 install_linux_image () {
30         pname=$1
31         pdir=debian/$1
32
33         # Only some architectures with OF support have this target
34         if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
35                 ${MAKE} -f ${srctree}/Makefile INSTALL_DTBS_PATH="${pdir}/usr/lib/linux-image-${KERNELRELEASE}" dtbs_install
36         fi
37
38         ${MAKE} -f ${srctree}/Makefile INSTALL_MOD_PATH="${pdir}" INSTALL_MOD_STRIP=1 modules_install
39         rm -f "${pdir}/lib/modules/${KERNELRELEASE}/build"
40
41         # Install the kernel
42         if [ "${ARCH}" = um ] ; then
43                 mkdir -p "${pdir}/usr/lib/uml/modules"
44                 mv "${pdir}/lib/modules/${KERNELRELEASE}" "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}"
45                 mkdir -p "${pdir}/usr/bin" "${pdir}/usr/share/doc/${pname}"
46                 cp System.map "${pdir}/usr/lib/uml/modules/${KERNELRELEASE}/System.map"
47                 cp ${KCONFIG_CONFIG} "${pdir}/usr/share/doc/${pname}/config"
48                 gzip "${pdir}/usr/share/doc/${pname}/config"
49         else
50                 mkdir -p "${pdir}/boot"
51                 cp System.map "${pdir}/boot/System.map-${KERNELRELEASE}"
52                 cp ${KCONFIG_CONFIG} "${pdir}/boot/config-${KERNELRELEASE}"
53         fi
54
55         # Not all arches have the same installed path in debian
56         # XXX: have each arch Makefile export a variable of the canonical image install
57         # path instead
58         case "${SRCARCH}" in
59         um)
60                 installed_image_path="usr/bin/linux-${KERNELRELEASE}";;
61         parisc|mips|powerpc)
62                 installed_image_path="boot/vmlinux-${KERNELRELEASE}";;
63         *)
64                 installed_image_path="boot/vmlinuz-${KERNELRELEASE}";;
65         esac
66         cp "$(${MAKE} -s -f ${srctree}/Makefile image_name)" "${pdir}/${installed_image_path}"
67
68         if [ "${ARCH}" != um ]; then
69                 install_maint_scripts "${pdir}"
70         fi
71 }
72
73 install_maint_scripts () {
74         # Install the maintainer scripts
75         # Note: hook scripts under /etc/kernel are also executed by official Debian
76         # kernel packages, as well as kernel packages built using make-kpkg.
77         # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
78         # so do we; recent versions of dracut and initramfs-tools will obey this.
79         debhookdir=${KDEB_HOOKDIR:-/etc/kernel /usr/share/kernel}
80         for script in postinst postrm preinst prerm; do
81                 mkdir -p "${pdir}/DEBIAN"
82                 cat <<-EOF > "${pdir}/DEBIAN/${script}"
83                 #!/bin/sh
84
85                 set -e
86
87                 # Pass maintainer script parameters to hook scripts
88                 export DEB_MAINT_PARAMS="\$*"
89
90                 # Tell initramfs builder whether it's wanted
91                 export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
92
93                 # run-parts will error out if one of its directory arguments does not
94                 # exist, so filter the list of hook directories accordingly.
95                 hookdirs=
96                 for dir in ${debhookdir}; do
97                         test -d "\$dir/${script}.d" || continue
98                         hookdirs="\$hookdirs \$dir/${script}.d"
99                 done
100                 hookdirs="\${hookdirs# }"
101                 test -n "\$hookdirs" && run-parts --arg="${KERNELRELEASE}" --arg="/${installed_image_path}" \$hookdirs
102                 exit 0
103                 EOF
104                 chmod 755 "${pdir}/DEBIAN/${script}"
105         done
106 }
107
108 install_linux_image_dbg () {
109         pdir=debian/$1
110
111         # Parse modules.order directly because 'make modules_install' may sign,
112         # compress modules, and then run unneeded depmod.
113         if is_enabled CONFIG_MODULES; then
114                 while read -r mod; do
115                         mod="${mod%.o}.ko"
116                         dbg="${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/kernel/${mod}"
117                         buildid=$("${READELF}" -n "${mod}" | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p')
118                         link="${pdir}/usr/lib/debug/.build-id/${buildid}.debug"
119
120                         mkdir -p "${dbg%/*}" "${link%/*}"
121                         "${OBJCOPY}" --only-keep-debug "${mod}" "${dbg}"
122                         ln -sf --relative "${dbg}" "${link}"
123                 done < modules.order
124         fi
125
126         # Build debug package
127         # Different tools want the image in different locations
128         # perf
129         mkdir -p ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
130         cp vmlinux ${pdir}/usr/lib/debug/lib/modules/${KERNELRELEASE}/
131         # systemtap
132         mkdir -p ${pdir}/usr/lib/debug/boot/
133         ln -s ../lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/boot/vmlinux-${KERNELRELEASE}
134         # kdump-tools
135         ln -s lib/modules/${KERNELRELEASE}/vmlinux ${pdir}/usr/lib/debug/vmlinux-${KERNELRELEASE}
136 }
137
138 install_kernel_headers () {
139         pdir=debian/$1
140         version=${1#linux-headers-}
141
142         CC="${DEB_HOST_GNU_TYPE}-gcc" "${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}"
143
144         mkdir -p $pdir/lib/modules/$version/
145         ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
146 }
147
148 install_libc_headers () {
149         pdir=debian/$1
150
151         $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
152
153         # move asm headers to /usr/include/<libc-machine>/asm to match the structure
154         # used by Debian-based distros (to support multi-arch)
155         mkdir "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
156         mv "$pdir/usr/include/asm" "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
157 }
158
159 package=$1
160
161 case "${package}" in
162 *-dbg)
163         install_linux_image_dbg "${package}";;
164 linux-image-*|user-mode-linux-*)
165         install_linux_image "${package}";;
166 linux-libc-dev)
167         install_libc_headers "${package}";;
168 linux-headers-*)
169         install_kernel_headers "${package}";;
170 esac
This page took 0.044517 seconds and 4 git commands to generate.