|
Bernhard M. Wiedemann |
6ebc4a |
#!/usr/bin/perl
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
use strict;
|
|
Bernhard M. Wiedemann |
6ebc4a |
use warnings;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
use File::Copy;
|
|
Bernhard M. Wiedemann |
6ebc4a |
use Getopt::Long;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $dir = ".";
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $rpmrelease;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $patches="";
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
GetOptions(
|
|
Bernhard M. Wiedemann |
6ebc4a |
"patches=s" => \$patches,
|
|
Bernhard M. Wiedemann |
6ebc4a |
"release=s" => \$rpmrelease
|
|
Bernhard M. Wiedemann |
6ebc4a |
) or die "Usage: $0 [--release <release>] [--patches <dir>]\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# flavor -> [supported archs]
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %flavor_archs = parse_config_conf();
|
|
Bernhard M. Wiedemann |
6ebc4a |
# subset to include in kernel-syms
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %syms_flavor_archs = parse_config_conf("syms");
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %all_archs = parse_config_conf("needs_updating");
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @all_archs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $flavor (keys(%all_archs)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
push(@all_archs, arch2rpm(@{$all_archs{$flavor}}));
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
@all_archs = sort(uniq(@all_archs));
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $all_archs = join(" ", @all_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# template name -> template body
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %templates = read_spec_templates();
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @kmps = read_kmps();
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# config.sh variables
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %vars = parse_config_sh();
|
|
|
17946c |
my ($srcversion, $variant, $obs_build_variant) =
|
|
|
17946c |
($vars{'SRCVERSION'}, $vars{'VARIANT'}, $vars{'OBS_BUILD_VARIANT'});
|
|
|
17946c |
$obs_build_variant = ($obs_build_variant ? $variant : "" );
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $compress_modules = 'none';
|
|
Bernhard M. Wiedemann |
b687c9 |
my $compress_vmlinux = 'gz';
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (defined($vars{'COMPRESS_MODULES'})) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$compress_modules = $vars{'COMPRESS_MODULES'};
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
b687c9 |
if (defined($vars{'COMPRESS_VMLINUX'})) {
|
|
Bernhard M. Wiedemann |
b687c9 |
$compress_vmlinux = $vars{'COMPRESS_VMLINUX'};
|
|
Bernhard M. Wiedemann |
b687c9 |
}
|
|
|
6a054f |
sub detect_false {
|
|
|
6a054f |
my $arg = $_[0];
|
|
|
6a054f |
return "" if not $arg;
|
|
|
6a054f |
return $arg =~ /^(0+|no|none)$/i ? "" : $arg;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
|
6a054f |
my $build_dtbs = detect_false $vars{'BUILD_DTBS'};
|
|
Bernhard M. Wiedemann |
878168 |
my $multibuild = detect_false $vars{'MULTIBUILD'};
|
|
|
6a054f |
my $livepatch = detect_false $vars{'LIVEPATCH'};
|
|
|
6a054f |
my $livepatch_rt = detect_false $vars{'LIVEPATCH_RT'};
|
|
|
6a054f |
sub to_bool {
|
|
|
6a054f |
return detect_false($_[0]) ? 1 : 0 ;
|
|
|
c3597e |
}
|
|
|
6a054f |
my $sb_efi_only = to_bool $vars{'SB_EFI_ONLY'};
|
|
|
6a054f |
my $split_base = to_bool $vars{'SPLIT_BASE'};
|
|
|
6a054f |
my $split_optional = to_bool $vars{'SPLIT_OPTIONAL'};
|
|
|
6a054f |
my $supported_modules_check = to_bool $vars{'SUPPORTED_MODULES_CHECK'};
|
|
|
6a054f |
my $build_pdf = to_bool $vars{'BUILD_PDF'};
|
|
|
6a054f |
my $build_html = to_bool $vars{'BUILD_HTML'};
|
|
|
6a054f |
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!defined ($rpmrelease)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$rpmrelease = $vars{'RELEASE'} || 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# package name -> [summary, description, extra kmp deps]
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %binary_descriptions = parse_descriptions();
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# arch -> flavor -> [obsoleted packages]
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %obsolete_packages = parse_old_flavors();
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
$patches="--patches $patches" if $patches;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $patchversion = `$dir/compute-PATCHVERSION.sh $patches`;
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $patchversion;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $rpmversion = $patchversion;
|
|
Bernhard M. Wiedemann |
6ebc4a |
# stuff the -rcX tag into the rpm version if possible;
|
|
|
2a524c |
$rpmversion =~ s/\.0-rc/~rc/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$rpmversion =~ s/-rc\d+//;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$rpmversion =~ s/-/./g;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
$rpmrelease =~ s/-/./g;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $sources = join("\n", $templates{source} =~ /^Source\d+:[^\n]*/msg);
|
|
|
1d2ab9 |
# Do not include the signature and keyring as source in the binary packages
|
|
|
1d2ab9 |
# The sources are not really included anyway, and for non-upstream tarballs these files do not exist
|
|
|
1d2ab9 |
$sources = join("\n", grep { $_ !~ /[.](?:keyring|tar[.]sign)\s*$/ } $sources =~ /^[^\n]*/msg);
|
|
Bernhard M. Wiedemann |
6ebc4a |
# Find all SourceN: foo.tar.(bz2|xz) lines and generate the NoSource:
|
|
Bernhard M. Wiedemann |
6ebc4a |
# lines and the %setup line
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @tarballs = ($sources =~ /^Source(\d+):[^\n]*\.tar\.(?:bz2|xz)/msg);
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $nosource = $sources;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$nosource =~ s/^Source(\d+):.*?$/NoSource: $1/mg;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# Source0 (the linux tarball) is unpacked manually
|
|
Bernhard M. Wiedemann |
6ebc4a |
@tarballs = grep { $_ > 0 } @tarballs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $unpack_patches = join(" ", map { "-a $_" } @tarballs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
# List of scripts to automatically chmod +x before build
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $scripts = join(",", grep { is_script($_) }
|
|
Bernhard M. Wiedemann |
6ebc4a |
($sources =~ /\nSource\d+:\s*([^\s]*)/mg));
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $tarball_url;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($srcversion =~ /^(\d+)(?:\.\d+)*(-rc\d+)?$/) {
|
|
|
57a832 |
$tarball_url = "https://www.kernel.org/pub/linux/kernel/v$1.x/";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$tarball_url = "" if $2; # kernel.org has no tarballs for rc kernels
|
|
Bernhard M. Wiedemann |
6ebc4a |
# rc tarballs only available from git as https://git.kernel.org/torvalds/t/linux-*.gz
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
# kernel.org has no tarballs for linux-next or vanilla snapshots
|
|
Bernhard M. Wiedemann |
6ebc4a |
$tarball_url = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $commit = get_commit();
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $commit_full = get_commit(1);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %macros = (
|
|
Bernhard M. Wiedemann |
6ebc4a |
VARIANT => $variant,
|
|
|
17946c |
OBS_BUILD_VARIANT => $obs_build_variant . "%{nil}",
|
|
Bernhard M. Wiedemann |
6ebc4a |
SRCVERSION => $srcversion,
|
|
Bernhard M. Wiedemann |
6ebc4a |
PATCHVERSION => $patchversion,
|
|
Bernhard M. Wiedemann |
6ebc4a |
RPMVERSION => $rpmversion,
|
|
Bernhard M. Wiedemann |
6ebc4a |
TARBALL_URL => $tarball_url,
|
|
Bernhard M. Wiedemann |
6ebc4a |
RELEASE => $rpmrelease,
|
|
Bernhard M. Wiedemann |
6ebc4a |
COMMIT => $commit,
|
|
Bernhard M. Wiedemann |
6ebc4a |
COMMIT_FULL => $commit_full,
|
|
|
1d2ab9 |
SOURCES => $sources . "\n# These files are found in the kernel-source package:\n" . $nosource,
|
|
Bernhard M. Wiedemann |
6ebc4a |
UNPACK_PATCHES => $unpack_patches,
|
|
Bernhard M. Wiedemann |
6ebc4a |
SCRIPTS => $scripts,
|
|
Bernhard M. Wiedemann |
6ebc4a |
LIVEPATCH => $livepatch,
|
|
|
c3597e |
LIVEPATCH_RT => $livepatch_rt,
|
|
|
6a054f |
SB_EFI_ONLY => $sb_efi_only,
|
|
|
6a054f |
SPLIT_BASE => $split_base,
|
|
|
6a054f |
SPLIT_OPTIONAL => $split_optional,
|
|
|
6a054f |
SUPPORTED_MODULES_CHECK => $supported_modules_check,
|
|
|
6a054f |
BUILD_PDF => $build_pdf,
|
|
|
6a054f |
BUILD_HTML => $build_html,
|
|
Bernhard M. Wiedemann |
6ebc4a |
YEAR => (localtime time)[5] + 1900,
|
|
Bernhard M. Wiedemann |
6ebc4a |
COMPRESS_MODULES => $compress_modules,
|
|
Bernhard M. Wiedemann |
b687c9 |
COMPRESS_VMLINUX => $compress_vmlinux,
|
|
Bernhard M. Wiedemann |
6ebc4a |
);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# binary spec files
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $kmp_definitions = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @kmp_definitions;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $kmp (@kmps) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my ($summary, $description, $deps);
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!exists($binary_descriptions{$kmp})) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: no description for $kmp found\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
($summary = $kmp) =~ s/-kmp$//;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$summary .= " kernel modules";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$description = "$summary.";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$deps = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$summary = $binary_descriptions{$kmp}->[0];
|
|
Bernhard M. Wiedemann |
6ebc4a |
$description = $binary_descriptions{$kmp}->[1];
|
|
Bernhard M. Wiedemann |
6ebc4a |
$deps = $binary_descriptions{$kmp}->[2];
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
push(@kmp_definitions, expand_template("kmp",
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMP_NAME => $kmp,
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMP_SUMMARY => $summary,
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMP_DESCRIPTION => $description,
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMP_DEPS => $deps));
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$kmp_definitions = join("\n", @kmp_definitions);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $flavor (sort keys(%flavor_archs)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my ($summary, $description);
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!exists($binary_descriptions{"kernel-$flavor"})) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: no description for kernel-$flavor found\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$summary = "The Linux Kernel";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$description = "The Linux Kernel.";
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$summary = $binary_descriptions{"kernel-$flavor"}->[0];
|
|
Bernhard M. Wiedemann |
6ebc4a |
$description = $binary_descriptions{"kernel-$flavor"}->[1];
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %obsolete_macros;
|
|
|
bd7477 |
for my $subpac ("", "-base", "-extra", "-devel", "-hmac", "-optional") {
|
|
Bernhard M. Wiedemann |
6ebc4a |
(my $macro = "PROVIDES_OBSOLETES" . uc($subpac)) =~ s/-/_/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$obsolete_macros{$macro} =
|
|
Bernhard M. Wiedemann |
6ebc4a |
provides_obsoletes($flavor, $subpac, @{$flavor_archs{$flavor}});
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('binary', "kernel-$flavor.spec", %macros,
|
|
Bernhard M. Wiedemann |
6ebc4a |
FLAVOR => $flavor,
|
|
Bernhard M. Wiedemann |
6ebc4a |
SUMMARY => $summary,
|
|
Bernhard M. Wiedemann |
6ebc4a |
DESCRIPTION => $description,
|
|
Bernhard M. Wiedemann |
6ebc4a |
ARCHS => join(" ", arch2rpm(@{$flavor_archs{$flavor}})),
|
|
Bernhard M. Wiedemann |
6ebc4a |
COMMON_DEPS => $templates{common_deps},
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMPS => join(" ", @kmps),
|
|
Bernhard M. Wiedemann |
6ebc4a |
KMP_DEFINITIONS => $kmp_definitions,
|
|
Bernhard M. Wiedemann |
6ebc4a |
%obsolete_macros
|
|
Bernhard M. Wiedemann |
6ebc4a |
);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
# kernel-source.spec
|
|
|
2fdf8f |
do_spec('source', "kernel-source$variant.spec", %macros);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($variant eq "") {
|
|
Bernhard M. Wiedemann |
6ebc4a |
# kernel-docs.spec
|
|
|
2fdf8f |
do_spec('docs', "kernel-docs$variant.spec", %macros);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# kernel-syms.spec
|
|
Bernhard M. Wiedemann |
6ebc4a |
{
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $requires = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %syms_archs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $syms_archs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $flavor (sort keys(%syms_flavor_archs)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if $flavor eq "vanilla";
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @archs = arch2rpm(@{$syms_flavor_archs{$flavor}});
|
|
Bernhard M. Wiedemann |
6ebc4a |
$syms_archs{$_} = 1 for @archs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$requires .= "%ifarch @archs\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$requires .= "Requires: kernel-$flavor-devel = \%version-\%source_rel\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$requires .= "%endif\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $requires;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$syms_archs = join(" ", sort(keys(%syms_archs)));
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (keys(%syms_archs)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('syms', "kernel-syms$variant.spec", %macros,
|
|
Bernhard M. Wiedemann |
6ebc4a |
REQUIRES => $requires,
|
|
Bernhard M. Wiedemann |
6ebc4a |
ARCHS => $syms_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# kernel-obs-*.spec
|
|
|
17946c |
if (!$variant || $obs_build_variant) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @default_archs;
|
|
|
17946c |
my $flavor = $obs_build_variant;
|
|
|
17946c |
if ($flavor) {
|
|
|
17946c |
$flavor =~ s/^-//;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
|
17946c |
$flavor = 'default';
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
|
17946c |
|
|
|
17946c |
@default_archs = arch2rpm(@{$flavor_archs{$flavor}});
|
|
|
5c5b33 |
# No kernel-obs-* for 32bit ppc and x86
|
|
|
5c5b33 |
@default_archs = grep { $_ ne "ppc" && $_ ne '%ix86' } @default_archs;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $default_archs = join(" ", @default_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('obs-build', "kernel-obs-build.spec", %macros,
|
|
Bernhard M. Wiedemann |
6ebc4a |
ARCHS => $default_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('obs-qa', "kernel-obs-qa.spec", %macros,
|
|
Bernhard M. Wiedemann |
6ebc4a |
ARCHS => $default_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# dtb-*.spec
|
|
|
17946c |
if ((!$variant || $obs_build_variant) && $build_dtbs) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('dtb', "dtb.spec.in", %macros);
|
|
Bernhard M. Wiedemann |
6ebc4a |
print "./mkspec-dtb $all_archs\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
system("./mkspec-dtb $all_archs\n");
|
|
Bernhard M. Wiedemann |
6ebc4a |
unlink("$dir/dtb.spec.in");
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($?) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
exit(($? >> 8) || ($? & 127 + 128) || 1);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
copy_changes();
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# _constraints
|
|
Bernhard M. Wiedemann |
6ebc4a |
{
|
|
|
caa07e |
my @packages = map { "<package>kernel-$_</package>\n<package>kernel-source$variant:kernel-$_</package>" } sort keys(%flavor_archs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $packages = join("\n", @packages);
|
|
Bernhard M. Wiedemann |
6ebc4a |
do_spec('constraints', "_constraints",
|
|
|
caa07e |
BINARY_PACKAGES_XML => $packages,
|
|
|
caa07e |
VARIANT => $variant);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
exit 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub parse_config_conf {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @symbols = @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $symbols = join(' ', @symbols);
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $arch (split(/\s+/, `$dir/arch-symbols --list`)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @flavors = `$dir/guards $arch $symbols < $dir/config.conf`;
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if @flavors == 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp @flavors;
|
|
Bernhard M. Wiedemann |
6ebc4a |
@flavors = map { s/.*\///; $_ } @flavors;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $flavor (@flavors) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$flavor} ||= [];
|
|
Bernhard M. Wiedemann |
6ebc4a |
push(@{$res{$flavor}}, $arch);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $flavor (keys(%res)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$flavor} = [sort @{$res{$flavor}}];
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
return %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub read_spec_templates {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $template (qw(binary source syms docs obs-build obs-qa)) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '<', "$dir/kernel-$template.spec.in");
|
|
Bernhard M. Wiedemann |
6ebc4a |
local $/ = undef;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$template} = <$fh>;
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
next unless $template eq "binary";
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($res{$template} =~ /^# BEGIN COMMON DEPS\n?(.*)^# END COMMON DEPS/ms) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{common_deps} = $1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: Expected # BEGIN COMMON DEPS in kernel-binary.spec.in\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{common_deps} = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($res{$template} =~ s/^# BEGIN KMP\n?(.*)^# END KMP/\@KMP_DEFINITIONS\@/ms) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{kmp} = $1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: Expected # BEGIN KMP in kernel-binary.spec.in\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{kmp} = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
{
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '<', "$dir/constraints.in");
|
|
Bernhard M. Wiedemann |
6ebc4a |
local $/ = undef;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{constraints} = <$fh>;
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen($fh, '<', "$dir/dtb.spec.in.in");
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{dtb} = <$fh>;
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
return %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
# return a hash of config.sh variables
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub parse_config_sh {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '<', "$dir/config.sh");
|
|
Bernhard M. Wiedemann |
6ebc4a |
while (<$fh>) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (/^\s*([A-Z_]+)=(.*)/) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my ($key, $val) = ($1, $2);
|
|
Bernhard M. Wiedemann |
6ebc4a |
$val =~ s/^"(.*)"$/$1/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$key} = $val;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
return %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub parse_descriptions {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $current;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $blank = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
# 0 - expect summary, 1 - eating blank lines, 2 - reading description
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $state = 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '<', "$dir/package-descriptions");
|
|
Bernhard M. Wiedemann |
6ebc4a |
while (<$fh>) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if /^\s*#/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (/^==+\s+([^\s]+)\s+==+\s*$/) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $package = $1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($current) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $current->[1];
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current = ["", "", ""];
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$package} = $current;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$state = 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
next;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (/^$/) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($state == 0) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$state++;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} elsif ($state == 2) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$blank .= $_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
next;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
# non-blank line and not === package ===
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($state == 0) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (s/^Requires: *//) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
# foo-kmp is a shorthand for another kmp
|
|
Bernhard M. Wiedemann |
6ebc4a |
# from the same specfile
|
|
Bernhard M. Wiedemann |
6ebc4a |
s/-kmp/-kmp-%build_flavor = %version-%release/g;
|
|
Bernhard M. Wiedemann |
6ebc4a |
s/^/Requires: /;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($current->[2]) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[2] .= "\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[2] .= $_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
# The Summary: keyword is optional
|
|
Bernhard M. Wiedemann |
6ebc4a |
s/^Summary: *//;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($current->[0]) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: multi-line summary\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[0] = $_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
} elsif ($state == 1) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[1] = $_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$blank = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$state++;
|
|
Bernhard M. Wiedemann |
6ebc4a |
} else {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[1] .= $blank;
|
|
Bernhard M. Wiedemann |
6ebc4a |
$blank = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$current->[1] .= $_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($current) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $current->[1];
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
return %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub read_kmps {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
open(my $fh, '-|', "$dir/guards", "--list", "--with-guards",
|
|
Bernhard M. Wiedemann |
6ebc4a |
"-c", "$dir/supported.conf") or die "Error running guards: $!\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
while (<$fh>) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @guards = split(' ');
|
|
Bernhard M. Wiedemann |
6ebc4a |
pop(@guards);
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $g (@guards) {
|
|
|
7999ff |
if ($g =~ /^(?:\+|-!)(.*-kmp)$/) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$1} = 1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh) or die "Error running guards: $!\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return sort(keys(%res));
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub parse_old_flavors{
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '<', "$dir/old-flavors");
|
|
Bernhard M. Wiedemann |
6ebc4a |
while (<$fh>) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp;
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if /^\s*(#|$)/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!m:^\s*(\w+)/([\w-]+)\s+([\w-]+)\s+([\w.-]+)\s*$:) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "$dir/old-flavors:$.: expected arch/flavor <old flavor> <old version>\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
next;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
my ($arch, $flavor, $old_flavor, $old_version) = ($1, $2, $3, $4);
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$arch} ||= {};
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res{$arch}{$flavor} ||= [];
|
|
Bernhard M. Wiedemann |
6ebc4a |
push(@{$res{$arch}{$flavor}},
|
|
Bernhard M. Wiedemann |
6ebc4a |
["kernel-$old_flavor", $old_version]);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
return %res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub is_script {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $script = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
return undef if $script =~ /\.(tar\.(gz|bz2)|in|conf)$/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
return undef if $script =~ /^README/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
return 1 if $script =~ /\.pl$/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
open(my $fh, '<', $script) or return undef;
|
|
Bernhard M. Wiedemann |
6ebc4a |
sysread($fh, my $shebang, 2);
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
return 1 if $shebang eq "#!";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return undef;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub arch2rpm {
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (wantarray) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
return map { _arch2rpm($_) } @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
return _arch2rpm($_[0]);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub _arch2rpm {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $arch = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
return "\%ix86" if $arch eq "i386";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return "aarch64" if $arch eq "arm64";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return $arch;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub provides_obsoletes {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $flavor = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $subpac = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @archs = @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $res = "";
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $arch (@archs) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my @packs = @{$obsolete_packages{$arch}{$flavor} || []};
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $printed;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if (!@packs);
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $rpmarch = arch2rpm($arch);
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $rpmarch;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $pack (@packs) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $name = $pack->[0] . $subpac;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $version = $pack->[1];
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!$printed) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res .= "\%ifarch $rpmarch\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$printed = 1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res .= "Provides: $name = $version\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res .= "Obsoletes: $name <= $version\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$res .= "\%endif\n" if $printed;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
chomp $res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
return $res;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub get_commit {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my ($commit, $fh, $full);
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
$full = $_[0] // 0;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!open($fh, '<', "source-timestamp")) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: source-timestamp: $!\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: Cannot determine commit id\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return "0000000";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
while (<$fh>) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($full ? /^GIT Revision: ([0-9a-f]{40})/ : /^GIT Revision: ([0-9a-f]{7})/) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$commit = $1;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
if (!$commit) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
print STDERR "warning: Commit id missing in source-timestamp file\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
return "0000000";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
return $commit;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub expand_template {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $template = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %macros = @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $text = $templates{$template};
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $prev_text;
|
|
Bernhard M. Wiedemann |
6ebc4a |
do {
|
|
Bernhard M. Wiedemann |
6ebc4a |
$prev_text = $text;
|
|
Bernhard M. Wiedemann |
6ebc4a |
for my $m (keys %macros) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
if ($macros{$m} eq "") {
|
|
Bernhard M. Wiedemann |
6ebc4a |
# Do not generate empty lines
|
|
Bernhard M. Wiedemann |
6ebc4a |
$text =~ s/^\@$m\@\n//mg;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
$text =~ s/\@$m\@/$macros{$m}/g;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
} while ($prev_text ne $text);
|
|
Bernhard M. Wiedemann |
6ebc4a |
return $text;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub do_spec {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $template = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $specfile = shift;
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %macros = @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
my $text = expand_template($template, %macros);
|
|
Bernhard M. Wiedemann |
6ebc4a |
print "$specfile\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
xopen(my $fh, '>', "$dir/$specfile");
|
|
Bernhard M. Wiedemann |
6ebc4a |
print $fh $text;
|
|
Bernhard M. Wiedemann |
6ebc4a |
close($fh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub copy_changes {
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
opendir(my $dh, $dir) or die "$dir: $!\n";
|
|
Bernhard M. Wiedemann |
878168 |
xopen(my $fh, '>', "$dir/_multibuild") if $multibuild;
|
|
Bernhard M. Wiedemann |
878168 |
print $fh "<multibuild>\n" if $fh;
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
|
786718 |
foreach my $name (sort readdir $dh) {
|
|
Bernhard M. Wiedemann |
6ebc4a |
next unless $name =~ /\.spec$/;
|
|
Bernhard M. Wiedemann |
6ebc4a |
next if $name eq "kernel-source$variant.spec";
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
878168 |
$name =~ s/\.spec$//;
|
|
Bernhard M. Wiedemann |
878168 |
copy("$dir/kernel-source$variant.changes", "$dir/$name.changes");
|
|
Bernhard M. Wiedemann |
878168 |
print $fh "\t<package>$name</package>\n" if $fh;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
878168 |
print $fh "</multibuild>\n" if $fh;
|
|
Bernhard M. Wiedemann |
878168 |
close($fh) if $fh;
|
|
Bernhard M. Wiedemann |
6ebc4a |
closedir($dh);
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub xopen {
|
|
Bernhard M. Wiedemann |
6ebc4a |
open($_[0], $_[1], $_[2]) or die "$_[2]: $!\n";
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|
|
Bernhard M. Wiedemann |
6ebc4a |
|
|
Bernhard M. Wiedemann |
6ebc4a |
sub uniq {
|
|
Bernhard M. Wiedemann |
6ebc4a |
my %seen;
|
|
Bernhard M. Wiedemann |
6ebc4a |
return grep { !$seen{$_}++ } @_;
|
|
Bernhard M. Wiedemann |
6ebc4a |
}
|