mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-25 19:21:35 +01:00
Use the arm gem5 4.15 linux kernel. It should be fine since buildroot userland is older. Add some arm gem5 specific kernel config options.
192 lines
5.5 KiB
Bash
Executable File
192 lines
5.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eu
|
|
. common
|
|
set -- ${cli_build:-} "$@"
|
|
mkdir -p "${out_dir}"
|
|
br2_cli_file="${out_dir}/br2_cli"
|
|
rm -f "$br2_cli_file"
|
|
touch "$br2_cli_file"
|
|
kernel_config_fragment_cli_file="${out_dir}/kernel_config_fragment_cli"
|
|
rm -f "$kernel_config_fragment_cli_file"
|
|
touch "$kernel_config_fragment_cli_file"
|
|
configure=true
|
|
config_fragments="${root_dir}/br2/default"
|
|
extra_make_args=
|
|
j="$(nproc)"
|
|
linux_reconfigure=false
|
|
linux_kernel_custom_config_file=
|
|
kernel_config_fragments=
|
|
post_script_args=
|
|
qemu_sdl='--enable-sdl --with-sdlabi=2.0'
|
|
suffix=
|
|
v=0
|
|
while getopts 'a:B:b:C:c:fGgj:hIiK:klp:qSs:v' OPT; do
|
|
case "$OPT" in
|
|
a)
|
|
arch="$OPTARG"
|
|
;;
|
|
B)
|
|
echo "$OPTARG" >> "$br2_cli_file"
|
|
;;
|
|
b)
|
|
config_fragments="${config_fragments} $(common_abspath "${OPTARG}")"
|
|
;;
|
|
C)
|
|
echo "$OPTARG" >> "$kernel_config_fragment_cli_file"
|
|
;;
|
|
c)
|
|
kernel_config_fragments="${kernel_config_fragments} $(common_abspath "${OPTARG}")"
|
|
;;
|
|
f)
|
|
configure=false
|
|
;;
|
|
g)
|
|
extra_make_args="${extra_make_args} gem5-reconfigure \\
|
|
"
|
|
gem5=true
|
|
;;
|
|
h)
|
|
cat build-usage.adoc 1>&2
|
|
exit
|
|
;;
|
|
I)
|
|
echo "
|
|
BR2_TARGET_ROOTFS_CPIO=n
|
|
BR2_TARGET_ROOTFS_EXT2=n
|
|
BR2_TARGET_ROOTFS_INITRAMFS=y
|
|
" >> "$br2_cli_file"
|
|
;;
|
|
i)
|
|
echo "
|
|
BR2_TARGET_ROOTFS_CPIO=y
|
|
BR2_TARGET_ROOTFS_EXT2=n
|
|
BR2_TARGET_ROOTFS_INITRAMFS=n
|
|
" >> "$br2_cli_file"
|
|
;;
|
|
j)
|
|
j="$OPTARG"
|
|
;;
|
|
K)
|
|
linux_kernel_custom_config_file="$(common_abspath "${OPTARG}")"
|
|
;;
|
|
k)
|
|
extra_make_args="${extra_make_args} kernel_module-reconfigure \\
|
|
"
|
|
;;
|
|
l)
|
|
linux_reconfigure=true
|
|
extra_make_args="${extra_make_args} linux-reconfigure \\
|
|
"
|
|
;;
|
|
p)
|
|
post_script_args="$OPTARG"
|
|
;;
|
|
q)
|
|
extra_make_args="${extra_make_args} host-qemu-reconfigure \\
|
|
"
|
|
;;
|
|
S)
|
|
qemu_sdl=
|
|
;;
|
|
s)
|
|
suffix="$OPTARG"
|
|
;;
|
|
v)
|
|
v=1
|
|
;;
|
|
?)
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
extra_make_args="${extra_make_args} $@"
|
|
set_common_vars "$arch" "$gem5" "$suffix"
|
|
config_file="${buildroot_out_dir}/.config"
|
|
case "$arch" in
|
|
x86_64)
|
|
defconfig=qemu_x86_64_defconfig
|
|
;;
|
|
arm)
|
|
defconfig=qemu_arm_vexpress_defconfig
|
|
linux_kernel_custom_config_file="${root_dir}/linux/arch/arm/configs/gem5_defconfig"
|
|
;;
|
|
aarch64)
|
|
defconfig=qemu_aarch64_virt_defconfig
|
|
linux_kernel_custom_config_file="${root_dir}/linux/arch/arm64/configs/gem5_defconfig"
|
|
;;
|
|
mips64)
|
|
defconfig=qemu_mips64r6_malta_defconfig
|
|
;;
|
|
esac
|
|
config_fragments="${config_fragments} ${root_dir}/br2/qemu ${br2_cli_file}"
|
|
|
|
# Configure.
|
|
if "$configure"; then
|
|
cd "${buildroot_dir}"
|
|
for p in $(find "${root_dir}/buildroot_patches/" -maxdepth 1 -name '*.patch' -print); do
|
|
patch -N -r - -p 1 < "$p" || :
|
|
done
|
|
make O="$buildroot_out_dir" BR2_EXTERNAL="../kernel_module:../gem5:../parsec-benchmark:../sample_package" "$defconfig"
|
|
# TODO Can't get rid of these for now.
|
|
# http://stackoverflow.com/questions/44078245/is-it-possible-to-use-config-fragments-with-buildroots-config
|
|
for config_fragment in $config_fragments; do
|
|
cat "$config_fragment" >> "$config_file"
|
|
done
|
|
printf "
|
|
BR2_JLEVEL=${j}
|
|
BR2_DL_DIR=\"${common_dir}/dl\"
|
|
BR2_ROOTFS_POST_SCRIPT_ARGS=\"${post_script_args}\"
|
|
" >> "$config_file"
|
|
if "$gem5"; then
|
|
printf "BR2_PACKAGE_GEM5=y\n" >> "${config_file}"
|
|
fi
|
|
kernel_config_fragment_dir=../kernel_config_fragment
|
|
if [ -n "$linux_kernel_custom_config_file" ]; then
|
|
if [ -f "$linux_kernel_custom_config_file" ]; then
|
|
printf "BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y\nBR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"${linux_kernel_custom_config_file}\"\n" >> "$config_file"
|
|
if "${linux_reconfigure}"; then
|
|
touch "${linux_kernel_custom_config_file}"
|
|
fi
|
|
else
|
|
echo "error: -K: file does not exist: ${linux_kernel_custom_config_file}" 1>&2
|
|
exit 1
|
|
fi
|
|
default_config_fragments=
|
|
else
|
|
default_config_fragments="${kernel_config_fragment_dir}/min ${kernel_config_fragment_dir}/default"
|
|
fi
|
|
printf "BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"${default_config_fragments} ${kernel_config_fragments} ${kernel_config_fragment_cli_file}\"\n" >> "$config_file"
|
|
if "${linux_reconfigure}"; then
|
|
# https://stackoverflow.com/questions/49260466/why-when-i-change-br2-linux-kernel-custom-config-file-and-run-make-linux-reconfi
|
|
touch "${kernel_config_fragment_dir}/min"
|
|
fi
|
|
if [ "$arch" = 'mips64' ]; then
|
|
# Workaround for: https://bugs.busybox.net/show_bug.cgi?id=10276
|
|
sed -Ei 's/^BR2_PACKAGE_LINUX_TOOLS_GPIO/BR2_PACKAGE_LINUX_TOOLS_GPIO=n/' "$config_file"
|
|
fi
|
|
make O="$buildroot_out_dir" olddefconfig
|
|
fi
|
|
|
|
common_mkdir
|
|
cd "$buildroot_dir"
|
|
# HOST_QEMU_OPTS is a hack that happens to work because the QEMU package luckly uses += at all times.
|
|
# It shouldn't be necessary in the first place: https://bugs.busybox.net/show_bug.cgi?id=9936
|
|
#
|
|
# Even if were an autotools package, there is no general way currently to pass extra configs to it:
|
|
# https://stackoverflow.com/questions/44341188/how-to-pass-extra-custom-configure-autotools-options-to-a-buildroot-package/44341225#44341225
|
|
#
|
|
# BR2_ options may be given on the command line here, and they do have direct "define" effects.
|
|
# But this is generally bad, as it skips the Kconfig mechanism, e.g. it does not set defaults properly.
|
|
cmd="time \\
|
|
env \\
|
|
-u LD_LIBRARY_PATH \\
|
|
make \\
|
|
O='${buildroot_out_dir}' \\
|
|
HOST_QEMU_OPTS='--enable-debug --enable-trace-backends=simple ${qemu_sdl}' \\
|
|
V='${v}' \\
|
|
${extra_make_args} \
|
|
all \\
|
|
"
|
|
"${root_dir}/eeval" "$cmd" "${out_arch_dir}/build.sh"
|