uboot: (firmwareOdroidC2/C4) don't invoke patch tool, use patches = [] instead

https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh#L948
this can do it nicely.

Signed-off-by: Anton Arapov <anton@deadbeef.mx>
This commit is contained in:
Anton Arapov 2021-04-03 12:58:10 +02:00 committed by Alan Daniels
commit 56de2bcd43
30691 changed files with 3076956 additions and 0 deletions

View file

@ -0,0 +1,180 @@
use strict;
use Dpkg::Control;
use Dpkg::Deps;
use File::Basename;
my $packagesFile = shift @ARGV;
my $urlPrefix = shift @ARGV;
my @toplevelPkgs = @ARGV;
my %packages;
# Parse the Packages file.
open PACKAGES, "<$packagesFile" or die;
while (1) {
my $cdata = Dpkg::Control->new(type => CTRL_INFO_PKG);
last if not $cdata->parse(\*PACKAGES, $packagesFile);
die unless defined $cdata->{Package};
#print STDERR $cdata->{Package}, "\n";
$packages{$cdata->{Package}} = $cdata;
}
close PACKAGES;
# Flatten a Dpkg::Deps dependency value into a list of package names.
sub getDeps {
my $deps = shift;
#print "$deps\n";
if ($deps->isa('Dpkg::Deps::AND')) {
my @res = ();
foreach my $dep ($deps->get_deps()) {
push @res, getDeps($dep);
}
return @res;
} elsif ($deps->isa('Dpkg::Deps::OR')) {
# Arbitrarily pick the first alternative.
return getDeps(($deps->get_deps())[0]);
} elsif ($deps->isa('Dpkg::Deps::Simple')) {
return ($deps->{package});
} else {
die "unknown dep type";
}
}
# Process the "Provides" and "Replaces" fields to be able to resolve
# virtual dependencies.
my %provides;
foreach my $cdata (sort {$a->{Package} cmp $b->{Package}} (values %packages)) {
if (defined $cdata->{Provides}) {
my @provides = getDeps(Dpkg::Deps::deps_parse($cdata->{Provides}));
foreach my $name (@provides) {
#die "conflicting provide: $name\n" if defined $provides{$name};
#warn "provide by $cdata->{Package} conflicts with package with the same name: $name\n";
next if defined $packages{$name};
$provides{$name} = $cdata->{Package};
}
}
# Treat "Replaces" like "Provides".
if (defined $cdata->{Replaces}) {
my @replaces = getDeps(Dpkg::Deps::deps_parse($cdata->{Replaces}));
foreach my $name (@replaces) {
next if defined $packages{$name};
$provides{$name} = $cdata->{Package};
}
}
}
# Determine the closure of a package.
my %donePkgs;
my %depsUsed;
my @order = ();
sub closePackage {
my $pkgName = shift;
print STDERR ">>> $pkgName\n";
my $cdata = $packages{$pkgName};
if (!defined $cdata) {
die "unknown (virtual) package $pkgName"
unless defined $provides{$pkgName};
print STDERR "virtual $pkgName: using $provides{$pkgName}\n";
$pkgName = $provides{$pkgName};
$cdata = $packages{$pkgName};
}
die "unknown package $pkgName" unless defined $cdata;
return if defined $donePkgs{$pkgName};
$donePkgs{$pkgName} = 1;
if (defined $cdata->{Provides}) {
foreach my $name (getDeps(Dpkg::Deps::deps_parse($cdata->{Provides}))) {
$provides{$name} = $cdata->{Package};
}
}
my @depNames = ();
if (defined $cdata->{Depends}) {
print STDERR " $pkgName: $cdata->{Depends}\n";
my $deps = Dpkg::Deps::deps_parse($cdata->{Depends});
die unless defined $deps;
push @depNames, getDeps($deps);
}
if (defined $cdata->{'Pre-Depends'}) {
print STDERR " $pkgName: $cdata->{'Pre-Depends'}\n";
my $deps = Dpkg::Deps::deps_parse($cdata->{'Pre-Depends'});
die unless defined $deps;
push @depNames, getDeps($deps);
}
foreach my $depName (@depNames) {
closePackage($depName);
}
push @order, $pkgName;
$depsUsed{$pkgName} = \@depNames;
}
foreach my $pkgName (@toplevelPkgs) {
closePackage $pkgName;
}
# Generate the output Nix expression.
print "# This is a generated file. Do not modify!\n";
print "# Following are the Debian packages constituting the closure of: @toplevelPkgs\n\n";
print "{fetchurl}:\n\n";
print "[\n\n";
# Output the packages in strongly connected components.
my %done;
my %forward;
my $newComponent = 1;
foreach my $pkgName (@order) {
$done{$pkgName} = 1;
my $cdata = $packages{$pkgName};
my @deps = @{$depsUsed{$pkgName}};
foreach my $dep (@deps) {
$dep = $provides{$dep} if defined $provides{$dep};
$forward{$dep} = 1 unless defined $done{$dep};
}
delete $forward{$pkgName};
print " [\n\n" if $newComponent;
$newComponent = 0;
my $origName = basename $cdata->{Filename};
my $cleanedName = $origName;
$cleanedName =~ s/~//g;
print " (fetchurl {\n";
print " url = $urlPrefix/$cdata->{Filename};\n";
print " sha256 = \"$cdata->{SHA256}\";\n";
print " name = \"$cleanedName\";\n" if $cleanedName ne $origName;
print " })\n";
print "\n";
if (keys %forward == 0) {
print " ]\n\n";
$newComponent = 1;
}
}
foreach my $pkgName (@order) {
my $cdata = $packages{$pkgName};
}
print "]\n";
if ($newComponent != 1) {
print STDERR "argh: ", keys %forward, "\n";
exit 1;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,184 @@
use strict;
use XML::Simple;
use List::Util qw(min);
my @packagesFiles = ();
my @urlPrefixes = ();
# rpm-closure.pl (<package-file> <url-prefix>)+ <toplevel-pkg>+
while(-f $ARGV[0]) {
my $packagesFile = shift @ARGV;
my $urlPrefix = shift @ARGV;
push(@packagesFiles, $packagesFile);
push(@urlPrefixes, $urlPrefix);
}
sub rpmvercmp {
my ($version1, $version2) = @_;
my @vercmps1 = split /\./, $version1;
my @vercmps2 = split /\./, $version2;
my $l1 = scalar(@vercmps1);
my $l2 = scalar(@vercmps2);
my $l = min($l1, $l2);
for(my $i=0; $i<$l; $i++) {
my $v1 = $vercmps1[$i];
my $v2 = $vercmps2[$i];
if($v1 =~ /^[0-9]*$/ && $v2 =~ /^[0-9]*$/) {
if ( int($v1) > int($v2) ) {
return 1;
}
elsif ( int($v1) < int($v2) ) {
return -1;
}
} else {
if ( $v1 gt $v2 ) {
return 1;
}
elsif ( $v1 lt $v2 ) {
return -1;
}
}
}
if($l1 == $l2) {
return 0;
} elsif ($l1 > $l2) {
return 1;
} elsif ($l1 < $l2) {
return -1;
}
}
my @toplevelPkgs = @ARGV;
my @archs = split ' ', ($ENV{'archs'} or "");
my %pkgs;
for (my $i = 0; $i < scalar(@packagesFiles); $i++) {
my $packagesFile = $packagesFiles[$i];
print STDERR "parsing packages in $packagesFile...\n";
my $xml = XMLin($packagesFile, ForceArray => ['package', 'rpm:entry', 'file'], KeyAttr => []) or die;
print STDERR "$packagesFile contains $xml->{packages} packages\n";
foreach my $pkg (@{$xml->{'package'}}) {
if (scalar @archs > 0) {
my $arch = $pkg->{arch};
my $found = 0;
foreach my $a (@archs) { $found = 1 if $arch eq $a; }
next if !$found;
}
if (defined $pkgs{$pkg->{name}}) {
my $earlierPkg = $pkgs{$pkg->{name}};
print STDERR "WARNING: duplicate occurrence of package $pkg->{name}\n";
# <version epoch="0" ver="1.28.0" rel="2.el6"/>
my $cmp = rpmvercmp($pkg->{'version'}->{ver}, $earlierPkg->{'version'}->{ver});
if ($cmp > 0 || ($cmp == 0 && rpmvercmp($pkg->{'version'}->{rel}, $earlierPkg->{'version'}->{rel})>0)) {
print STDERR "WARNING: replaced package $pkg->{name} (".$earlierPkg->{'version'}->{ver}." ".$earlierPkg->{'version'}->{rel}.") with newer one (".$pkg->{'version'}->{ver}." ".$pkg->{'version'}->{rel}.")\n";
$pkg->{urlPrefix} = $urlPrefixes[$i];
$pkgs{$pkg->{name}} = $pkg;
}
next;
}
$pkg->{urlPrefix} = $urlPrefixes[$i];
$pkgs{$pkg->{name}} = $pkg;
}
}
my %provides;
PKG: foreach my $pkgName (sort(keys %pkgs)) {
#print STDERR "looking at $pkgName\n";
my $pkg = $pkgs{$pkgName};
# Skip packages that conflict with a required package.
my $conflicts = $pkg->{format}->{'rpm:conflicts'}->{'rpm:entry'} // [];
foreach my $conflict (@{$conflicts}) {
next if $conflict->{flags} // "" eq "LT" || $conflict->{flags} // "" eq "LE";
#print STDERR " $pkgName conflicts with $conflict->{name}\n";
if (grep { $_ eq $conflict->{name} } @toplevelPkgs) {
print STDERR "skipping package $pkgName because it conflicts with a required package\n";
next PKG;
}
}
my $provides = $pkg->{format}->{'rpm:provides'}->{'rpm:entry'} or die;
foreach my $req (@{$provides}) {
#print STDERR " $pkgName provides $req->{name}\n";
#die "multiple provides for $req->{name}" if defined $provides{$req->{name}};
$provides{$req->{name}} = $pkgName;
}
if (defined $pkg->{format}->{file}) {
foreach my $file (@{$pkg->{format}->{file}}) {
#print STDERR " provides file $file\n";
$provides{$file} = $pkgName;
}
}
}
my %donePkgs;
my @needed = ();
sub closePackage {
my $pkgName = shift;
return if defined $donePkgs{$pkgName};
$donePkgs{$pkgName} = 1;
print STDERR ">>> $pkgName\n";
my $pkg = $pkgs{$pkgName} or die "package $pkgName doesn't exist";
my $requires = $pkg->{format}->{'rpm:requires'}->{'rpm:entry'} || [];
my @deps = ();
foreach my $req (@{$requires}) {
next if $req->{name} =~ /^rpmlib\(/;
#print STDERR " needs $req->{name}\n";
my $provider = $provides{$req->{name}};
if (!defined $provider) {
print STDERR " WARNING: no provider for $req->{name}\n";
next;
}
#print STDERR " satisfied by $provider\n";
push @deps, $provider;
}
closePackage($_) foreach @deps;
push @needed, $pkgName;
}
foreach my $pkgName (@toplevelPkgs) {
closePackage $pkgName;
}
# Generate the output Nix expression.
print "# This is a generated file. Do not modify!\n";
print "# Following are the RPM packages constituting the closure of: @toplevelPkgs\n\n";
print "{fetchurl}:\n\n";
print "[\n\n";
foreach my $pkgName (@needed) {
my $pkg = $pkgs{$pkgName};
print " (fetchurl {\n";
print " url = $pkg->{urlPrefix}/$pkg->{location}->{href};\n";
if ($pkg->{checksum}->{type} eq "sha") {
print " sha1 = \"$pkg->{checksum}->{content}\";\n";
} elsif ($pkg->{checksum}->{type} eq "sha256") {
print " sha256 = \"$pkg->{checksum}->{content}\";\n";
} else {
die "unsupported hash type";
}
print " })\n";
print "\n";
}
print "]\n";

View file

@ -0,0 +1,42 @@
with import ../../.. { };
with vmTools;
{
# Run the PatchELF derivation in a VM.
buildPatchelfInVM = runInLinuxVM patchelf;
buildHelloInVM = runInLinuxVM hello;
buildPcmanrmInVM = runInLinuxVM (pcmanfm.overrideAttrs (old: {
# goes out-of-memory with many cores
enableParallelBuilding = false;
}));
testRPMImage = makeImageTestScript diskImages.fedora27x86_64;
buildPatchelfRPM = buildRPM {
name = "patchelf-rpm";
src = patchelf.src;
diskImage = diskImages.fedora27x86_64;
diskImageFormat = "qcow2";
};
testUbuntuImage = makeImageTestScript diskImages.ubuntu1804i386;
buildInDebian = runInLinuxImage (stdenv.mkDerivation {
name = "deb-compile";
src = patchelf.src;
diskImage = diskImages.ubuntu1804i386;
diskImageFormat = "qcow2";
memSize = 512;
postHook = ''
dpkg-query --list
'';
});
}