@@ -41,7 +41,7 @@ SCRIPTDIR="$(readlink -f "$(dirname "$(type -p "$0")")")"
4141ARCH=" $( uname -m) "
4242CPUS=" $( getconf _NPROCESSORS_ONLN) "
4343CACHEDIR=" ${CACHEDIR:- $HOME / .kpatch} "
44- SRCDIR =" $CACHEDIR /src"
44+ KERNEL_SRCDIR =" $CACHEDIR /src"
4545RPMTOPDIR=" $CACHEDIR /buildroot"
4646VERSIONFILE=" $CACHEDIR /version"
4747TEMPDIR=" $CACHEDIR /tmp"
@@ -138,27 +138,27 @@ remove_patches() {
138138 for (( ; APPLIED_PATCHES> 0 ; APPLIED_PATCHES-- )) ; do
139139 idx=$(( APPLIED_PATCHES - 1 ))
140140 patch=" ${PATCH_LIST[$idx]} "
141- patch -p1 -R -d " $SRCDIR " < " $patch " & > /dev/null
141+ patch -p1 -R -d " $BUILDDIR " < " $patch " & > /dev/null
142142 done
143143
144- # If $SRCDIR was a git repo, make sure git actually sees that
144+ # If $BUILDDIR was a git repo, make sure git actually sees that
145145 # we've reverted our patch(es).
146- [[ -d " $SRCDIR /.git" ]] && (cd " $SRCDIR " && git update-index -q --refresh)
146+ [[ -d " $BUILDDIR /.git" ]] && (cd " $BUILDDIR " && git update-index -q --refresh)
147147}
148148
149149cleanup () {
150- rm -f " $SRCDIR /.scmversion"
150+ rm -f " $BUILDDIR /.scmversion"
151151
152152 remove_patches
153153
154154 # restore original vmlinux if it was overwritten by sourcedir build
155- [[ -e " $TEMPDIR /vmlinux" ]] && mv -f " $TEMPDIR /vmlinux" " $SRCDIR /"
155+ [[ -e " $TEMPDIR /vmlinux" ]] && mv -f " $TEMPDIR /vmlinux" " $KERNEL_SRCDIR /"
156156
157157 # restore original link-vmlinux.sh if we updated it for the build
158- [[ -e " $TEMPDIR /link-vmlinux.sh" ]] && mv -f " $TEMPDIR /link-vmlinux.sh" " $SRCDIR /scripts"
158+ [[ -e " $TEMPDIR /link-vmlinux.sh" ]] && mv -f " $TEMPDIR /link-vmlinux.sh" " $KERNEL_SRCDIR /scripts"
159159
160160 # restore original Makefile.modfinal if we updated it for the build
161- [[ -e " $TEMPDIR /Makefile.modfinal" ]] && mv -f " $TEMPDIR /Makefile.modfinal" " $SRCDIR /scripts"
161+ [[ -e " $TEMPDIR /Makefile.modfinal" ]] && mv -f " $TEMPDIR /Makefile.modfinal" " $KERNEL_SRCDIR /scripts"
162162
163163 [[ " $DEBUG " -eq 0 ]] && rm -rf " $TEMPDIR "
164164 rm -rf " $RPMTOPDIR "
@@ -538,15 +538,16 @@ usage() {
538538 echo " -d, --debug Enable 'xtrace' and keep scratch files" >&2
539539 echo " in <CACHEDIR>/tmp" >&2
540540 echo " (can be specified multiple times)" >&2
541- echo " -e, -- oot-module Enable patching out-of-tree module," >&2
541+ echo " -- oot-module Enable patching out-of-tree module," >&2
542542 echo " specify current version of module" >&2
543+ echo " --oot-module-src Specify out-of-tree module source directory" >&2
543544 echo " -R, --non-replace Disable replace patch (replace is on by default)" >&2
544545 echo " --skip-cleanup Skip post-build cleanup" >&2
545546 echo " --skip-compiler-check Skip compiler version matching check" >&2
546547 echo " (not recommended)" >&2
547548}
548549
549- options=" $( getopt -o ha:r:s:c:v:j:t:n:o:de:R -l " help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace" -- " $@ " ) " || die " getopt failed"
550+ options=" $( getopt -o ha:r:s:c:v:j:t:n:o:dR -l " help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src :,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace" -- " $@ " ) " || die " getopt failed"
550551
551552eval set -- " $options "
552553
@@ -604,11 +605,16 @@ while [[ $# -gt 0 ]]; do
604605 echo " DEBUG mode enabled"
605606 fi
606607 ;;
607- -e|- -oot-module)
608+ --oot-module)
608609 [[ ! -f " $2 " ]] && die " out-of-tree module '$2 ' not found"
609610 OOT_MODULE=" $( readlink -f " $2 " ) "
610611 shift
611612 ;;
613+ --oot-module-src)
614+ [[ ! -d " $2 " ]] && die " out-of-tree module source dir '$2 ' not found"
615+ OOT_MODULE_SRCDIR=" $( readlink -f " $2 " ) "
616+ shift
617+ ;;
612618 -R|--non-replace)
613619 KLP_REPLACE=0
614620 ;;
@@ -657,8 +663,8 @@ if [[ -n "$SRCRPM" ]]; then
657663 ARCHVERSION=" ${ARCHVERSION# alt-} "
658664fi
659665
660- if [[ -n " $OOT_MODULE " ]] && [[ -z " $USERSRCDIR " ]]; then
661- warn " --oot-module requires --sourcedir "
666+ if [[ -n " $OOT_MODULE " ]] && [[ -z " $OOT_MODULE_SRCDIR " ]]; then
667+ warn " --oot-module requires --oot-module-src "
662668 exit 1
663669fi
664670
@@ -672,21 +678,30 @@ if [[ -n "$USERSRCDIR" ]]; then
672678 warn " --archversion is incompatible with --sourcedir"
673679 exit 1
674680 fi
675- SRCDIR =" $USERSRCDIR "
681+ KERNEL_SRCDIR =" $USERSRCDIR "
676682
677- if [[ -z " $OOT_MODULE " ]]; then
678- [[ -z " $VMLINUX " ]] && VMLINUX=" $SRCDIR " /vmlinux
679- [[ ! -e " $VMLINUX " ]] && die " can't find vmlinux"
683+ [[ -z " $VMLINUX " ]] && VMLINUX=" $KERNEL_SRCDIR " /vmlinux
684+ [[ ! -e " $VMLINUX " ]] && die " can't find vmlinux"
680685
681- # Extract the target kernel version from vmlinux in this case.
682- ARCHVERSION=" $( strings " $VMLINUX " | grep -m 1 -e " ^Linux version" | awk ' { print($3); }' ) "
683- else
684- ARCHVERSION=" $( modinfo -F vermagic " $OOT_MODULE " | awk ' {print $1}' ) "
685- fi
686+ # Extract the target kernel version from vmlinux in this case.
687+ ARCHVERSION=" $( strings " $VMLINUX " | grep -m 1 -e " ^Linux version" | awk ' { print($3); }' ) "
688+ fi
689+
690+ if [[ -n " $OOT_MODULE " ]]; then
691+ ARCHVERSION=" $( modinfo -F vermagic " $OOT_MODULE " | awk ' {print $1}' ) "
686692fi
687693
688694[[ -z " $ARCHVERSION " ]] && ARCHVERSION=" $( uname -r) "
689695
696+ if [[ -n " $OOT_MODULE " ]]; then
697+ if [[ -z " $USERSRCDIR " ]]; then
698+ KERNEL_SRCDIR=" /lib/modules/$ARCHVERSION /build/"
699+ fi
700+ BUILDDIR=" $OOT_MODULE_SRCDIR "
701+ else
702+ BUILDDIR=" $KERNEL_SRCDIR "
703+ fi
704+
690705[[ " $SKIPCLEANUP " -eq 0 ]] && trap cleanup EXIT INT TERM HUP
691706
692707KVER=" ${ARCHVERSION%% -* } "
@@ -728,18 +743,16 @@ if [[ -n "$USERSRCDIR" ]]; then
728743 echo " Using source directory at $USERSRCDIR "
729744
730745 # save original vmlinux before it gets overwritten by sourcedir build
731- if [[ -z " $OOT_MODULE " ]] && [[ " $ VMLINUX" -ef " $SRCDIR " /vmlinux ]]; then
746+ if [[ " $ VMLINUX" -ef " $KERNEL_SRCDIR " /vmlinux ]]; then
732747 cp -f " $VMLINUX " " $TEMPDIR /vmlinux" || die
733748 VMLINUX=" $TEMPDIR /vmlinux"
734749 fi
735-
736- # For external modules, use the running kernel's config
737- if [[ -n " $OOT_MODULE " ]] && [[ -z " $CONFIGFILE " ]]; then
750+ elif [[ -n " $OOT_MODULE " ]]; then
751+ if [[ -z " ${CONFIGFILE} " ]]; then
738752 CONFIGFILE=" /boot/config-${ARCHVERSION} "
739753 fi
740-
741- elif [[ -e " $SRCDIR " /.config ]] && [[ -e " $VERSIONFILE " ]] && [[ " $( cat " $VERSIONFILE " ) " = " $ARCHVERSION " ]]; then
742- echo " Using cache at $SRCDIR "
754+ elif [[ -e " $KERNEL_SRCDIR " /.config ]] && [[ -e " $VERSIONFILE " ]] && [[ " $( cat " $VERSIONFILE " ) " = " $ARCHVERSION " ]]; then
755+ echo " Using cache at $KERNEL_SRCDIR "
743756
744757else
745758 if [[ " $DISTRO " = fedora ]] || [[ " $DISTRO " = rhel ]] || [[ " $DISTRO " = ol ]] || [[ " $DISTRO " = centos ]]; then
@@ -765,19 +778,19 @@ else
765778 rpmbuild -D " _topdir $RPMTOPDIR " -bp --nodeps " --target=$( uname -m) " " $RPMTOPDIR " /SPECS/kernel$ALT .spec 2>&1 | logger ||
766779 die " rpmbuild -bp failed. you may need to run 'yum-builddep kernel' first."
767780
768- mv " $RPMTOPDIR " /BUILD/kernel-* /linux-* " $SRCDIR " 2>&1 | logger || die
781+ mv " $RPMTOPDIR " /BUILD/kernel-* /linux-* " $KERNEL_SRCDIR " 2>&1 | logger || die
769782 rm -rf " $RPMTOPDIR "
770- rm -rf " $SRCDIR /.git"
783+ rm -rf " $KERNEL_SRCDIR /.git"
771784
772785 if [[ " $ARCHVERSION " == * -* ]]; then
773- sed -i " s/^EXTRAVERSION.*/EXTRAVERSION = -${ARCHVERSION##* -} /" " $SRCDIR /Makefile" || die
786+ sed -i " s/^EXTRAVERSION.*/EXTRAVERSION = -${ARCHVERSION##* -} /" " $KERNEL_SRCDIR /Makefile" || die
774787 fi
775788
776789 echo " $ARCHVERSION " > " $VERSIONFILE " || die
777790
778- [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $SRCDIR /configs/kernel$ALT -$KVER -$ARCH .config"
791+ [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR /configs/kernel$ALT -$KVER -$ARCH .config"
779792
780- (cd " $SRCDIR " && make mrproper 2>&1 | logger) || die
793+ (cd " $KERNEL_SRCDIR " && make mrproper 2>&1 | logger) || die
781794
782795 elif [[ " $DISTRO " = ubuntu ]] || [[ " $DISTRO " = debian ]]; then
783796
@@ -806,25 +819,25 @@ else
806819 echo " Downloading and unpacking the kernel source for $ARCHVERSION "
807820 # Download source deb pkg
808821 (dget -u " $url /${pkgname} /${dscname} " 2>&1 ) | logger || die " dget: Could not fetch/unpack $url /${pkgname} /${dscname} "
809- mv " ${pkgname} -$KVER " " $SRCDIR " || die
822+ mv " ${pkgname} -$KVER " " $KERNEL_SRCDIR " || die
810823 [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" /boot/config-${ARCHVERSION} "
811824 if [[ " $ARCHVERSION " == * -* ]]; then
812- echo " -${ARCHVERSION#* -} " > " $SRCDIR /localversion" || die
825+ echo " -${ARCHVERSION#* -} " > " $KERNEL_SRCDIR /localversion" || die
813826 fi
814827 # for some reason the Ubuntu kernel versions don't follow the
815828 # upstream SUBLEVEL; they are always at SUBLEVEL 0
816- sed -i " s/^SUBLEVEL.*/${sublevel} /" " $SRCDIR /Makefile" || die
829+ sed -i " s/^SUBLEVEL.*/${sublevel} /" " $KERNEL_SRCDIR /Makefile" || die
817830 echo " $ARCHVERSION " > " $VERSIONFILE " || die
818831
819832 else
820833 die " Unsupported distribution"
821834 fi
822835fi
823836
824- [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $SRCDIR " /.config
837+ [[ -z " $CONFIGFILE " ]] && CONFIGFILE=" $KERNEL_SRCDIR " /.config
825838[[ ! -e " $CONFIGFILE " ]] && die " can't find config file"
826- if [[ ! " $CONFIGFILE " -ef " $SRCDIR " /.config ]] ; then
827- cp -f " $CONFIGFILE " " $SRCDIR /.config" || die
839+ if [[ -z " $OOT_MODULE " && ! " $CONFIGFILE " -ef " $KERNEL_SRCDIR " /.config ]] ; then
840+ cp -f " $CONFIGFILE " " $KERNEL_SRCDIR /.config" || die
828841fi
829842
830843# kernel option checking
@@ -887,12 +900,12 @@ grep -q "CONFIG_GCC_PLUGIN_RANDSTRUCT=y" "$CONFIGFILE" && die "kernel option 'CO
887900# link-vmlinux.sh and Makefile.modfinal since kpatch doesn't care about
888901# that anyway.
889902if grep -q " CONFIG_DEBUG_INFO_BTF=y" " $CONFIGFILE " ; then
890- cp -f " $SRCDIR /scripts/link-vmlinux.sh" " $TEMPDIR /link-vmlinux.sh" || die
891- sed -i ' s/CONFIG_DEBUG_INFO_BTF/DISABLED_FOR_KPATCH_BUILD/g' " $SRCDIR " /scripts/link-vmlinux.sh || die
903+ cp -f " $KERNEL_SRCDIR /scripts/link-vmlinux.sh" " $TEMPDIR /link-vmlinux.sh" || die
904+ sed -i ' s/CONFIG_DEBUG_INFO_BTF/DISABLED_FOR_KPATCH_BUILD/g' " $KERNEL_SRCDIR " /scripts/link-vmlinux.sh || die
892905
893- if [[ -e " $SRCDIR /scripts/Makefile.modfinal" ]]; then
894- cp -f " $SRCDIR /scripts/Makefile.modfinal" " $TEMPDIR /Makefile.modfinal" || die
895- sed -i ' s/CONFIG_DEBUG_INFO_BTF_MODULES/DISABLED_FOR_KPATCH_BUILD/g' " $SRCDIR " /scripts/Makefile.modfinal || die
906+ if [[ -e " $KERNEL_SRCDIR /scripts/Makefile.modfinal" ]]; then
907+ cp -f " $KERNEL_SRCDIR /scripts/Makefile.modfinal" " $TEMPDIR /Makefile.modfinal" || die
908+ sed -i ' s/CONFIG_DEBUG_INFO_BTF_MODULES/DISABLED_FOR_KPATCH_BUILD/g' " $KERNEL_SRCDIR " /scripts/Makefile.modfinal || die
896909 fi
897910fi
898911
@@ -914,7 +927,7 @@ if [[ "$SKIPCOMPILERCHECK" -eq 0 ]]; then
914927fi
915928
916929echo " Testing patch file(s)"
917- cd " $SRCDIR " || die
930+ cd " $BUILDDIR " || die
918931verify_patch_files
919932apply_patches
920933remove_patches
962975make " ${MAKEVARS[@]} " " -j$CPUS " $TARGETS 2>&1 | logger || die
963976
964977# Save original module symvers
965- cp -f " $SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
978+ cp -f " $BUILDDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
966979
967980echo " Building patched source"
968981apply_patches
969982mkdir -p " $TEMPDIR /orig" " $TEMPDIR /patched"
970983export KPATCH_GCC_TEMPDIR=" $TEMPDIR "
971- export KPATCH_GCC_SRCDIR=" $SRCDIR "
984+ export KPATCH_GCC_SRCDIR=" $BUILDDIR "
972985save_env
973986# $TARGETS used as list, no quotes.
974987# shellcheck disable=SC2086
@@ -985,7 +998,7 @@ if [[ ! -e "$TEMPDIR/changed_objs" ]]; then
985998 die " no changed objects found"
986999fi
9871000
988- [[ -n " $OOT_MODULE " ]] || grep -q vmlinux " $SRCDIR /Module.symvers" || die " truncated $SRCDIR /Module.symvers file"
1001+ grep -q vmlinux " $KERNEL_SRCDIR /Module.symvers" || die " truncated $KERNEL_SRCDIR /Module.symvers file"
9891002
9901003if [[ " $CONFIG_MODVERSIONS " -eq 1 ]]; then
9911004 while read -ra sym_line; do
@@ -995,9 +1008,9 @@ if [[ "$CONFIG_MODVERSIONS" -eq 1 ]]; then
9951008
9961009 sym=${sym_line[1]}
9971010
998- read -ra patched_sym_line <<< " $(grep " \s $sym \s " " $SRCDIR /Module.symvers" )"
1011+ read -ra patched_sym_line <<< " $(grep " \s $sym \s " " $BUILDDIR /Module.symvers" )"
9991012 if [[ ${# patched_sym_line[@]} -lt 4 ]]; then
1000- die " Malformed symbol entry for ${sym} in ${SRCDIR } /Module.symvers file"
1013+ die " Malformed symbol entry for ${sym} in ${BUILDDIR } /Module.symvers file"
10011014 fi
10021015
10031016 # Assume that both original and patched symvers have the same format.
10151028for i in $( cat " $TEMPDIR /changed_objs" )
10161029do
10171030 mkdir -p " $TEMPDIR /patched/$( dirname " $i " ) " || die
1018- cp -f " $SRCDIR /$i " " $TEMPDIR /patched/$i " || die
1031+ cp -f " $BUILDDIR /$i " " $TEMPDIR /patched/$i " || die
10191032done
10201033
10211034echo " Extracting new and modified ELF sections"
@@ -1050,9 +1063,8 @@ ERROR=0
10501063
10511064# Prepare OOT module symvers file
10521065if [[ -n " $OOT_MODULE " ]]; then
1053- BUILDDIR=" /lib/modules/$ARCHVERSION /build/"
1054- cp -f " $SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
1055- awk ' { print $1 "\t" $2 "\t" $3 "\t" $4}' " ${BUILDDIR} /Module.symvers" >> " $TEMPDIR /Module.symvers"
1066+ cp -f " $OOT_MODULE_SRCDIR /Module.symvers" " $TEMPDIR /Module.symvers" || die
1067+ awk ' { print $1 "\t" $2 "\t" $3 "\t" $4}' " ${KERNEL_SRCDIR} /Module.symvers" >> " $TEMPDIR /Module.symvers"
10561068fi
10571069
10581070for i in $FILES ; do
@@ -1065,15 +1077,15 @@ for i in $FILES; do
10651077 [[ " $i " = usr/initramfs_data.o ]] && continue
10661078
10671079 mkdir -p " output/$( dirname " $i " ) "
1068- cd " $SRCDIR " || die
1080+ cd " $BUILDDIR " || die
10691081 find_kobj " $i "
10701082 cd " $TEMPDIR " || die
10711083 if [[ -e " orig/$i " ]]; then
10721084 if [[ " $( basename " $KOBJFILE " ) " = vmlinux ]]; then
10731085 KOBJFILE_NAME=vmlinux
10741086 KOBJFILE_PATH=" $VMLINUX "
10751087 SYMTAB=" ${TEMPDIR} /${KOBJFILE_NAME} .symtab"
1076- SYMVERS_FILE=" $SRCDIR /Module.symvers"
1088+ SYMVERS_FILE=" $BUILDDIR /Module.symvers"
10771089 elif [[ " $( basename " $KOBJFILE " ) " = " $( basename " $OOT_MODULE " ) " ]]; then
10781090 KOBJFILE_NAME=" $( basename --suffix=.ko " $OOT_MODULE " ) "
10791091 KOBJFILE_PATH=" $OOT_MODULE "
@@ -1084,7 +1096,7 @@ for i in $FILES; do
10841096 KOBJFILE_NAME=" ${KOBJFILE_NAME// -/ _} "
10851097 KOBJFILE_PATH=" ${TEMPDIR} /module/$KOBJFILE "
10861098 SYMTAB=" ${KOBJFILE_PATH} .symtab"
1087- SYMVERS_FILE=" $SRCDIR /Module.symvers"
1099+ SYMVERS_FILE=" $BUILDDIR /Module.symvers"
10881100 fi
10891101
10901102 readelf -s --wide " $KOBJFILE_PATH " > " $SYMTAB "
@@ -1138,7 +1150,7 @@ if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then
11381150 # UBUNTU: add UTS_UBUNTU_RELEASE_ABI to utsrelease.h after regenerating it
11391151 UBUNTU_ABI=" ${ARCHVERSION#* -} "
11401152 UBUNTU_ABI=" ${UBUNTU_ABI% -* } "
1141- echo " #define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI " >> " $SRCDIR " /include/generated/utsrelease.h
1153+ echo " #define UTS_UBUNTU_RELEASE_ABI $UBUNTU_ABI " >> " $KERNEL_SRCDIR " /include/generated/utsrelease.h
11421154fi
11431155
11441156cd " $TEMPDIR /output" || die
@@ -1161,18 +1173,13 @@ else
11611173fi
11621174
11631175cd " $TEMPDIR /patch" || die
1164- if [[ -z " $OOT_MODULE " ]]; then
1165- KPATCH_BUILD=" $SRCDIR "
1166- else
1167- KPATCH_BUILD=" /lib/modules/$ARCHVERSION /build"
1168- fi
11691176
11701177# We no longer need kpatch-cc
11711178for (( idx= 0 ; idx< ${# MAKEVARS[@]} ; idx++ )) ; do
11721179 MAKEVARS[$idx ]=${MAKEVARS[$idx]/ ${KPATCH_CC_PREFIX} / }
11731180done
11741181
1175- export KPATCH_BUILD=" $KPATCH_BUILD " KPATCH_NAME=" $MODNAME " \
1182+ export KPATCH_BUILD=" $BUILDDIR " KPATCH_NAME=" $MODNAME " \
11761183KBUILD_EXTRA_SYMBOLS=" $KBUILD_EXTRA_SYMBOLS " \
11771184KPATCH_LDFLAGS=" $KPATCH_LDFLAGS "
11781185save_env
0 commit comments