mirror of
https://github.com/sched-ext/scx.git
synced 2024-11-25 04:00:24 +00:00
Add script for generating per-arch vmlinux.h files
This script iterates over a list archs and generates vmlinux.h for each. Generated files are put under the corresponding arch directory Signed-off-by: Ming Yang <minos.future@gmail.com>
This commit is contained in:
parent
fdca0c04ed
commit
1425ab67ed
112
scripts/gen_vmlinux_h.sh
Executable file
112
scripts/gen_vmlinux_h.sh
Executable file
@ -0,0 +1,112 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Prerequisite
|
||||
#
|
||||
# * .config is ready in the linux repo
|
||||
# * binary bpftool is installed
|
||||
# * can `sudo apt install` cross-compile toolchains
|
||||
#
|
||||
# Example
|
||||
#
|
||||
# ./scripts/gen_vmlinux_h.sh /path/to/linux ./sched/include/arch/
|
||||
|
||||
LINUX_REPO="$1" # where the linux repo is located
|
||||
pushd ${LINUX_REPO}
|
||||
INCLUDE_TARGET=$2 # target directory, e.g., /path/to/scx/sched/include/arch/
|
||||
HASH=$(git rev-parse HEAD)
|
||||
SHORT_SHA=${HASH:0:12} # full SHA of the commit truncated to 12 chars
|
||||
LINUX_VER=$(git describe --tags --abbrev=0)
|
||||
|
||||
# List of architectures and their corresponding cross-compilers
|
||||
declare -A ARCHS
|
||||
ARCHS=(
|
||||
[x86]="x86_64-linux-gnu-"
|
||||
[arm]="arm-linux-gnueabi-"
|
||||
[arm64]="aarch64-linux-gnu-"
|
||||
[mips]="mips64-linux-gnu-"
|
||||
[powerpc]="powerpc64le-linux-gnu-"
|
||||
[riscv]="riscv64-linux-gnu-"
|
||||
[s390]="s390x-linux-gnu-"
|
||||
)
|
||||
|
||||
# Detect and install cross-compile toolchains based on the package manager
|
||||
install_toolchains() {
|
||||
echo "Installing cross-compile toolchains..."
|
||||
|
||||
if command -v apt &> /dev/null; then
|
||||
sudo apt update && sudo apt install -y \
|
||||
gcc-aarch64-linux-gnu gcc-x86-64-linux-gnu \
|
||||
gcc-arm-linux-gnueabi gcc-mips64-linux-gnuabi64 \
|
||||
gcc-powerpc64le-linux-gnu gcc-riscv64-linux-gnu \
|
||||
gcc-s390x-linux-gnu
|
||||
elif command -v dnf &> /dev/null; then
|
||||
sudo dnf install -y \
|
||||
gcc-aarch64-linux-gnu gcc-x86_64-linux-gnu \
|
||||
gcc-arm-linux-gnu gcc-mips64-linux-gnuabi64 \
|
||||
gcc-powerpc64-linux-gnu gcc-riscv64-linux-gnu \
|
||||
gcc-s390x-linux-gnu
|
||||
elif command -v yum &> /dev/null; then
|
||||
sudo yum install -y \
|
||||
gcc-aarch64-linux-gnu gcc-x86_64-linux-gnu \
|
||||
gcc-arm-linux-gnu gcc-mips64-linux-gnuabi64 \
|
||||
gcc-powerpc64-linux-gnu gcc-riscv64-linux-gnu \
|
||||
gcc-s390x-linux-gnu
|
||||
elif command -v pacman &> /dev/null; then
|
||||
sudo pacman -Sy --noconfirm \
|
||||
aarch64-linux-gnu-gcc x86_64-linux-gnu-gcc \
|
||||
arm-linux-gnueabi-gcc mips64-linux-gnu-gcc \
|
||||
powerpc64le-linux-gnu-gcc riscv64-linux-gnu-gcc \
|
||||
s390x-linux-gnu-gcc
|
||||
elif command -v zypper &> /dev/null; then
|
||||
sudo zypper install -y \
|
||||
gcc-aarch64-linux-gnu gcc-x86_64-linux-gnu \
|
||||
gcc-arm-linux-gnueabi gcc-mips64-linux-gnuabi64 \
|
||||
gcc-powerpc64le-linux-gnu gcc-riscv64-linux-gnu \
|
||||
gcc-s390x-linux-gnu
|
||||
else
|
||||
echo "Unsupported package manager. Please install cross-compilers manually."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to compile the kernel and generate vmlinux.h for a given architecture
|
||||
generate_vmlinux_for_arch() {
|
||||
ARCH=$1
|
||||
CROSS_COMPILE=${ARCHS[$ARCH]}
|
||||
TARGET_DIR=${INCLUDE_TARGET}/${ARCH}
|
||||
OUTPUT_FILE="${TARGET_DIR}/vmlinux-${LINUX_VER}-g${SHORT_SHA}.h"
|
||||
mkdir -p ${TARGET_DIR}
|
||||
|
||||
LOG="/tmp/${ARCH}.log"
|
||||
echo "" > ${LOG}
|
||||
echo "Writing compile logs to ${LOG}"
|
||||
|
||||
make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig 2>&1 >> ${LOG}
|
||||
make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -j$(nproc) vmlinux 2>&1 >> ${LOG}
|
||||
|
||||
if [ -f ./vmlinux ]; then
|
||||
echo "Generating ${OUTPUT_FILE}..."
|
||||
bpftool btf dump file ./vmlinux format c > "${OUTPUT_FILE}"
|
||||
echo "${OUTPUT_FILE} generated successfully."
|
||||
else
|
||||
echo "Failed to generate vmlinux for ${ARCH}. Please check the compilation process."
|
||||
fi
|
||||
}
|
||||
|
||||
if ! command -v bpftool &> /dev/null
|
||||
then
|
||||
echo "bpftool could not be found. Please install it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
install_toolchains
|
||||
|
||||
echo "Start generating vmlinux.h for each arch: "
|
||||
for ARCH in "${!ARCHS[@]}"; do
|
||||
echo "Processing architecture: $ARCH"
|
||||
generate_vmlinux_for_arch $ARCH
|
||||
done
|
||||
|
||||
echo "All architectures processed."
|
||||
|
||||
popd
|
Loading…
Reference in New Issue
Block a user