nixpkgs/pkgs/servers/x11/xorg/generate-expr-from-tarballs.pl
Eelco Dolstra fc483e0d57 * Allow the path to xkbcomp to specified in an environment variable.
The X server by default looks for it under its own prefix, which
  isn't right.  Not being able to run xkbcomp causes the Xkb keyboard
  extension to fail (which incidentally is also the reason why
  Ctrl-Alt-Fn didn't work).

svn path=/nixpkgs/trunk/; revision=8494
2007-03-29 22:57:56 +00:00

247 lines
6.5 KiB
Prolog
Executable file

#! /usr/bin/perl -w
# Typical command to generate the list of tarballs:
# export i="http://mirror.switch.ch/ftp/mirror/X11/pub/X11R7.2/src/everything/"; curl $i | perl -e 'while (<>) { if (/href="([^"]*.bz2)"/) { print "$ENV{'i'}$1\n"; }; }' > tarballs
# manually added xcb tarballs from http://xcb.freedesktop.org/dist/
# then run: perl ./generate-expr-from-tarballs.pl < tarballs
use strict;
my $tmpDir = "/tmp/xorg-unpack";
my $version = "X11R7"; # will be removed from package names
my $version2 = "X11R7\\.\\d"; # will be removed from package names
my %pkgURLs;
my %pkgHashes;
my %pkgNames;
my %pkgRequires;
my %pcMap;
my %extraAttrs;
$pcMap{"freetype2"} = "freetype";
$pcMap{"fontconfig"} = "fontconfig";
$pcMap{"libpng12"} = "libpng";
$pcMap{"libdrm"} = "libdrm";
$pcMap{"libXaw"} = "libXaw";
$pcMap{"zlib"} = "zlib";
$pcMap{"perl"} = "perl";
$pcMap{"mesa"} = "mesa";
$pcMap{"mesaHeaders"} = "mesaHeaders";
$pcMap{"mkfontscale"} = "mkfontscale";
$pcMap{"mkfontdir"} = "mkfontdir";
$pcMap{"bdftopcf"} = "bdftopcf";
$pcMap{"libxslt"} = "libxslt";
$extraAttrs{"xorgserver"} = " mesaSrc = mesa.src; x11BuildHook = ./xorgserver.sh; patches = [./xorgserver-dri-path.patch ./xorgserver-xkbcomp-path.patch]; ";
$extraAttrs{"imake"} = " inherit xorgcffiles; x11BuildHook = ./imake.sh; patches = [./imake.patch]; ";
# Used to avoid the following assertion error:
# java: xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
$extraAttrs{"libxcb"} = " patches = [./xcb_xlib-no-assert-on-lock.patch]; ";
$extraAttrs{"fontmiscmisc"} = " postInstall = \"ln -s \${fontalias}/lib/X11/fonts/misc/fonts.alias \$out/lib/X11/fonts/misc/fonts.alias\"; ";
$extraAttrs{"mkfontdir"} = " preBuild = \"substituteInPlace mkfontdir.cpp --replace BINDIR \${mkfontscale}/bin\"; ";
if (-e "cache") {
open CACHE, "<cache";
while (<CACHE>) {
/^(\S+)\s+(\S+)$/ or die;
$pkgHashes{$1} = $2;
}
close CACHE;
}
while (<>) {
chomp;
my $tarball = "$_";
print "\nDOING TARBALL $tarball\n";
$tarball =~ /\/((?:(?:[A-Za-z0-9]|(?:-[^0-9])|(?:-[0-9]*[a-z]))+))[^\/]*$/;
die unless defined $1;
my $pkg = $1;
$pkg =~ s/-//g;
# next unless $pkg eq "xorgserverX11R7";
# print "$pkg\n";
$pkg =~ s/$version//g if $version ne "";
$tarball =~ /\/([^\/]*)\.tar\.bz2$/;
my $pkgName = $1;
$pkgName =~ s/-$version2//g if $version2 ne "";
print " $pkg $pkgName\n";
if (defined $pkgNames{$pkg}) {
print " SKIPPING\n";
next;
}
$pkgURLs{$pkg} = $tarball;
$pkgNames{$pkg} = $pkgName;
my $maybeHash = $pkgHashes{$pkg};
$maybeHash = "" unless defined $maybeHash;
my ($hash, $path) = `PRINT_PATH=1 QUIET=1 nix-prefetch-url '$tarball' $maybeHash`;
chomp $hash;
chomp $path;
if (!defined $pkgHashes{$pkg}) {
open CACHE, ">>cache";
print CACHE "$pkg $hash\n";
close CACHE;
}
$pkgHashes{$pkg} = $hash;
print "\nunpacking $path\n";
system "rm -rf '$tmpDir'";
mkdir $tmpDir, 0700;
system "cd '$tmpDir' && tar xfj '$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 $file;
{
local $/;
open FOO, "cd '$tmpDir'/* && cat configure.ac |";
$file = <FOO>;
close FOO;
}
if ($file =~ /XAW_CHECK_XPRINT_SUPPORT/) {
push @requires, "libXaw";
}
if ($file =~ /zlib is required/ || $file =~ /AC_CHECK_LIB\(z\,/) {
push @requires, "zlib";
}
if ($file =~ /Perl is required/) {
push @requires, "perl";
}
if ($file =~ /AC_PATH_PROG\(BDFTOPCF/) {
push @requires, "bdftopcf";
}
if ($file =~ /AC_PATH_PROG\(MKFONTSCALE/) {
push @requires, "mkfontscale";
}
if ($file =~ /AC_PATH_PROG\(MKFONTDIR/) {
push @requires, "mkfontdir";
}
if ($file =~ /AC_PATH_PROG\(FCCACHE/) {
# Don't run fc-cache.
die if defined $extraAttrs{$pkg};
$extraAttrs{$pkg} = " preInstall = \"installFlags=(FCCACHE=true)\"; ";
}
sub process {
my $requires = shift;
my $s = shift;
$s =~ s/\[/\ /g;
$s =~ s/\]/\ /g;
$s =~ s/\,/\ /g;
foreach my $req (split / /, $s) {
next if $req eq ">=";
next if $req =~ /^\$/;
next if $req =~ /^[0-9]/;
next if $req =~ /^\s*$/;
print "REQUIRE: $req\n";
push @{$requires}, $req;
}
}
process \@requires, $1 while $file =~ /PKG_CHECK_MODULES\([^,]*,([^\)]*)/g;
process \@requires, $1 while $file =~ /MODULES=\"(.*)\"/g;
process \@requires, $1 while $file =~ /REQUIRED_LIBS=\"(.*)\"/g;
process \@requires, $1 while $file =~ /REQUIRES=\"(.*)\"/g;
process \@requires, $1 while $file =~ /NEEDED=\"(.*)\"/g;
process \@requires, $1 while $file =~ /XORG_DRIVER_CHECK_EXT\([^,]*,([^\)]*)\)/g;
#push @requires, "mesa" if $pkg =~ /xorgserver/ or $pkg =~ /xf86videoi810/;
push @requires, "glproto", "mesaHeaders" if $pkg =~ /xf86videoi810/;
push @requires, "zlib" if $pkg =~ /xorgserver/;
push @requires, "libxslt" if $pkg =~ /libxcb/;
print "REQUIRES @requires => $pkg\n";
$pkgRequires{$pkg} = \@requires;
print "done\n";
}
print "\nWRITE OUT\n";
open OUT, ">default2.nix";
print OUT "";
print OUT <<EOF;
# This is a generated file. Do not edit!
{ stdenv, fetchurl, pkgconfig, freetype, fontconfig
, libxslt, expat, libdrm, libpng, zlib, perl, mesa, mesaHeaders
}:
rec {
EOF
foreach my $pkg (sort (keys %pkgURLs)) {
print "$pkg\n";
my %requires = ();
my $inputs = "";
foreach my $req (sort @{$pkgRequires{$pkg}}) {
if (defined $pcMap{$req}) {
if (!defined $requires{$pcMap{$req}}) {
$inputs .= "$pcMap{$req} ";
$requires{$pcMap{$req}} = 1;
}
} else {
print " NOT FOUND: $req\n";
}
}
my $extraAttrs = $extraAttrs{"$pkg"};
$extraAttrs = "" unless defined $extraAttrs;
print OUT <<EOF
$pkg = (stdenv.mkDerivation {
name = "$pkgNames{$pkg}";
builder = ./builder.sh;
src = fetchurl {
url = $pkgURLs{$pkg};
sha256 = "$pkgHashes{$pkg}";
};
buildInputs = [pkgconfig $inputs];$extraAttrs
}) // {inherit $inputs;};
EOF
}
print OUT "}\n";
close OUT;