diff options
Diffstat (limited to 'pkgs/servers')
-rwxr-xr-x | pkgs/servers/x11/xorg/generate-expr-from-tarballs.pl | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/pkgs/servers/x11/xorg/generate-expr-from-tarballs.pl b/pkgs/servers/x11/xorg/generate-expr-from-tarballs.pl new file mode 100755 index 000000000000..e5f10bd7d693 --- /dev/null +++ b/pkgs/servers/x11/xorg/generate-expr-from-tarballs.pl @@ -0,0 +1,131 @@ +#! /usr/bin/perl -w + +# Typical command to generate the list of tarballs: +# curl http://nix.cs.uu.nl/dist/tarballs/xorg/ | perl -e 'while (<>) { if (/href="([^"]*.bz2)"/) { print "$1\n"; }; }' > list + +use strict; + +my $baseURL = "http://nix.cs.uu.nl/dist/tarballs/xorg"; + +my $tmpDir = "/tmp/xorg-unpack"; + + +my %pkgURLs; +my %pkgHashes; +my %pkgNames; +my %pkgRequires; + +my %pcMap; + + +$pcMap{"freetype2"} = "freetype"; +$pcMap{"fontconfig"} = "fontconfig"; +$pcMap{"libpng12"} = "libpng"; +$pcMap{"libdrm"} = "libdrm"; + + +while (<>) { + chomp; + my $tarball = "$baseURL/$_"; + print "DOING TARBALL $tarball\n\n"; + + $tarball =~ /\/((?:(?:[A-Za-z0-9]|(?:-[^0-9])|(?:-[0-9]*[a-z]))+))[^\/]*$/; + die unless defined $1; + my $pkg = $1; + $pkg =~ s/-//g; + $pkgURLs{$pkg} = $tarball; +# print "$pkg\n"; + + my ($hash, $path) = `PRINT_PATH=1 QUIET=1 nix-prefetch-url '$tarball'`; + chomp $hash; + chomp $path; + $pkgHashes{$pkg} = $hash; + + $tarball =~ /\/([^\/]*)\.tar\.bz2$/; + $pkgNames{$pkg} = $1; + + print "\nunpacking $path\n"; + system "rm -rf '$tmpDir'"; + mkdir $tmpDir, 0700; + system "cd '$tmpDir' && tar xvfj '$path'"; + die "cannot unpack `$path'" if $? != 0; + print "\n"; + + my $provides = `cd '$tmpDir'/* && ls *.pc.in`; + my @provides2 = split '\n', $provides; + print "PROVIDES @provides2\n\n"; + foreach my $pc (@provides2) { + $pc =~ s/.pc.in//; + die "collission with $pcMap{$pc}" if defined $pcMap{$pc}; + $pcMap{$pc} = $pkg; + } + + my @requires = (); + my %requires = (); + open FOO, "cd '$tmpDir'/* && grep PKG_CHECK_MODULES configure.ac |"; + while (<FOO>) { + if (/PKG_CHECK_MODULES\([^,]*,\s*\[?([^\),\]]*)/) { + foreach my $req (split / /, $1) { + next if $req eq ">="; + next if $req =~ /^\$/; + next if $req =~ /^[0-9]/; + $req =~ s/\[//g; + $req =~ s/\]//g; + if (!defined $requires{$req}) { + push @requires, $req; + $requires{$req} = 1; + } + } + } + } + print "REQUIRES @requires\n"; + $pkgRequires{$pkg} = \@requires; + + print "done\n"; +} + + +print "\nWRITE OUT\n"; + +open OUT, ">out"; + +print OUT ""; +print OUT <<EOF; +# This is a generated file. Do not edit! +{ stdenv, fetchurl, pkgconfig, freetype, fontconfig +, expat, libdrm, libpng +}: + +rec { + +EOF + + +foreach my $pkg (keys %pkgURLs) { + print "$pkg\n"; + + my $inputs = ""; + foreach my $req (@{$pkgRequires{$pkg}}) { + if (defined $pcMap{$req}) { + $inputs .= "$pcMap{$req} "; + } else { + print " NOT FOUND: $req\n"; + } + } + + print OUT <<EOF + $pkg = stdenv.mkDerivation { + name = "$pkgNames{$pkg}"; + src = fetchurl { + url = $pkgURLs{$pkg}; + md5 = "$pkgHashes{$pkg}"; + }; + buildInputs = [pkgconfig $inputs]; + }; + +EOF +} + +print OUT "}\n"; + +close OUT; |