summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/package/install-extmod-build34
1 files changed, 34 insertions, 0 deletions
diff --git a/scripts/package/install-extmod-build b/scripts/package/install-extmod-build
index 9fee4a3236cc..d2c9cacecc0c 100755
--- a/scripts/package/install-extmod-build
+++ b/scripts/package/install-extmod-build
@@ -44,4 +44,38 @@ mkdir -p "${destdir}"
fi
} | tar -c -f - -T - | tar -xf - -C "${destdir}"
+# When ${CC} and ${HOSTCC} differ, we are likely cross-compiling. Rebuild host
+# programs using ${CC}. This assumes CC=${CROSS_COMPILE}gcc, which is usually
+# the case for package building. It does not cross-compile when CC=clang.
+#
+# This caters to host programs that participate in Kbuild. objtool and
+# resolve_btfids are out of scope.
+if [ "${CC}" != "${HOSTCC}" ] && is_enabled CONFIG_CC_CAN_LINK; then
+ echo "Rebuilding host programs with ${CC}..."
+
+ cat <<-'EOF' > "${destdir}/Kbuild"
+ subdir-y := scripts
+ EOF
+
+ # HOSTCXX is not overridden. The C++ compiler is used to build:
+ # - scripts/kconfig/qconf, which is unneeded for external module builds
+ # - GCC plugins, which will not work on the installed system even after
+ # being rebuilt.
+ #
+ # Use the single-target build to avoid the modpost invocation, which
+ # would overwrite Module.symvers.
+ "${MAKE}" HOSTCC="${CC}" KBUILD_EXTMOD="${destdir}" scripts/
+
+ cat <<-'EOF' > "${destdir}/scripts/Kbuild"
+ subdir-y := basic
+ hostprogs-always-y := mod/modpost
+ mod/modpost-objs := $(addprefix mod/, modpost.o file2alias.o sumversion.o symsearch.o)
+ EOF
+
+ # Run once again to rebuild scripts/basic/ and scripts/mod/modpost.
+ "${MAKE}" HOSTCC="${CC}" KBUILD_EXTMOD="${destdir}" scripts/
+
+ rm -f "${destdir}/Kbuild" "${destdir}/scripts/Kbuild"
+fi
+
find "${destdir}" \( -name '.*.cmd' -o -name '*.o' \) -delete