archlinux-s390x/scripts/build-arch-kernel.sh

155 lines
4 KiB
Bash
Raw Normal View History

2025-06-02 15:52:32 -04:00
#!/bin/bash
# Build Arch Linux kernel for s390x using PKGBUILD system
set -e
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
ARCH_KERNEL_DIR="$PROJECT_ROOT/arch-kernel"
BUILD_DIR="$PROJECT_ROOT/build-kernel"
OUTPUT_DIR="$PROJECT_ROOT/output"
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
echo -e "${GREEN}=== Building Arch Linux kernel for s390x ===${NC}"
# Create directories
mkdir -p "$BUILD_DIR" "$OUTPUT_DIR"
# Check if we have the PKGBUILD
if [ ! -f "$ARCH_KERNEL_DIR/PKGBUILD-s390x" ]; then
echo -e "${RED}Error: PKGBUILD-s390x not found!${NC}"
echo "Please run from the project root directory"
exit 1
fi
# Create build environment inside container
cat > "$BUILD_DIR/build-arch-kernel-container.sh" << 'EOF'
#!/bin/bash
set -e
# Setup colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
# Install required build dependencies
echo -e "${YELLOW}Installing build dependencies...${NC}"
dnf install -y \
bc \
bison \
cpio \
flex \
gettext \
elfutils-libelf-devel \
openssl-devel \
perl \
python3 \
rsync \
tar \
xz \
zstd \
gcc-s390x-linux-gnu \
binutils-s390x-linux-gnu \
wget \
patch \
diffutils \
make || {
echo -e "${RED}Failed to install dependencies${NC}"
exit 1
}
# Setup build directory
cd /work/arch-kernel
BUILD_DIR="/tmp/makepkg"
mkdir -p "$BUILD_DIR"
# Copy PKGBUILD and config
cp PKGBUILD-s390x "$BUILD_DIR/PKGBUILD"
cp config-s390x "$BUILD_DIR/"
cd "$BUILD_DIR"
# Download sources
echo -e "${YELLOW}Downloading kernel sources...${NC}"
KERNEL_VERSION="6.6.10"
KERNEL_URL="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${KERNEL_VERSION}.tar.xz"
if [ ! -f "linux-${KERNEL_VERSION}.tar.xz" ]; then
wget --no-verbose --show-progress "$KERNEL_URL" || {
echo -e "${RED}Failed to download kernel${NC}"
exit 1
}
fi
# Extract and prepare sources
echo -e "${YELLOW}Extracting kernel source...${NC}"
if [ ! -d "linux-${KERNEL_VERSION}" ]; then
tar -xf "linux-${KERNEL_VERSION}.tar.xz"
fi
# Setup cross-compilation environment
export ARCH=s390
export CROSS_COMPILE=s390x-linux-gnu-
# Enter kernel directory
cd "linux-${KERNEL_VERSION}"
# Apply s390x config
echo -e "${YELLOW}Configuring kernel for s390x...${NC}"
cp ../config-s390x .config
make olddefconfig
# Show kernel version
echo -e "${GREEN}Building kernel version: $(make -s kernelrelease)${NC}"
# Build kernel
echo -e "${YELLOW}Building kernel (this will take a while)...${NC}"
make -j$(nproc) bzImage || {
echo -e "${RED}Kernel build failed${NC}"
exit 1
}
# Build modules (optional, can be slow)
echo -e "${YELLOW}Building kernel modules...${NC}"
make -j$(nproc) modules || {
echo -e "${YELLOW}Warning: Module build failed, continuing without modules${NC}"
}
# Copy kernel image
echo -e "${YELLOW}Copying output files...${NC}"
cp -v arch/s390/boot/bzImage "/work/output/vmlinuz-${KERNEL_VERSION}-s390x-arch"
cp -v System.map "/work/output/System.map-${KERNEL_VERSION}-s390x-arch"
cp -v .config "/work/output/config-${KERNEL_VERSION}-s390x-arch"
# Create kernel info file
cat > /work/output/kernel-info-arch.txt << EOFINFO
Kernel Version: ${KERNEL_VERSION}-s390x-arch
Architecture: s390x
Build Date: $(date)
Build Method: Arch Linux kernel configuration for s390x
Kernel Config: Based on Arch Linux defaults + s390x hardware support
EOFINFO
echo -e "${GREEN}✓ Arch Linux kernel build complete!${NC}"
EOF
chmod +x "$BUILD_DIR/build-arch-kernel-container.sh"
# Run the build in container
echo -e "${YELLOW}Running build in container (requires sudo)...${NC}"
sudo podman run --rm \
-v "$PROJECT_ROOT:/work" \
-w /work \
s390x-archlinux-dev \
/work/build-kernel/build-arch-kernel-container.sh
echo -e "${GREEN}✓ Arch Linux kernel for s390x built successfully!${NC}"
echo -e "${GREEN}Output files:${NC}"
ls -la "$OUTPUT_DIR/"*-arch* 2>/dev/null || echo "No Arch kernel files found yet"