| 1 | #!/bin/sh |
| 2 | # SPDX-License-Identifier: GPL-2.0-only |
| 3 | |
| 4 | set -eu |
| 5 | |
| 6 | destdir=${1} |
| 7 | |
| 8 | is_enabled() { |
| 9 | grep -q "^$1=y" include/config/auto.conf |
| 10 | } |
| 11 | |
| 12 | find_in_scripts() { |
| 13 | find scripts \ |
| 14 | \( -name atomic -o -name dtc -o -name kconfig -o -name package \) -prune -o \ |
| 15 | ! -name unifdef -a ! -name mk_elfconfig -a \( -type f -o -type l \) -print |
| 16 | } |
| 17 | |
| 18 | mkdir -p "${destdir}" |
| 19 | |
| 20 | ( |
| 21 | cd "${srctree}" |
| 22 | echo Makefile |
| 23 | find "arch/${SRCARCH}" -maxdepth 1 -name 'Makefile*' |
| 24 | find "arch/${SRCARCH}" -name generated -prune -o -name include -type d -print |
| 25 | find "arch/${SRCARCH}" -name Kbuild.platforms -o -name Platform |
| 26 | find include \( -name config -o -name generated \) -prune -o \( -type f -o -type l \) -print |
| 27 | find_in_scripts |
| 28 | ) | tar -c -f - -C "${srctree}" -T - | tar -xf - -C "${destdir}" |
| 29 | |
| 30 | { |
| 31 | if is_enabled CONFIG_OBJTOOL; then |
| 32 | echo tools/objtool/objtool |
| 33 | fi |
| 34 | |
| 35 | echo Module.symvers |
| 36 | echo "arch/${SRCARCH}/include/generated" |
| 37 | echo include/config/auto.conf |
| 38 | echo include/config/kernel.release |
| 39 | echo include/generated |
| 40 | find_in_scripts |
| 41 | |
| 42 | if is_enabled CONFIG_GCC_PLUGINS; then |
| 43 | find scripts/gcc-plugins -name '*.so' |
| 44 | fi |
| 45 | } | tar -c -f - -T - | tar -xf - -C "${destdir}" |
| 46 | |
| 47 | # When ${CC} and ${HOSTCC} differ, rebuild host programs using ${CC}. |
| 48 | # |
| 49 | # This caters to host programs that participate in Kbuild. objtool and |
| 50 | # resolve_btfids are out of scope. |
| 51 | if [ "${CC}" != "${HOSTCC}" ]; then |
| 52 | echo "Rebuilding host programs with ${CC}..." |
| 53 | |
| 54 | # This leverages external module building. |
| 55 | # - Clear sub_make_done to allow the top-level Makefile to redo sub-make. |
| 56 | # - Filter out --no-print-directory to print "Entering directory" logs |
| 57 | # when Make changes the working directory. |
| 58 | unset sub_make_done |
| 59 | MAKEFLAGS=$(echo "${MAKEFLAGS}" | sed s/--no-print-directory//) |
| 60 | |
| 61 | cat <<-'EOF' > "${destdir}/Kbuild" |
| 62 | subdir-y := scripts |
| 63 | EOF |
| 64 | |
| 65 | # HOSTCXX is not overridden. The C++ compiler is used to build: |
| 66 | # - scripts/kconfig/qconf, which is unneeded for external module builds |
| 67 | # - GCC plugins, which will not work on the installed system even after |
| 68 | # being rebuilt. |
| 69 | # |
| 70 | # Use the single-target build to avoid the modpost invocation, which |
| 71 | # would overwrite Module.symvers. |
| 72 | "${MAKE}" HOSTCC="${CC}" KBUILD_OUTPUT=. KBUILD_EXTMOD="${destdir}" scripts/ |
| 73 | |
| 74 | cat <<-'EOF' > "${destdir}/scripts/Kbuild" |
| 75 | subdir-y := basic |
| 76 | hostprogs-always-y := mod/modpost |
| 77 | mod/modpost-objs := $(addprefix mod/, modpost.o file2alias.o sumversion.o symsearch.o) |
| 78 | EOF |
| 79 | |
| 80 | # Run once again to rebuild scripts/basic/ and scripts/mod/modpost. |
| 81 | "${MAKE}" HOSTCC="${CC}" KBUILD_OUTPUT=. KBUILD_EXTMOD="${destdir}" scripts/ |
| 82 | |
| 83 | rm -f "${destdir}/Kbuild" "${destdir}/scripts/Kbuild" |
| 84 | fi |
| 85 | |
| 86 | find "${destdir}" \( -name '.*.cmd' -o -name '*.o' \) -delete |