From d278615addfb1cd4b1383930e4175cdf52df257c Mon Sep 17 00:00:00 2001
From: Daniel Hilst <392820+dhilst@users.noreply.github.com>
Date: Thu, 2 Jul 2026 10:11:51 -0300
Subject: [PATCH] feat(mockbuild-all): import x86-only noarch deps into the ppc
dep repo
xCAT Requires xnba-undi and grub2-xcat on every arch, but they only build on x86_64
(xnba-undi is an x86 UNDI netboot ROM; grub2-xcat wraps the distro grub2). Since both
are noarch, a ppc build now imports them from a built x86_64 dep repo via the new
--import-noarch-repo
. Both are added to the required-deps assertion (with a hint
to pass --import-noarch-repo on non-x86_64 builds), so an incomplete dep repo fails at
build time instead of at xCAT install time.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
---
mockbuild-all.pl | 45 +++++++++++++++++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 6 deletions(-)
diff --git a/mockbuild-all.pl b/mockbuild-all.pl
index 807da26..eab7742 100755
--- a/mockbuild-all.pl
+++ b/mockbuild-all.pl
@@ -36,6 +36,7 @@ my $repo_dep = '';
my $gpg_sign = 0;
my $gpg_key_name = 'xCAT Automatic Signing Key';
my $gpg_home = '';
+my $import_noarch_repo = '';
GetOptions(
'repo-root=s' => \$repo_root,
@@ -45,6 +46,7 @@ GetOptions(
'gpg-sign!' => \$gpg_sign,
'gpg-key-name=s' => \$gpg_key_name,
'gpg-home=s' => \$gpg_home,
+ 'import-noarch-repo=s' => \$import_noarch_repo,
'target=s' => \$target,
'nproc=i' => \$nproc,
'parallel-builds=i' => \$parallel_builds,
@@ -491,6 +493,7 @@ sub deploy_target {
copy($rpm, "$dest/" . basename($rpm))
or die "Failed to copy $rpm -> $dest: $!\n";
}
+ import_shared_noarch($dest);
assert_required_deps($dest);
sign_and_index_repo($dest);
write_dep_repo_metadata($dest, $rel);
@@ -585,6 +588,9 @@ Options:
--gpg-sign Sign rpms + repomd.xml of each per-EL repo
--gpg-key-name NAME GPG key name (default: "xCAT Automatic Signing Key")
--gpg-home PATH GNUPGHOME for signing (default: system keyring)
+ --import-noarch-repo DIR On a non-x86_64 build, import the noarch xnba-undi/grub2-xcat
+ rpms (x86_64-only-built, but required by xCAT on ppc) from this
+ already-built x86_64 dep repo dir
--target NAME Build only this target (+epel--); default is
the host arch across rh8, rh9 and rh10
--nproc N Parallel jobs for buildrpms.pl (default: 1)
@@ -763,19 +769,46 @@ sub have_rpm {
return scalar(@m) > 0;
}
+# Noarch deps that xCAT Requires on EVERY arch but that only build on x86_64: xnba-undi is an
+# x86 UNDI network-boot ROM, and grub2-xcat wraps the distro grub2 (its src.rpm/tooling is
+# x86-centric). Because they are noarch (arch-independent), a ppc build imports them from a
+# built x86_64 dep repo (--import-noarch-repo) rather than rebuilding them.
+my @SHARED_NOARCH = qw(xnba-undi grub2-xcat);
+sub import_shared_noarch {
+ my ($dest) = @_;
+ return if $arch eq 'x86_64'; # x86 builds these natively
+ return if $import_noarch_repo eq ''; # nothing to import from
+ for my $name (@SHARED_NOARCH) {
+ next if have_rpm($dest, $name);
+ my ($src) = grep { /\.noarch\.rpm$/ } glob("$import_noarch_repo/${name}-*.rpm");
+ if ($src) {
+ copy($src, "$dest/" . basename($src))
+ or die "Failed to import $src -> $dest: $!\n";
+ print "[deps] imported shared noarch $name from $import_noarch_repo\n";
+ }
+ else {
+ warn "WARN: shared noarch $name not found under --import-noarch-repo $import_noarch_repo\n";
+ }
+ }
+}
+
# assert_required_deps: the per-EL dep repo is unusable without these, so a MISSING one is
# fatal even though individual builder failures are tolerated above. genesis-base is required
# unless --skip-genesis. (grub2-xcat/elilo/xnba are arch/EL-specific and NOT in the hard set.)
sub assert_required_deps {
my ($dir) = @_;
- # cross-arch required set; syslinux-xcat is the x86 PXE bootloader (x86-only, cannot build
- # on ppc64le). grub2-xcat (ppc netboot) and xnba-undi (x86) are NOT in the hard set --
- # grub2's upstream src.rpm currently 404s, so it is sourced from the published repo.
- my @req = qw(ipmitool-xcat perl-IO-Stty perl-HTTP-Async perl-Net-HTTPS-NB);
- push @req, 'syslinux-xcat' if $arch eq 'x86_64';
+ # xCAT Requires all of these on every arch. ipmitool-xcat/syslinux-xcat/perl-* and
+ # genesis-base build on both arches; grub2-xcat/xnba-undi build on x86_64 and are imported
+ # into a ppc repo by import_shared_noarch (run just before this check).
+ my @req = qw(ipmitool-xcat syslinux-xcat grub2-xcat xnba-undi
+ perl-IO-Stty perl-HTTP-Async perl-Net-HTTPS-NB);
push @req, 'xCAT-genesis-base' unless $skip_genesis;
my @missing = grep { !have_rpm($dir, $_) } @req;
- die "FATAL: required deps missing from $dir: @missing\n" if @missing;
+ die "FATAL: required deps missing from $dir: @missing\n"
+ . ($arch ne 'x86_64' && !$import_noarch_repo
+ ? " (pass --import-noarch-repo to import xnba-undi/grub2-xcat)\n"
+ : '')
+ if @missing;
print "[deps] required set present in $dir: @req\n";
}