mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-13 20:12:26 +00:00
This is cleaner as it removes yet another .gitignore rule and allows for one command per arch. This was prompted by the recent Docker patch creating files as root, which then breaks future host runs. Also separate all arguments by newlines. This: - makes it much easier to minimize when reporting QEMU bugs - shows the full command on the screen despite line wrapping being turned off by one of the annoying emulators, to be investigated. The commands are not yet pristine, because: - there are some leading spaces - options not sorted but it is already a huge improvement, and those operations are now be easy from Vim. The general strategy is: - end every variable containing a command with a newline - when expanding such variables, don't add an extra newline
192 lines
5.0 KiB
Bash
Executable File
192 lines
5.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eu
|
|
. common
|
|
set -- ${cli_build:-} "$@"
|
|
rm -f br2_cli.gitignore
|
|
touch br2_cli.gitignore
|
|
configure=true
|
|
config_fragments=br2
|
|
extra_make_args=
|
|
gem5=false
|
|
j="$(nproc)"
|
|
linux_reconfigure=false
|
|
linux_kernel_custom_config_file=
|
|
post_script_args=
|
|
qemu_sdl='--enable-sdl --with-sdlabi=2.0'
|
|
v=0
|
|
while getopts 'a:B:b:CGgj:hIiK:klp:qSv' OPT; do
|
|
case "$OPT" in
|
|
a)
|
|
arch="$OPTARG"
|
|
;;
|
|
b)
|
|
config_fragments="$config_fragments $OPTARG"
|
|
;;
|
|
B)
|
|
echo "$OPTARG" >> br2_cli.gitignore
|
|
;;
|
|
C)
|
|
configure=false
|
|
;;
|
|
G)
|
|
extra_make_args="${extra_make_args} gem5-reconfigure \\
|
|
"
|
|
gem5=true
|
|
;;
|
|
g)
|
|
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.gitignore
|
|
;;
|
|
i)
|
|
echo "
|
|
BR2_TARGET_ROOTFS_CPIO=y
|
|
BR2_TARGET_ROOTFS_EXT2=n
|
|
BR2_TARGET_ROOTFS_INITRAMFS=n
|
|
" >> br2_cli.gitignore
|
|
;;
|
|
j)
|
|
echo "$OPTARG" >> br2_cli.gitignore
|
|
;;
|
|
K)
|
|
linux_kernel_custom_config_file="$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=
|
|
;;
|
|
v)
|
|
v=1
|
|
;;
|
|
?)
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
extra_make_args="${extra_make_args} $@"
|
|
set_common_vars "$arch" "$gem5"
|
|
config_file="${buildroot_out_dir}/.config"
|
|
case "$arch" in
|
|
x86_64)
|
|
defconfig=qemu_x86_64_defconfig
|
|
;;
|
|
arm)
|
|
defconfig=qemu_arm_versatile_defconfig
|
|
;;
|
|
aarch64)
|
|
defconfig=qemu_aarch64_virt_defconfig
|
|
;;
|
|
mips64)
|
|
defconfig=qemu_mips64r6_malta_defconfig
|
|
;;
|
|
esac
|
|
if ! "$gem5"; then
|
|
config_fragments="$config_fragments br2_qemu"
|
|
fi
|
|
config_fragments="$config_fragments br2_cli.gitignore"
|
|
|
|
# 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}"
|
|
if [ -z "$linux_kernel_custom_config_file" ] && [ ! "$arch" = aarch64 ]; then
|
|
f="../kernel_config_${arch_dir}"
|
|
if [ -f "$f" ]; then
|
|
printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"$f\"\n" >> "${config_file}"
|
|
fi
|
|
fi
|
|
fi
|
|
if [ -n "$linux_kernel_custom_config_file" ]; then
|
|
f="../${linux_kernel_custom_config_file}"
|
|
if [ -f "$f" ]; then
|
|
printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"${f}\"\n" >> "${config_file}"
|
|
if "${linux_reconfigure}"; then
|
|
touch "$f"
|
|
fi
|
|
else
|
|
echo "error: -K: file does not exist: ${linux_kernel_custom_config_file}" 1>&2
|
|
exit 1
|
|
fi
|
|
else
|
|
f=../kernel_config_fragment
|
|
printf "BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"${f}\"\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 "$f"
|
|
fi
|
|
fi
|
|
if [ "$arch" = 'mips64' ]; then
|
|
# Workaround for:
|
|
# http://lists.busybox.net/pipermail/buildroot/2017-August/201053.html
|
|
sed -Ei 's/^BR2_PACKAGE_LINUX_TOOLS_GPIO/BR2_PACKAGE_LINUX_TOOLS_GPIO=n/' "${config_file}"
|
|
fi
|
|
make O="$buildroot_out_dir" olddefconfig
|
|
fi
|
|
|
|
mkdir -p \
|
|
"${gem5_out_dir}" \
|
|
"${qemu_out_dir}" \
|
|
"${p9_dir}" \
|
|
;
|
|
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 --extra-cflags=-DDEBUG_PL061=1 --enable-trace-backends=simple ${qemu_sdl}' \\
|
|
V='${v}' \\
|
|
${extra_make_args} \
|
|
all \\
|
|
"
|
|
echo "$cmd" | tee "${out_arch_dir}/build.sh"
|
|
eval "$cmd"
|