diff --git a/build.py b/build.py index 8e66dd0..488aaa6 100755 --- a/build.py +++ b/build.py @@ -12,6 +12,7 @@ from utils.generate_spec import generate_spec_file from utils.kernel import clone_kernel, make_kernel_tar from utils.uboot import build_uboot from utils.patch import apply_uboot_patches, apply_kernel_patches +from utils.rpmbuild import run_rpmbuild BASE_DIR = os.getcwd() @@ -52,6 +53,12 @@ def main(): clone_kernel(TMP_DIR, BASE_DIR, config, vendor, device, kernel_dir) kernel_rpm_dir = os.path.join(TMP_DIR, vendor, device, "kernel-build") make_kernel_tar(kernel_dir, kernel_rpm_dir) + # Call rpmbuild to build the kernel RPM + try: + run_rpmbuild(kernel_rpm_dir, arch) + except Exception as e: + print(f"Failed to build RPM: {e}") + sys.exit(1) else: print("Skipping kernel build.") diff --git a/utils/kernel.template b/utils/kernel.template index fc9577a..860728b 100644 --- a/utils/kernel.template +++ b/utils/kernel.template @@ -25,7 +25,7 @@ grep -Irl /lib/modules | xargs sed -i -e 's,/lib/modules,%{_modulesdir},g' -e 's %build {MAKE_DEFCONFIG} -%make_build CROSS_COMPILE=/usr/bin/{ARCH}-linux-gnu- ARCH={KERNEL_ARCH} +%make_build -s CROSS_COMPILE=/usr/bin/{ARCH}-linux-gnu- ARCH={KERNEL_ARCH} %install # Install kernel modules, if any diff --git a/utils/rpmbuild.py b/utils/rpmbuild.py new file mode 100644 index 0000000..b496a01 --- /dev/null +++ b/utils/rpmbuild.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys +import subprocess + + +def run_rpmbuild(kernel_build_dir, target_arch): + """Run rpmbuild for the given kernel build directory and target architecture.""" + # Ensure the kernel-build directory exists + if not os.path.isdir(kernel_build_dir): + print(f"Error: Kernel build directory '{kernel_build_dir}' does not exist.") + sys.exit(1) + + # Change to the kernel-build directory + os.chdir(kernel_build_dir) + + # Check if a spec file exists + spec_files = [f for f in os.listdir(kernel_build_dir) if f.endswith(".spec")] + if not spec_files: + print(f"Error: No spec files found in '{kernel_build_dir}'.") + sys.exit(1) + elif len(spec_files) > 1: + print(f"Warning: Multiple spec files found in '{kernel_build_dir}'. Using '{spec_files[0]}'.") + + # Use the first spec file found + spec_file = spec_files[0] + + # Define paths for RPM build directories + rpmdir = os.path.join(kernel_build_dir, "RPMS") + builddir = os.path.join(kernel_build_dir, "BUILD") + os.makedirs(rpmdir, exist_ok=True) + os.makedirs(builddir, exist_ok=True) + + # Construct the rpmbuild command + rpmbuild_command = [ + "rpmbuild", "-ba", + f"--target={target_arch}", + f"--define", f"_sourcedir {kernel_build_dir}", + f"--define", f"_rpmdir {rpmdir}", + f"--define", f"_builddir {builddir}", + spec_file + ] + + # Run the rpmbuild command + try: + print(f"Running rpmbuild for spec file: {spec_file} with target architecture: {target_arch}") + #subprocess.run(rpmbuild_command, check=True) + subprocess.run( + rpmbuild_command, + stdin=subprocess.DEVNULL, # Отключение ввода + stdout=sys.stdout, # Вывод в стандартный поток + stderr=sys.stderr, # Вывод ошибок + check=True + ) + print(f"RPM build completed successfully. RPMs are located in: {rpmdir}") + except subprocess.CalledProcessError as e: + print(f"Error: rpmbuild failed with error code {e.returncode}") + sys.exit(1) + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: rpmbuild.py ") + sys.exit(1) + + kernel_build_dir = sys.argv[1] + target_arch = sys.argv[2] + run_rpmbuild(kernel_build_dir, target_arch)