X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=scripts%2Flttng-modules%2Fparam-build.sh;h=b576696b08fbcad97fbb37a11ac3f62bd9e70452;hb=7e94286326f4ebc57b062d93ce8a53d55db14179;hp=d14f49dc0fe686a5ce4d11bb0f2c50dae14212ee;hpb=f3d8604b477b84631d624aed305afdd944ffa5c6;p=lttng-ci.git diff --git a/scripts/lttng-modules/param-build.sh b/scripts/lttng-modules/param-build.sh index d14f49d..b576696 100644 --- a/scripts/lttng-modules/param-build.sh +++ b/scripts/lttng-modules/param-build.sh @@ -15,6 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +## FUNCTIONS ## + # Kernel version compare functions verlte() { [ "$1" = "`printf '%s\n%s' $1 $2 | sort -V | head -n1`" ] @@ -32,75 +34,325 @@ vergt() { [ "$1" = "$2" ] && return 1 || vergte $1 $2 } + +prepare_lnx_sources() { + + outdir=$1 + + if [ "$outdir" = "." ]; then + koutput="" + else + koutput="O=\"${outdir}\"" + fi + + # Generate kernel configuration + case "$kversion" in + Ubuntu*) + fakeroot debian/rules clean + fakeroot debian/rules genconfigs + cp CONFIGS/${ubuntu_config} "${outdir}"/.config + ;; + *) + # Que sera sera + make ${koutput} allyesconfig + ;; + esac + + # GCC 4.8 + sed -i "s/CONFIG_CC_STACKPROTECTOR_STRONG=y/# CONFIG_CC_STACKPROTECTOR_STRONG is not set/g" "${outdir}"/.config + + # Don't try to sign modules + sed -i "s/CONFIG_MODULE_SIG=y/# CONFIG_MODULE_SIG is not set/g" "${outdir}"/.config + + # Disable kernel stack frame correctness validation, introduced in 4.6.0 and currently fails + sed -i "s/CONFIG_STACK_VALIDATION=y/# CONFIG_STACK_VALIDATION is not set/g" "${outdir}"/.config + + # Enable CONFIG_KALLSYMS_ALL + echo "CONFIG_KPROBES=y" >> "${outdir}"/.config + echo "CONFIG_FTRACE=y" >> "${outdir}"/.config + echo "CONFIG_BLK_DEV_IO_TRACE=y" >> "${outdir}"/.config + echo "CONFIG_TRACEPOINTS=y" >> "${outdir}"/.config + echo "CONFIG_KALLSYMS_ALL=y" >> "${outdir}"/.config + + + make ${koutput} silentoldconfig + make ${koutput} modules_prepare + + # Version specific tasks + case "$kversion" in + Ubuntu*) + # Add Ubuntu ABI number to kernel headers, this is normally done by the packaging code + ABINUM=$(echo $kversion | grep -P -o 'Ubuntu-(lts-)?.*-\K\d+(?=\..*)') + echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> ${outdir}/include/generated/utsrelease.h + ;; + esac + + # On powerpc this object is required to link modules + if [ "${karch}" = "powerpc" ]; then + make ${koutput} arch/powerpc/lib/crtsavres.o + fi +} + + + +build_modules() { + + kdir="$1" + bdir="$2" + + # Get kernel version from source tree + cd "${kdir}" + kversion=$(make kernelversion) + + # Enter lttng-modules source dir + cd "${LTTSRCDIR}" + + # kernels 3.10 to 3.10.13 and 3.11 to 3.11.2 introduce a deadlock in the + # timekeeping subsystem. We want those build to fail. + if { vergte "$kversion" "3.10" && verlte "$kversion" "3.10.13"; } || \ + { vergte "$kversion" "3.11" && verlte "$kversion" "3.11.2"; }; then + + set +e + + # Build modules + KERNELDIR="${kdir}" make -j${NPROC} V=1 + + # We expect this build to fail, if it doesn't, fail the job. + if [ "$?" -eq 0 ]; then + exit 1 + fi + + # We have to publish at least one file or the build will fail + echo "This kernel is broken, there is a deadlock in the timekeeping subsystem." > "${bdir}/BROKEN.txt.ko" + + set -e + + KERNELDIR="${kdir}" make clean + + else # Regular build + + # Build modules against full kernel sources + KERNELDIR="${kdir}" make -j${NPROC} V=1 + + # Install modules to build dir + KERNELDIR="${kdir}" make INSTALL_MOD_PATH="${bdir}" modules_install + + # Clean build dir + KERNELDIR="${kdir}" make clean + fi +} + + +## MAIN ## + # Use all CPU cores NPROC=$(nproc) -SRCDIR="${WORKSPACE}/lttng-modules" -BUILDDIR="${WORKSPACE}/build" -LNXSRCDIR="${WORKSPACE}/linux" -LNXBUILDDIR="${WORKSPACE}/linux-build" +LTTSRCDIR="${WORKSPACE}/src/lttng-modules" +LNXSRCDIR="${WORKSPACE}/src/linux" + +LNXBUILDDIR="${WORKSPACE}/build/linux" +LNXHDRDIR="${WORKSPACE}/build/linux-headers" + +LTTBUILDKSRCDIR="${WORKSPACE}/build/lttng-modules-ksrc" +LTTBUILDKHDRDIR="${WORKSPACE}/build/lttng-modules-khdr" + + +# Setup cross compile env if available +if [ "x${cross_arch:-}" != "x" ]; then -# Create build directory -mkdir -p "${BUILDDIR}" "${LNXBUILDDIR}" + case "$cross_arch" in + "armhf") + karch="arm" + cross_compile="arm-linux-gnueabihf-" + ubuntu_config="armhf-config.flavour.generic" + ;; + + "arm64") + karch="arm64" + cross_compile="aarch64-linux-gnu-" + ubuntu_config="arm64-config.flavour.generic" + ;; + + "powerpc") + karch="powerpc" + cross_compile="powerpc-linux-gnu-" + ubuntu_config="powerpc-config.flavour.powerpc-smp" + ;; + + "ppc64el") + karch="powerpc" + cross_compile="powerpc64le-linux-gnu-" + ubuntu_config="ppc64el-config.flavour.generic" + ;; + + *) + echo "Unsupported cross arch $arch" + exit 1 + ;; + esac + + # Export variables used by Kbuild for cross compilation + export ARCH="${karch}" + export CROSS_COMPILE="${cross_compile}" + + +# Set arch specific values if we are not cross compiling +elif [ "x${arch:-}" != "x" ]; then + case "$arch" in + "x86-32") + karch="x86" + ubuntu_config="i386-config.flavour.generic" + ;; + + "x86-64") + karch="x86" + ubuntu_config="amd64-config.flavour.generic" + ;; + + "armhf") + karch="arm" + ubuntu_config="armhf-config.flavour.generic" + ;; + + "arm64") + karch="arm64" + ubuntu_config="arm64-config.flavour.generic" + ;; + + "powerpc") + karch="powerpc" + ubuntu_config="powerpc-config.flavour.powerpc-smp" + ;; + + "ppc64el") + karch="powerpc" + ubuntu_config="ppc64el-config.flavour.generic" + ;; + + *) + echo "Unsupported arch $arch" + exit 1 + ;; + esac +else + echo "Not arch or cross_arch specified" + exit 1 +fi + + + + +# Create build directories +mkdir -p "${LNXBUILDDIR}" "${LNXHDRDIR}" "${LTTBUILDKSRCDIR}" "${LTTBUILDKHDRDIR}" + + + +## PREPARE DISTRO STYLE KERNEL HEADERS / DEVEL # Enter linux source dir cd "${LNXSRCDIR}" -# Prepare linux sources for modules OOT build -make O="${LNXBUILDDIR}" defconfig +prepare_lnx_sources "." -# Enable CONFIG_KALLSYMS_ALL -sed -i "s/# CONFIG_KALLSYMS_ALL is not set/CONFIG_KALLSYMS_ALL=y/g" "${LNXBUILDDIR}"/.config +# For RT kernels, copy version file +if [ -s localversion-rt ]; then + cp -a localversion-rt "${LNXHDRDIR}" +fi -# Build to out of tree dir -make O="${LNXBUILDDIR}" modules_prepare +# Copy all Makefile related stuff +find . -path './include/*' -prune \ + -o -path './scripts/*' -prune -o -type f \ + \( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \ + -name '*.sh' -o -name '*.pl' -o -name '*.lds' \) \ + -print | cpio -pd --preserve-modification-time "${LNXHDRDIR}" -case "$kversion" in - Ubuntu*) - #fakeroot debian/rules clean - #fakeroot debian/rules genconfigs - #cp CONFIGS/amd64-config.flavour.generic .config +# Copy base scripts and include dirs +cp -a scripts include "${LNXHDRDIR}" - # Add Ubuntu ABI number to kernel headers, this is normally done by the packaging code - ABINUM=$(echo $kversion | grep -P -o 'Ubuntu-(lts-)?.*-\K\d+(?=\..*)') - echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> ${LNXBUILDDIR}/include/generated/utsrelease.h - ;; -esac +# Copy arch includes +(find arch -name include -type d -print | \ + xargs -n1 -i: find : -type f) | \ + cpio -pd --preserve-modification-time "${LNXHDRDIR}" -# Get kernel version from source tree -cd "${LNXBUILDDIR}" -KVERSION=$(make kernelversion) +# Copy arch scripts +(find arch -name scripts -type d -print | \ + xargs -n1 -i: find : -type f) | \ + cpio -pd --preserve-modification-time "${LNXHDRDIR}" -# Enter source dir -cd "${SRCDIR}" +# Cleanup scripts +rm -f "${LNXHDRDIR}/scripts/*.o" +rm -f "${LNXHDRDIR}/scripts/*/*.o" -# kernels 3.10 to 3.10.13 and 3.11 to 3.11.2 introduce a deadlock in the -# timekeeping subsystem. We want those build to fail. -if { vergte "$KVERSION" "3.10" && verlte "$KVERSION" "3.10.13"; } || \ - { vergte "$KVERSION" "3.11" && verlte "$KVERSION" "3.11.2"; }; then +# On powerpc this object is required to link modules +if [ "${karch}" = "powerpc" ]; then + cp -a --parents arch/powerpc/lib/crtsavres.[So] "${LNXHDRDIR}/" +fi - set +e +# Copy modules related stuff, if available +if [ -s Module.symvers ]; then + cp Module.symvers "${LNXHDRDIR}" +fi - # Build modules - make -j${NPROC} -C "${LNXBUILDDIR}" M="$(pwd)" V=1 CONFIG_LTTNG=m +if [ -s System.map ]; then + cp System.map "${LNXHDRDIR}" +fi + +if [ -s Module.markers ]; then + cp Module.markers "${LNXHDRDIR}" +fi + +# Copy config file +cp .config "${LNXHDRDIR}" + +# Make sure the Makefile and version.h have a matching timestamp so that +# external modules can be built +if [ -s "${LNXHDRDIR}/include/generated/uapi/linux/version.h" ]; then + touch -r "${LNXHDRDIR}/Makefile" "${LNXHDRDIR}/include/generated/uapi/linux/version.h" +elif [ -s "${LNXHDRDIR}/include/linux/version.h" ]; then + touch -r "${LNXHDRDIR}/Makefile" "${LNXHDRDIR}/include/linux/version.h" +else + echo "Missing version.h" + exit 1 +fi +touch -r "${LNXHDRDIR}/.config" "${LNXHDRDIR}/include/generated/autoconf.h" + +# Copy .config to include/config/auto.conf so "make prepare" is unnecessary. +cp "${LNXHDRDIR}/.config" "${LNXHDRDIR}/include/config/auto.conf" - # We expect this build to fail, if it doesn't, fail the job. - if [ "$?" -eq 0 ]; then - exit 1 - fi - # We have to publish at least one file or the build will fail - echo "This kernel is broken, there is a deadlock in the timekeeping subsystem." > "${BUILDDIR}/BROKEN.txt" - set -e -else # Regular build +## PREPARE FULL LINUX SOURCE TREE - # Build modules - make -j${NPROC} -C "${LNXBUILDDIR}" M="$(pwd)" V=1 CONFIG_LTTNG=m +# Enter linux source dir +cd "${LNXSRCDIR}" + +# Make sure linux source dir is clean +git clean -xdf + +prepare_lnx_sources "${LNXBUILDDIR}" + + +## BUILD modules + +# Build modules against full kernel sources +build_modules "${LNXBUILDDIR}" "${LTTBUILDKSRCDIR}" + +# Build modules against kernel headers +build_modules "${LNXHDRDIR}" "${LTTBUILDKHDRDIR}" + +# Make sure modules were built +tree "${LTTBUILDKSRCDIR}" +if [ "x$(find "${LTTBUILDKSRCDIR}" -name '*.ko*' -printf yes -quit)" != "xyes" ]; then + echo "No modules built!" + exit 1 +fi - # Install modules to build dir - make INSTALL_MOD_PATH="${BUILDDIR}" -C "${LNXBUILDDIR}" M="$(pwd)" modules_install +tree "${LTTBUILDKHDRDIR}" +if [ "x$(find "${LTTBUILDKHDRDIR}" -name '*.ko*' -printf yes -quit)" != "xyes" ]; then + echo "No modules built!" + exit 1 fi # EOF