From 3e3a8e0611f35dd905f92afc13b19933d8b8ac48 Mon Sep 17 00:00:00 2001 From: Kyrylo Yatsenko Date: Wed, 29 Apr 2026 22:40:53 +0300 Subject: T8599: Make source packages required and fix them A lot of packages failed to build source package. Stop ignoring source package build errors and fix it. To fix source packages: * Use _.orig.tar.gz naming for source archive. * Get `source_package` and `upstream_version` from changelog using dpkg-parsechangelog utility * Clean build-deps after usage or dpkg-source sees these files as changes relative to upstream. * Add '.github' to --diff-ignore source option --- scripts/package-build/build.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'scripts') diff --git a/scripts/package-build/build.py b/scripts/package-build/build.py index 9f3233f9..535a3d45 100755 --- a/scripts/package-build/build.py +++ b/scripts/package-build/build.py @@ -136,9 +136,26 @@ def build_package(package: list, patch_dir: Path) -> None: if (repo_dir / 'patches'): apply_patches(repo_dir, patch_dir / repo_name) - # Sanitize the commit ID and build a tarball for the package - commit_id_sanitized = package['commit_id'].replace('/', '_') - tarball_name = f"{repo_name}_{commit_id_sanitized}.tar.gz" + # Create original tarball for dpkg-source to be happy + package_version = run(['dpkg-parsechangelog', '--show-field', 'Version', '--file', repo_dir / 'debian/changelog'], capture_output=True, check=False) + if package_version.stdout: + package_version = package_version.stdout.decode().strip() + package_version = package_version.rsplit('-', maxsplit=1)[0] + if ':' in package_version: + package_version = package_version.split(':', maxsplit=1)[1] + else: + # On failure fallback to sanitized commit ID + package_version = package['commit_id'].replace('/', '_') + + package_name = run(['dpkg-parsechangelog', '--show-field', 'Source', '--file', repo_dir / 'debian/changelog'], capture_output=True, check=False) + if package_name.stdout: + package_name = package_name.stdout.decode().strip() + else: + # On failure fallback to repo name + package_name = repo_name + + # Build a tarball for the package + tarball_name = f'{package_name}_{package_version}.orig.tar.gz' run(['tar', '--exclude=.git', '--exclude=.github', '-czf', tarball_name, '-C', str(repo_dir.parent), repo_name], check=True) print(f"I: Tarball created: {tarball_name}") @@ -151,18 +168,18 @@ def build_package(package: list, patch_dir: Path) -> None: try: run('sudo mk-build-deps --install --tool "apt-get --yes --no-install-recommends"', cwd=repo_dir, check=True, shell=True) run('sudo dpkg -i *build-deps*.deb', cwd=repo_dir, check=True, shell=True) + # Clean up or dpkg-source will see this as changes to binary files + cleanup_build_deps(repo_dir) except CalledProcessError as e: print(f"Failed to build package {repo_name}: {e}") # Build the package, check if we have build_cmd in the package.toml try: - build_cmd = package.get('build_cmd', 'dpkg-buildpackage -uc -us -tc -F --source-option=--tar-ignore=.git --source-option=--tar-ignore=.github') + build_cmd = package.get('build_cmd', r'dpkg-buildpackage -uc -us -tc -F --source-option=--tar-ignore=.git --source-option=--tar-ignore=.github --source-option=--extend-diff-ignore="^\.github(?:/.*)?$"') run(build_cmd, cwd=repo_dir, check=True, shell=True) except CalledProcessError as e: - print(e) - print("I: Source packages build failed, ignoring - building binaries only") - build_cmd = package.get('build_cmd', 'dpkg-buildpackage -uc -us -tc -b') - run(build_cmd, cwd=repo_dir, check=True, shell=True) + print(f"E: Package build failed for package '{repo_name}': {e}") + sys.exit(1) except CalledProcessError as e: print(f"Failed to build package {repo_name}: {e}") @@ -176,8 +193,9 @@ def cleanup_build_deps(repo_dir: Path) -> None: """Clean up build dependency packages""" try: if repo_dir.exists(): - for file in glob.glob(str(repo_dir / '*build-deps*.deb')): - os.remove(file) + for suffix in ('deb', 'buildinfo', 'changes'): + for file in glob.glob(str(repo_dir / f'*build-deps*.{suffix}')): + os.remove(file) print("I: Cleaned up build dependency packages") except Exception as e: print(f"Error cleaning up build dependencies: {e}") -- cgit v1.2.3 From 7b0f4ce0625d6cb781727ad67cfc9b3911a8ad58 Mon Sep 17 00:00:00 2001 From: Kyrylo Yatsenko Date: Thu, 11 Jun 2026 14:34:55 +0300 Subject: T8599: Don't ignore other build.py failures Exit with error for other failures: * Creating/installing dependency package should be error: e.g. debugging why strongswan cannot find systemd could be easier if build.py failed when it couldn't install systemd and not when `configure` couldn't find it. * Creating tarball * pre_hook run --- scripts/package-build/build.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/package-build/build.py b/scripts/package-build/build.py index 535a3d45..deac13a3 100755 --- a/scripts/package-build/build.py +++ b/scripts/package-build/build.py @@ -120,8 +120,7 @@ def build_package(package: list, patch_dir: Path) -> None: print(f'I: execute pre_build_hook for the package "{repo_name}"') run(pre_build_hook, cwd=repo_dir, check=True, shell=True) except CalledProcessError as e: - print(e) - print(f"I: pre_build_hook failed for the {repo_name}") + print(f"E: pre_build_hook failed for the {repo_name}") raise # Apply patches if the 'apply_patches' key is set to True (default) in the package configuration @@ -171,18 +170,20 @@ def build_package(package: list, patch_dir: Path) -> None: # Clean up or dpkg-source will see this as changes to binary files cleanup_build_deps(repo_dir) except CalledProcessError as e: - print(f"Failed to build package {repo_name}: {e}") + print(f"E: Failed to create/install dependency package for {repo_name}: {e}") + raise # Build the package, check if we have build_cmd in the package.toml try: - build_cmd = package.get('build_cmd', r'dpkg-buildpackage -uc -us -tc -F --source-option=--tar-ignore=.git --source-option=--tar-ignore=.github --source-option=--extend-diff-ignore="^\.github(?:/.*)?$"') + build_cmd = package.get('build_cmd', r'dpkg-buildpackage -uc -us -tc -F --source-option=--tar-ignore=.git --source-option=--tar-ignore=.github --source-option=-i --source-option=--extend-diff-ignore="^\.github(?:/.*)?$"') run(build_cmd, cwd=repo_dir, check=True, shell=True) except CalledProcessError as e: - print(f"E: Package build failed for package '{repo_name}': {e}") - sys.exit(1) + print(f"E: Build command failed for '{repo_name}': {build_cmd}") + raise except CalledProcessError as e: print(f"Failed to build package {repo_name}: {e}") + sys.exit(1) finally: # Clean up repository directory # shutil.rmtree(repo_dir, ignore_errors=True) -- cgit v1.2.3 From 09bf43ea505de68fc1e646148e89d5a688490936 Mon Sep 17 00:00:00 2001 From: Kyrylo Yatsenko Date: Mon, 15 Jun 2026 21:13:11 +0300 Subject: T8599: dropbear binary-only package Patch modifies debian/control and debian/rules, there is no easy way to fix source package creation in such case. As quick solution disable source package build for this package (previously it failed silently) --- scripts/package-build/dropbear/package.toml | 1 + 1 file changed, 1 insertion(+) (limited to 'scripts') diff --git a/scripts/package-build/dropbear/package.toml b/scripts/package-build/dropbear/package.toml index a00aad3d..6fe3c7a9 100644 --- a/scripts/package-build/dropbear/package.toml +++ b/scripts/package-build/dropbear/package.toml @@ -2,6 +2,7 @@ name = "dropbear" commit_id = "debian/2022.83-1+deb12u1" scm_url = "https://salsa.debian.org/debian/dropbear.git" +build_cmd = "dpkg-buildpackage -us -uc -tc -b" [dependencies] packages = ["libpam0g-dev"] -- cgit v1.2.3 From c596d7eea261c79822b0730d2056ea64c8e7281f Mon Sep 17 00:00:00 2001 From: Kyrylo Yatsenko Date: Fri, 19 Jun 2026 11:30:19 +0300 Subject: T8599: Use .orig suffix for 3.0 source format only 1.0 source format version needs tarball without '.orig' suffix as described in https://www.man7.org/linux/man-pages/man1/dpkg-source.1.html. Only if debian/source/format exists and contains 3.0, use '.orig' --- scripts/package-build/build.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/package-build/build.py b/scripts/package-build/build.py index deac13a3..d637703e 100755 --- a/scripts/package-build/build.py +++ b/scripts/package-build/build.py @@ -153,8 +153,17 @@ def build_package(package: list, patch_dir: Path) -> None: # On failure fallback to repo name package_name = repo_name + # 1.0 version needs 'native' format - without '.orig' + # 3.0 needs '.orig' + source_format_suffix = '' + if (repo_dir / 'debian/source/format').exists(): + with open(repo_dir / 'debian/source/format') as f: + source_format_version = f.read() + if '3.0' in source_format_version: + source_format_suffix = '.orig' + # Build a tarball for the package - tarball_name = f'{package_name}_{package_version}.orig.tar.gz' + tarball_name = f'{package_name}_{package_version}{source_format_suffix}.tar.gz' run(['tar', '--exclude=.git', '--exclude=.github', '-czf', tarball_name, '-C', str(repo_dir.parent), repo_name], check=True) print(f"I: Tarball created: {tarball_name}") -- cgit v1.2.3