#!/usr/bin/perl

##############################################################################
#  Copyright (C) 2007, 2008 Paulo Cesar Pereira de Andrade.  All Rights Reserved.
#
#  This is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This software is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  Authors:
#	Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
##############################################################################

use Cwd;
use File::Basename;
use Getopt::Std;

use strict;


##############################################################################
# Check command line options
my %options;
my $command = "";

# File name to know finished a build with no erros
my $build_ok = "xorg-build.ok";


##############################################################################
# This hash table is used to allow creating aliases to commads
my %commands =
(
 "up"		=> "update",
 "update"	=> "update",
 "co"		=> "checkout",
 "checkout"	=> "checkout",
 "build"	=> "build",
 "clean"	=> "clean",
 "realclean"	=> "realclean",
 "distclean"	=> "distclean",
 "checktars"	=> "checktars",
 "checktarballs"=> "checktars",
 );


##############################################################################
# Check -<letter> options and script command
Getopt::Std::getopts("n:cdgvh?", \%options);
foreach (@ARGV) {
    if ($commands{$_}) {
	# XXX Use other method...
	# Cause an error if more than one command specified...
	$command .= $commands{$_};
    }
    else {
	print(STDERR "* Unknown command $_\n");
    }
}
if (not $commands{$command} or $options{'h'} or $options{'?'}) {
    print(STDERR "Usage:\n",
	  File::Basename::basename($0), " [options ...] command\n",
	  "Options:\n",
	  " -c      Start over update instead of from last failed repository.\n",
	  " -d      Makes a debug build.\n",
	  " -g      Generate dependency files (uses strace).\n",
	  " -v      Verbose mode.\n",
	  " -n name Process only modules with given name.\n",
	  " -h, -?  Prints this message and quits.\n",
	  "Commands:\n",
	  " update         Updates source checkouts.\n",
	  " checkout       Create build directory.\n",
	  " build          Rebuild module.\n",
	  " clean          Only remove $build_ok file.\n",
	  " realclean      Runs \"make clean realclean\".\n",
	  " distclean      Runs \"make clean distclean\".\n",
	  " checktarballs  Checks if package tarball is available upstream.\n",
	  "\n");
    exit(0);
}

# For the moment, check it only once. Required for some fallback default
# value options.
die ("\$ENV{HOME} not set. Cannot continue.") unless ($ENV{HOME} ne "");

# Maybe -W options could be handled differently, but a debug build most
# certainly wants at least these...
$ENV{CFLAGS} = "-O0 -g3 -Wall -Wpointer-arith -Wstrict-prototypes " .
"-Wmissing-prototypes -Wmissing-declarations " .
"-Wnested-externs -fno-strict-aliasing" if ($options{'d'});

# For error messages
$ENV{LC_ALL} = "C";


##############################################################################
# User configuration
sub git_config {
    my ($option) = @_;

    $option = `git-config --global --get $option`;
    $option =~ s/^\s+//;
    $option =~ s/\s+$//;

    return $option;
};

my $xorg_git_protocol = git_config("xorg-git.protocol");
$xorg_git_protocol = "git"
    unless ($xorg_git_protocol ne "");

my $xorg_git_repository = git_config("xorg-git.repository");
$xorg_git_repository = "anongit.freedesktop.org/git"
    unless ($xorg_git_repository ne "");

my $git_user_name = git_config("user.name");
die("* Please run:\n",
    "\tgit-config --global user.name \"Your user name\"\n",
    "before proceeding.")
    unless ($git_user_name ne "");

my $git_user_email = git_config("user.email");
die("* Please run:\n",
    "\tgit-config --global user.email you\@yourdomain.example.com\n",
    "before proceeding.")
    unless ($git_user_email ne "");

# Example: lib or lib64
my $xorg_git_lib_name = git_config("xorg-git.lib-name");
if ($xorg_git_lib_name eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.lib-name name-of-library-path\n");
    }
    # Try to guess proper default
    $xorg_git_lib_name = `uname -m`;
    $xorg_git_lib_name = $xorg_git_lib_name =~ m/64/ ? "lib64" : "lib";
}

# Example: sudo or empty string
my $xorg_git_sudo_command = git_config("xorg-git.sudo-command");
if ($xorg_git_sudo_command eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.sudo-command \"name-of-sudo-command-or-empty-string\"\n");
    }
    # Default to empty string, this should also help in catching attempting
    # to install files outside destdir
    $xorg_git_sudo_command = "";
}

# Example: /home/paulo/anongit.freedesktop.org
my $xorg_git_checkout_dir = git_config("xorg-git.checkout-dir");
if ($xorg_git_checkout_dir eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.checkout-dir /path/to/git/checkout/dir\n");
    }
    $xorg_git_checkout_dir = "$ENV{HOME}/anongit.freedesktop.org";
}

# Example: /home/paulo/anongit.freedesktop.org/build
my $xorg_git_build_dir = git_config("xorg-git.build-dir");
if ($xorg_git_build_dir eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.build-dir /path/to/build/dir\n");
    }
    $xorg_git_build_dir = "$ENV{HOME}/anongit.freedesktop.org/build";
}

# Example: /usr/local/xorg
my $xorg_git_dest_dir = git_config("xorg-git.dest-dir");
if ($xorg_git_dest_dir eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.dest-dir /path/to/install/binaries\n");
    }
    $xorg_git_dest_dir = "/usr/local/xorg";
}

# Example: /usr/local/xorg/deps
my $xorg_git_deps_dir = git_config("xorg-git.deps-dir");
if ($xorg_git_deps_dir eq "") {
    if ($options{'v'}) {
	print(STDERR "* Please consider running:\n",
	      "\tgit-config --global xorg-git.deps-dir /path/to/install/dependencies\n");
    }
    $xorg_git_deps_dir = "/usr/local/xorg/deps";
}

if ($options{'v'}) {
    print(STDERR "Using options:\n",
	  "  xorg-git.protocol     = $xorg_git_protocol\n",
	  "  xorg-git.repository   = $xorg_git_repository\n",
	  "  git_user_name         = $git_user_name\n",
	  "  git_user_email        = $git_user_email\n",
	  "  xorg-git.checkout-dir = $xorg_git_checkout_dir\n",
	  "  xorg-git.build-dir    = $xorg_git_build_dir\n",
	  "  xorg-git.dest-dir     = $xorg_git_dest_dir\n",
	  "  xorg-git.deps-dir     = $xorg_git_deps_dir\n",
	  "  xorg-git.lib-name     = $xorg_git_lib_name\n",
	  "  xorg-git.sudo-command = $xorg_git_sudo_command\n",
	  "\n");
}

# Need these to exist
die("$xorg_git_checkout_dir does not exist.")
    unless (-d $xorg_git_checkout_dir);
die("$xorg_git_build_dir does not exist.")
    unless (-d $xorg_git_build_dir);
die("$xorg_git_dest_dir does not exist.")
    unless (-d $xorg_git_dest_dir);
die("$xorg_git_deps_dir does not exist.")
    unless (-d $xorg_git_deps_dir);

my $xorg_trace_pl = `which xorg-trace.pl`;
chomp($xorg_trace_pl);
if ($options{'g'}) {
    $xorg_trace_pl = "./xorg-trace.pl" unless (-f $xorg_trace_pl);
    die ("$xorg_trace_pl: ($!)") unless (-f $xorg_trace_pl);
    $xorg_trace_pl = "/usr/bin/perl $xorg_trace_pl";
}

my $auto_cache_file = "$xorg_git_dest_dir/.cache";
my $git_last_update = "$xorg_git_checkout_dir/xorg-update.tmp";

$ENV{PKG_CONFIG_PATH} = "$xorg_git_dest_dir/$xorg_git_lib_name/pkgconfig:$ENV{PKG_CONFIG_PATH}";
$ENV{LD_LIBRARY_PATH} = "$xorg_git_dest_dir/$xorg_git_lib_name:$ENV{LD_LIBRARY_PATH}";
$ENV{ACLOCAL_LOCALDIR} = "$xorg_git_dest_dir/share/aclocal";
$ENV{ACLOCAL} = "aclocal -I $ENV{ACLOCAL_LOCALDIR}";

# Don't fail so early on first run :-)
if (not -d $ENV{ACLOCAL_LOCALDIR}) {
    x_system("$xorg_git_sudo_command mkdir -p $ENV{ACLOCAL_LOCALDIR}");
}

$ENV{PATH} = "$xorg_git_dest_dir/bin:$ENV{PATH}";


##############################################################################
# List of modules. Note that it is stored as a list also to allow proper
# specification of order of packages that must be updated first.
# Fields are:
#	name		-> Name of module (also directory to append to path)
#	path		-> Pathname in git repository
#	configure	-> Extra configure/autogen.sh parameters
#	version		-> Module version
#	commit		-> If defined, build this commit/tag/branch
#			   use with care...
#	tarball		-> URL for tarball of module. This usually
#			   is the official tarball of the module
#	skip		-> Don't attempt to build this module

#xedit
my $ac_noxprint	  = "--disable-xprint";

# libX11
my $ac_xcb	  = "--with-xcb=yes";

# xserver
my $ac_buildaddr  = "--with-builder-addr=$git_user_email";
my $ac_mesapath	  = "--with-mesa-source=$xorg_git_build_dir/mesa/mesa";
my $ac_dga	  = "--enable-dga";
my $ac_dmx	  = "--enable-dmx";
my $ac_fontcache  = "--enable-fontcache";
my $ac_glx	  = "--enable-glx";
my $ac_glxtls	  = "--enable-glx-tls";
my $ac_kdrive	  = "--enable-kdrive";
my $ac_kvesa	  = "--enable-kdrive-vesa";
my $ac_xace	  = "--enable-xace";
my $ac_xdmcp	  = "--enable-xdmcp";
my $ac_xdmauth	  = "--enable-xdm-auth-1";
my $ac_xephyr	  = "--enable-xephyr";
my $ac_xegl	  = "--enable-xegl";
my $ac_xf86misc	  = "--enable-xf86misc";
my $ac_xf86vid	  = "--enable-xf86vidmode";
my $ac_xfake	  = "--disable-xfake";
my $ac_xfbdev	  = "--enable-xfbdev";
my $ac_xgl	  = "--disable-xgl";
my $ac_xglx	  = "--enable-xglx";
my $ac_xorg	  = "--enable-xorg";
my $ac_xorgcfg	  = "--enable-xorgcfg";
my $ac_xsdl	  = "--enable-xsdl";
my $ac_xselinux	  = "--disable-xselinux";
my $ac_xvfb	  = "--enable-xvfb";

# mesa
my $ac_mesadriver = "--with-driver=dri";
my $ac_mesadridir = "--with-dri-driverdir=$xorg_git_dest_dir/$xorg_git_lib_name/dri";

# mesa
my $ac_xincludes  = "--x-includes=$xorg_git_dest_dir/include/X11";
my $ac_xlibraries = "--x-libraries=$xorg_git_dest_dir/$xorg_git_lib_name";

# xserver, mesa
my $ac_debug	  = "--enable-debug";

# xphelloworld
my $ac_motiflibs  = "--with-motif-libraries=no";

# xkeyboard-config
my $ac_xkbcomplnk = "--disable-xkbcomp-symlink";
my $ac_xkbrules   = "--enable-compat-rules";
my $ac_xkbruleslnk= "--with-xkb-rules-symlink=xorg";

# For tarballs
my $tgz		= ".tar.bz2";
my $xorg_app	= "app";
my $xorg_doc	= "doc";
my $xorg_driver	= "driver";
my $xorg_font	= "font";
my $xorg_lib	= "lib";
my $xorg_proto	= "proto";
my $xorg_url	= "http://xorg.freedesktop.org/releases/individual";
my $xorg_util	= "util";


my @modules =
(
 {
     'name'	=> "modular",
     'path'	=> "xorg/util",
     'version'	=> "0.0.1",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "x11proto",
     'path'	=>"xorg/proto",
     'version'	=> "7.0.12",
     'tarball'	=> "$xorg_url/$xorg_proto/xproto-%{version}$tgz",
 },
 {
     'name'	=> "libxtrans",
     'path'	=> "xorg/lib",
     'version'	=> "1.1",
     'tarball'	=> "$xorg_url/$xorg_lib/xtrans-%{version}$tgz",
 },
 {
     'name'	=> "libXau",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXdmcp",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "proto",
     'path'	=> "xcb",
     'version'	=> "1.1",
     # Fixme tarball
 },
 {
     'name'	=> "libICE",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "inputproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.4.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "kbproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.3",
     'tag'	=> "%{name}-%{version}",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86bigfontproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libxcb",
     'path'	=> "xcb",
     'version'	=> "1.1",
     # Fixme tarball
 },
 {
     'name'	=> "xextproto",
     'path'	=>"xorg/proto",
     'version'	=> "7.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libSM",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libX11",
     'path'	=> "xorg/lib",
     'version'	=> "1.1.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
     'configure'=> "$ac_xcb",
 },
 {
     'name'	=> "libXt",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.5",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXext",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "printproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXmu",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXpm",
     'path'	=> "xorg/lib",
     'version'	=> "3.5.7",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXp",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXaw",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tag'	=> "%{name}-%{version}",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "util",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fixesproto",
     'path'	=>"xorg/proto",
     'version'	=> "4.0",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "renderproto",
     'path'	=>"xorg/proto",
     'version'	=> "0.9.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXfixes",
     'path'	=> "xorg/lib",
     'version'	=> "4.0.3",
     'tag'	=> "%{name}-%{version}",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "damageproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.0",
     'tag'	=> "%{name}-%{version}",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86vidmodeproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.2.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "compositeproto",
     'path'	=>"xorg/proto",
     'version'	=> "0.4",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXrender",
     'path'	=> "xorg/lib",
     'version'	=> "0.9.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xineramaproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "randrproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.2.1",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "glproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.4.9",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXdamage",
     'path'	=> "xorg/lib",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "drm",
     'path'	=> "mesa",
     'version'	=> "2.3.0",
     'tag'	=> "%{name}-%{version}",
     'tarball'	=> "http://dri.freedesktop.org/libdrm/libdrm-%{version}$tgz",
 },
 {
     'name'	=> "libXxf86vm",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXi",
     'path'	=> "xorg/lib",
     'version'	=> "1.1.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libxkbfile",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "videoproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.2.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fontcacheproto",
     'path'	=>"xorg/proto",
     'version'	=> "0.1.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fontsproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libfontenc",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXcomposite",
     'path'	=> "xorg/lib",
     'version'	=> "0.4.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXcursor",
     'path'	=> "xorg/lib",
     'version'	=> "1.1.9",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXinerama",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXrandr",
     'path'	=> "xorg/lib",
     'version'	=> "1.2.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86miscproto",
     'path'	=>"xorg/proto",
     'version'	=> "0.9.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "mesa",
     'path'	=> "mesa",
     'version'	=> "7.0.2",
     # Fixme tarball
     'configure'=>
     "$ac_mesadriver "	.
     "$ac_mesadridir "	.
     "$ac_xincludes "		.
     "$ac_xlibraries "	.
     ($options {'d'} ? "$ac_debug" : ""),
 },
 {
     'name'	=> "xf86driproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.0.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libxkbui",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "resourceproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "evieproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/evieext-%{version}$tgz",
 },
 {
     'name'	=> "libXv",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bigreqsproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "dmxproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.2.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "recordproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.13.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "scrnsaverproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xcmiscproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86dgaproto",
     'path'	=>"xorg/proto",
     'version'	=> "2.0.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "trapproto",
     'path'	=>"xorg/proto",
     'version'	=> "3.4.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXfont",
     'path'	=> "xorg/lib",
     'version'	=> "1.3.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libpciaccess",
     'path'	=> "xorg/lib",
     'version'	=> "0.10",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "pixman",
     'path'	=> "",	# empty path
     'version'	=> "0.9.6",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXxf86misc",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "macros",
     'path'	=> "xorg/util",
     'version'	=> "1.1.6",
     'tarball'	=> "$xorg_url/$xorg_util/util-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xserver",
     'path'	=> "xorg",
     'version'	=> "1.4.99.901",
     'tarball'	=> "$xorg_url/xserver/xorg-server-%{version}$tgz",
     'configure'=>
     "$ac_buildaddr "	.
     "$ac_mesapath "	.
     "$ac_dga "		.
     "$ac_dmx "		.
     "$ac_fontcache "	.
     "$ac_glx "		.
     "$ac_glxtls "	.
     "$ac_kdrive "	.
     "$ac_kvesa "	.
     "$ac_xace "	.
     "$ac_xdmcp "	.
     "$ac_xdmauth "	.
     "$ac_xephyr "	.
     "$ac_xegl "	.
     "$ac_xf86misc "	.
     "$ac_xf86vid "	.
     "$ac_xfake "	.
     "$ac_xfbdev "	.
     "$ac_xgl "		.
     "$ac_xglx "	.
     "$ac_xorg "	.
     "$ac_xorgcfg "	.
     "$ac_xsdl "	.
     "$ac_xselinux "	.
     "$ac_xvfb "	.
     ($options{'d'} ? "$ac_debug" : ""),
 },
 {
     'name'	=> "pthread-stubs",
     'path'	=> "xcb",
     'version'	=> "0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/libpthread-stubs-%{version}$tgz",
 },
 {
     'name'	=> "libXprintUtil",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fontconfig",
     'path'	=> "",	# empty path
     'version'	=> "2.5.0",
     'tarball'	=> "http://fontconfig.org/release/fontconfig-%{version}.tar.gz",
 },
 {
     'name'	=> "windowswmproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "applewmproto",
     'path'	=> "xorg/proto",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "mkfontscale",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bdftopcf",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXvMC",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xcursorgen",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXTrap",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bitmaps",
     'path'	=> "xorg/data",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/data/xbitmaps-1.0.1$tgz",
 },
 {
     'name'	=> "libXfontcache",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "pmproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_proto/xproxymanagementprotocol-%{version}$tgz",
 },
 {
     'name'	=> "libXRes",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/libXres-%{version}$tgz", # lowercase r
 },
 {
     'name'	=> "libXprintAppUtil",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXft",
     'path'	=> "xorg/lib",
     'version'	=> "2.1.12",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libFS",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXxf86dga",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXtst",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libdmx",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'path'	=> "xorg/lib",
     'name'	=> "liblbxutil",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXScrnSaver",
     'path'	=> "xorg/lib",
     'version'	=> "1.1.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "lndir",
     'path'	=> "xorg/util",
     'version'	=> "1.0.1",
     # Fixme tarball
 },
 {
     'name'	=> "imake",
     'path'	=> "xorg/util",
     'version'	=> "1.0.2",
     # Fixme tarball
 },
 {
     'name'	=> "gccmakedep",
     'path'	=> "xorg/util",
     'version'	=> "1.0.2",
     # Fixme tarball
 },
 {
     'name'	=> "cf",
     'path'	=> "xorg/util",
     'version'	=> "1.0.2",
     # Fixme tarball
 },
 {
     'name'	=> "xf86rushproto",
     'path'	=>"xorg/proto",
     'version'	=> "1.1.2",
     'tarball'	=> "$xorg_url/$xorg_proto/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "liboldX",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libXevie",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libWindowsWM",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "libAppleWM",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_lib/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfree86-type1",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "winitzki-cyrillic",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "sony-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "screen-cyrillic",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "schumacher-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "misc-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "misc-meltho",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "misc-ethiopic",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "misc-cyrillic",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "micro-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "jis-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "isas-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "ibm-type1",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "encodings",
     'path'	=> "xorg/font",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_font/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "dec-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "daewoo-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "cursor-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "cronyx-cyrillic",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bitstream-type1",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bitstream-speedo",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bitstream-75dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bitstream-100dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-type1",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-ttf",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-lucidatypewriter-75dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-lucidatypewriter-100dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-75dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "bh-100dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "arabic-misc",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "alias",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "adobe-utopia-75dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "adobe-utopia-100dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "adobe-75dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     'name'	=> "adobe-100dpi",
     'path'	=> "xorg/font",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_font/font-%{name}-%{version}$tgz",
 },
 {
     ### FIXME need to find official tarball url, if any
     'name'	=> "xf86-video-xgixp",
     'path'	=> "xorg/driver",
     'version'	=> "1.7.99.2",
 },
 {
     'name'	=> "xf86-video-xgi",
     'path'	=> "xorg/driver",
     'version'	=> "1.5.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-wsfb",
     'path'	=> "xorg/driver",
     'version'	=> "0.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "*BSD only - wsfb_driver.c:46:33: error: dev/wscons/wsconsio.h: No such file or directory",
 },
 {
     'name'	=> "xf86-video-voodoo",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-vmware",
     'path'	=> "xorg/driver",
     'version'	=> "10.15.2",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-via",
     'path'	=> "xorg/driver",
     'version'	=> "0.2.2",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "not building - drm/drm.h int64_t not defined - needs pciaccess conversion after not including drm/drm.h",
 },
 {
     'name'	=> "xf86-video-vga",
     'path'	=> "xorg/driver",
     'version'	=> "4.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-vesa",
     'path'	=> "xorg/driver",
     'version'	=> "1.3.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-v4l",
     'path'	=> "xorg/driver",
     'version'	=> "0.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-tseng",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-trident",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.4",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-tga",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-tdfx",
     'path'	=> "xorg/driver",
     'version'	=> "1.3.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-suntcx",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-sunleo",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-sunffb",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-suncg6",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-suncg3",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-suncg14",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-sunbw2",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-sisusb",
     'path'	=> "xorg/driver",
     'version'	=> "0.8.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-sis",
     'path'	=> "xorg/driver",
     'version'	=> "0.9.4",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-siliconmotion",
     'path'	=> "xorg/driver",
     'version'	=> "1.5.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-savage",
     'path'	=> "xorg/driver",
     'version'	=> "2.1.3",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-s3virge",
     'path'	=> "xorg/driver",
     'version'	=> "1.9.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-s3",
     'path'	=> "xorg/driver",
     'version'	=> "0.5.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-rendition",
     'path'	=> "xorg/driver",
     'version'	=> "4.1.3",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-radeonhd",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-r128",
     'path'	=> "xorg/driver",
     'version'	=> "6.8.0",
     # not available
     #'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-nv",
     'path'	=> "xorg/driver",
     'version'	=> "2.1.8",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-nsc",
     'path'	=> "xorg/driver",
     'version'	=> "2.8.3",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-newport",
     'path'	=> "xorg/driver",
     'version'	=> "0.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-neomagic",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-mga",
     'path'	=> "xorg/driver",
     'version'	=> "1.4.8",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-mach64",
     'path'	=> "xorg/driver",
     'version'	=> "6.8.0",
     # not yet available
     #'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-intel",
     'path'	=> "xorg/driver",
     'version'	=> "2.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-imstt",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "not building - imstt.h:13: error: expected specifier-qualifier-list before 'pciVideoPtr'",
 },
 {
     'name'	=> "xf86-video-impact",
     'path'	=> "xorg/driver",
     'version'	=> "0.2.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "Not ix86: impact_shadow.c:17:26: error: asm/cachectl.h: No such file or directory",
 },
 {
     'name'	=> "xf86-video-i810",
     #'path'	=> "xorg/driver",
     'version'	=> "1.7.4",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "replaced by intel driver",
 },
 {
     'name'	=> "xf86-video-i740",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-i128",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "not building - i128accel.c:38:24: error: xf86_ansic.h: No such file or directory /// i128.h:37: error: expected specifier-qualifier-list before 'pciVideoPtr'",
 },
 {
     'name'	=> "xf86-video-glint",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-glide",
     'path'	=> "xorg/driver",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "Needs libglide & co",
 },
 {
     'name'	=> "xf86-video-fbdev",
     'path'	=> "xorg/driver",
     'version'	=> "0.3.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-dummy",
     'path'	=> "xorg/driver",
     'version'	=> "0.2.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-cyrix",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "not building - cyrix.h:113: error: expected specifier-qualifier-list before 'pciVideoPtr'",
 },
 {
     'name'	=> "xf86-video-cirrus",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-chips",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-ati",
     'path'	=> "xorg/driver",
     'version'	=> "6.8.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-ast",
     'path'	=> "xorg/driver",
     'version'	=> "0.81.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-ark",
     'path'	=> "xorg/driver",
     'version'	=> "0.6.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-apm",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-video-amd",
     'path'	=> "xorg/driver",
     'version'	=> "2.7.7.6",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
     'skip'	=> "amd_gx_driver.c:331: error: 'pciVideoRec' undeclared (first use in this function)",
 },
 {
     'name'	=> "xf86-input-void",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-vmmouse",
     'path'	=> "xorg/driver",
     'version'	=> "12.4.3",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-ur98",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-tek4957",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-summa",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-spaceorb",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-penmount",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-palmax",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-mutouch",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-mouse",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.3",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-microtouch",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-magictouch",
     'path'	=> "xorg/driver",
     'version'	=> "1.0.0.5",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-magellan",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-keyboard",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.2",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-joystick",
     'path'	=> "xorg/driver",
     'version'	=> "1.3.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-jamstudio",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-hyperpen",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-fpit",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-evdev",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-elographics",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-elo2300",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-dynapro",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-dmc",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-digitaledge",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.0",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-citron",
     'path'	=> "xorg/driver",
     'version'	=> "2.2.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-calcomp",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-aiptek",
     'path'	=> "xorg/driver",
     'version'	=> "1.1.1",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86-input-acecad",
     'path'	=> "xorg/driver",
     'version'	=> "1.2.2",
     'tarball'	=> "$xorg_url/$xorg_driver/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xorg-sgml-doctools",
     'path'	=> "xorg/doc",
     'version'	=> "1.2",
     'tarball'	=> "$xorg_url/$xorg_doc/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xorg-docs",
     'path'	=> "xorg/doc",
     'version'	=> "1.4",
     'tarball'	=> "$xorg_url/$xorg_doc/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "cursors",
     'path'	=> "xorg/data",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/data/xcursor-themes-1.0.1$tgz",
 },
 {
     'name'	=> "xwud",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xwininfo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xwd",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xvinfo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xvidtune",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xtrap",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xstdcmap",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xsm",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xsetroot",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xsetpointer",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xsetmode",
     'path'	=> "xorg/app",
     'version'	=> "1.0.0",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xset",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xrx",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xrestop",
     'path'	=> "xorg/app",
     'version'	=> "0.4",
     # Fixme tarball
 },
 {
     'name'	=> "xrefresh",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xrdb",
     'path'	=> "xorg/app",
     'version'	=> "1.0.5",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xrandr",
     'path'	=> "xorg/app",
     'version'	=> "1.2.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xprop",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xprehashprinterlist",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xpr",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xplsprinters",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xphelloworld",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
     'configure'=> "$ac_motiflibs",
 },
 {
     'name'	=> "xmore",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xmodmap",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xmh",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xmessage",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xman",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xmag",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xlsfonts",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xlsclients",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xlsatoms",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xlogo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xload",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkill",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkbutils",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkbprint",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkbevd",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkbcomp",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xinput",
     'path'	=> "xorg/app",
     'version'	=> "1.3.0",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xinit",
     'path'	=> "xorg/app",
     'version'	=> "1.0.8",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xhost",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xgc",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xgamma",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfwp",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfsinfo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfs",
     'path'	=> "xorg/app",
     'version'	=> "1.0.6",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfontsel",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfindproxy",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xfd",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xf86dga",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xeyes",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xev",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xedit",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
     'configure'=> "$ac_noxprint",
 },
 {
     'name'	=> "xdriinfo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xdpyinfo",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xdm",
     'path'	=> "xorg/app",
     'version'	=> "1.1.7",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xditview",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xdbedizzy",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xconsole",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xcompmgr",
     'path'	=> "xorg/app",
     'version'	=> "1.1.4",
     'tarball'	=> "http://xapps.freedesktop.org/release/%{name}-%{version}.tar.gz",
 },
 {
     'name'	=> "xcmsdb",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xclock",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xclipboard",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xcalc",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xbiff",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xbacklight",
     'path'	=> "xorg/app",
     'version'	=> "1.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xauth",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "x11perf",
     'path'	=> "xorg/app",
     'version'	=> "1.5",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "viewres",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "twm",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "smproxy",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "showfont",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "setxkbmap",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "sessreg",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "scripts",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     # Fixme tarball
 },
 {
     'name'	=> "rstart",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "rgb",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "rendercheck",
     'path'	=> "xorg/app",
     'version'	=> "1.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "proxymngr",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "oclock",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "mkfontdir",
     'path'	=> "xorg/app",
     'version'	=> "1.0.4",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "mkcomposecache",
     'path'	=> "xorg/app",
     'version'	=> "1.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "luit",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "listres",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "lbxproxy",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "intel-gen4asm",
     'path'	=> "xorg/app",
     # Fixme tarball
 },
 {
     'name'	=> "ico",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "iceauth",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "grandr",
     'path'	=> "xorg/app",
     'version'	=> "0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "glxcompmgr",
     'path'	=> "xorg/app",
     # Fixme tarball
 },
 {
     'name'	=> "fstobdf",
     'path'	=> "xorg/app",
     'version'	=> "1.0.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fslsfonts",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fonttosfnt",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "fdclock",
     'path'	=> "xorg/app",
     # Fixme tarball
 },
 {
     'name'	=> "editres",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "constype",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "compiz",
     'path'	=> "xorg/app",
     'version'	=> "0.7.2",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}.tar.gz",
 },
 {
     'name'	=> "bitmap",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "beforelight",
     'path'	=> "xorg/app",
     'version'	=> "1.0.3",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "appres",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
 },
 {
     'name'	=> "xkeyboard-config",
     'path'	=> "",
     'version'	=> "1.1",
     # Fixme tarball
     # 'commit'	=> "-r v_1_1 xkeyboard-config",
     'configure'=> "$ac_xkbcomplnk $ac_xkbrules $ac_xkbruleslnk",
 },
 {
     'name'	=> "util",
     'path'	=> "xcb",
     'version'	=> "0.2",
     # Fixme tarball
 },
 {
     'name'	=> "demo",
     'path'	=> "xcb",
     'version'	=> "0.1",
     # Fixme tarball
 },
 {
     'name'	=> "xf86-video-nouveau",
     'path'	=> "nouveau",
     'version'	=> "1.2.0",
     # Fixme tarball
 },
 {
     'name'	=> "xf86-video-avivo",
     'path'	=> "avivo",
     'version'	=> "0.0.1",
     # Fixme tarball
 },


 {
     'name'	=> "calibrateproto",
     'path'	=>"xorg/proto",
     'version'	=> "0.1.0",
     # no tarball at $xorg_url/$xorg_proto/
     'skip'	=> "ignore",
 },
 {
     'name'	=> "lg3dproto",
     'path'	=>"xorg/proto",
     'version'	=> "5.0",
     # no tarball available at $xorg_url/$xorg_proto/
     'skip'	=> "ignore",
 },
 {
     'name'	=> "libXamine",
     'path'	=> "xcb",
     'version'	=> "0.1",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "libXCalibrate",
     'path'	=> "xorg/lib",
     'version'	=> "0.4.0",
     # No tarball at $xorg_url/$xorg_lib/
     'skip'	=> "yes",
 },
 {
     'name'	=> "libXlg3d",
     'path'	=> "xorg/lib",
     'version'	=> "1.0.0",
     # No tarball at $xorg_url/$xorg_lib/
     'skip'	=> "yes",
 },
 # libxxf86rush unbuildable?
 #   tarball not available lib at $xorg_url/$xorg_lib/
 {
     'name'	=> "mkcfm",
     'path'	=> "xorg/app",
     'version'	=> "1.0.1",
     'tarball'	=> "$xorg_url/$xorg_app/%{name}-%{version}$tgz",
     'skip'	=> "broken missing symbols CIDOpenScalable, CIDRegisterFontFileFunctions (should be in libXfont ?)",
 },

 # x11-driver-input-sample unbuildable? or can be added?

 {
     'name'	=> "edid-decode",
     'path'	=> "xorg/app",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "makepsres",
     'path'	=> "xorg/app",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "pclcomp",
     'path'	=> "xorg/app",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "xshowdamage",
     'path'	=> "xorg/app",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "install-check",
     'path'	=> "xorg/util",
     # No version
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "makedepend",
     'path'	=> "xorg/util",
     'version'	=> "1.0.2",
     # Fixme tarball
     'skip'	=> "yes",
 },
 {
     'name'	=> "xmkmf",
     'path'	=> "xorg/util",
     # No files
     # Fixme tarball
     'skip'	=> "yes",
 },
 );


##############################################################################
# Simple wrapper that prints errno string if not successful
sub x_system {
    my ($command, $die) = @_;

    print(STDERR "    $command\n");
    system($command);
    if ($?) {
	die(" ** Error code $? ($!)\n")
	    if ($die);
    }
};


##############################################################################
# Simple wrapper that prints errno string if not successful
sub x_chdir {
    my ($dir) = @_;

    print(STDERR "    cd $dir\n");
    chdir($dir) or die(" ** $!\n");
};


##############################################################################
# Does a clone/pull in the build dir to avoid poluting the main repository
# and giving a chance for better review of changes.
sub checkout {
    my ($package) = \%{$_};

    my ($path, $name, $commit) =
	($package->{'path'},
	 $package->{'name'},
	 $package->{'commit'});

    my $command;
    my $prefix = ($path ne "" ? "$path/" : "") . $name;

    x_chdir($xorg_git_build_dir);
    if (-d $prefix) {
	x_chdir($prefix);

	# Special case
	if ($name eq "xkeyboard-config") {
	    $command = "cvs up";
	}
	else {
	    $command = "git-pull";
	}

	# Follow pattern of other commands
	print(STDERR "    $command\n");
	my $result = `$command`;

	# Very basic way to know this directory needs to be recompiled
	if ($result !~ /Already up-to-date./) {
	    x_system("rm -f $build_ok");
	}
    }
    else {
	# Special case
	if ($name eq "xkeyboard-config") {
	    x_system("cvs -d:pserver:anoncvs\@cvs.freedesktop.org:/cvs/$name login");
	    x_system("cvs -d:pserver:anoncvs\@cvs.freedesktop.org:/cvs/$name co $commit $name");
	}
	else {
	    x_system("git-clone file://$xorg_git_checkout_dir/$prefix $prefix");
	    if ($commit ne "") {
		x_chdir($prefix);
		x_system("git-checkout $commit");
	    }
	}
    }
};


##############################################################################
# Updates git repository
sub update {
    my ($package) = \%{$_};

    my ($path, $name) =
	($package->{'path'},
	 $package->{'name'});

    x_system("echo -n $path/$name > $git_last_update");

    my $command;
    my $prefix = ($path ne "" ? "$path/" : "") . $name;

    x_chdir($xorg_git_checkout_dir);
    if (-d $prefix) {
	x_chdir($prefix);

	# Special case
	if ($name eq "xkeyboard-config") {
	    $command = "cvs up";
	}
	else {
	    if (`git diff`) {
		die("$name has uncommited changes.\n");
	    }
	    my $tmp = $/;
	    $/ = undef;
	    $command = `git branch`;
	    $/ = $tmp;
	    # Don't try to switch branches, as it may cause conflicting merges.
	    # Require that the package leave it in master branch, i.e. just
	    # in a state matching a standard/default readonly checkout.
	    if ($command !~ /^\* master$/m) {
		die("$path/$name is not in branch master.\n");
	    }
	    $command = "git-pull";
	}
    }
    else {
	# Special case
	if ($name eq "xkeyboard-config") {
	    x_system("cvs -d:pserver:anoncvs\@cvs.freedesktop.org:/cvs/$name login");
	    $command = "cvs -d:pserver:anoncvs\@cvs.freedesktop.org:/cvs/$name co $package->{commit} $name";
	}
	else {
	    $command = "git clone $xorg_git_protocol://$xorg_git_repository/$prefix $prefix";
	}
    }
    x_system("$command");
};


##############################################################################
sub checktars {
    my ($package) = \%{$_};

    my ($path, $name, $tarball) =
	($package->{'path'},
	 $package->{'name'},
	 $package->{'tarball'});

    if ($tarball) {
    #	my $filename = File::Basename::basename($tarball);
    #
    #	if (not -f "$xorg_git_build_dir/$path/$name/$filename") {
    #	    x_chdir("$xorg_git_build_dir/$path/$name");
    #	    x_system("wget -q $tarball");
    #	    print(STDERR " ** Missing package downloaded from upstream.\n")
    #		unless ($?);
    #	}
    #	else {
	    x_system("wget --spider -q $tarball");
	#	}
	if ($?) {
	    print(STDERR " ** Error checking tarball $tarball.\n");
	}
    }
    else {
	print(STDERR " ** No tarball specified for package $name\n");
    }
};


##############################################################################
sub build {
    my ($package) = \%{$_};

    my ($path, $name, $configure) =
	($package->{'path'},
	 $package->{'name'},
	 $package->{'configure'});

    my $trace = $options{'g'} ? $xorg_trace_pl : "";
    my $full_path = "$xorg_git_build_dir/$path/$name";

    if (not -f "$full_path/$build_ok") {
	x_chdir("$full_path");

	my $arguments = " --prefix=$xorg_git_dest_dir --cache-file=$auto_cache_file $configure";

	if (-f "Makefile") {
	    x_system("make distclean");
	}
	if ($options{'g'}) {
	    x_system("rm -f $name.deps $name.files");
	}

	if (-f "autogen.sh") {
	    x_system("$trace ./autogen.sh $arguments");
	}
	# Mesa special case only?
	else {
	    x_system("$trace autoconf");
	    x_system("$trace make configure");
	    x_system("$trace ./configure $arguments");
	}

	x_system("$trace make", 1);

	# XXX
	$trace .= $options{'g'} ? " -i" : "";
	x_system("$xorg_git_sudo_command $trace make install", 1);

	if ($options{'g'}) {
	    x_system("$xorg_git_sudo_command mkdir -p $xorg_git_deps_dir/$path");
	    x_system("$xorg_git_sudo_command /bin/sh -c \"cat $name.deps | sort | uniq > $xorg_git_deps_dir/$path/$name.deps\"");
	    x_system("$xorg_git_sudo_command /bin/sh -c \"cat $name.files | sort | uniq > $xorg_git_deps_dir/$path/$name.files\"");
	}

	x_system("touch $build_ok");
    }
};


##############################################################################
sub clean {
    my ($package) = \%{$_};

    my ($path, $name) =
	($package->{'path'},
	 $package->{'name'});

    x_system("rm -f $xorg_git_build_dir/$path/$name/$build_ok");
};


##############################################################################
sub realclean {
    my ($package) = \%{$_};

    my ($path, $name) =
	($package->{'path'},
	 $package->{'name'});

    x_chdir("$xorg_git_build_dir/$path/$name");
    x_system("rm -f $build_ok");
    x_system("make realclean") if (-f "Makefile");
};


##############################################################################
sub distclean {
    my ($package) = \%{$_};

    my ($path, $name) =
	($package->{'path'},
	 $package->{'name'});

    x_chdir("$xorg_git_build_dir/$path/$name");
    x_system("rm -f $build_ok");
    x_system("make distclean") if (-f "Makefile");
};


##############################################################################
# Replace hash values with macros in the format %{string} to $module->{'string'}
#   Only one pass and no specific order
sub replace_macros_and_check_errors {
    my ($module, $key, $value, $macro, $replace);

    foreach $module (@modules) {
	while (($key, $value) = each %$module) {
	    # Don't allow modules without a version specified
	    #die("$module->{package} doesn't have a version")
		#unless($module->{'version'} or $module->{'skip'});

	    while ($value =~ /%\{(\w+)\}/) {
		$macro = $1;
		if ($module->{$macro}) {
		    $replace = $module->{$1};
		}
		else {
		    # Don't allow undefined ``macros''.
		    # Assume name is always properly defined
		    die(" ** unknown macro $module->{name}:%{$macro}.\n");
		}
		$value =~ s/%\{$1\}/$replace/g;
	    }
	    $module->{$key} = $value;
	}
    }
}
replace_macros_and_check_errors();


##############################################################################
# Subroutines are free to change this now as a lot of "system" commands
# may be used.
my $dir = Cwd::getcwd();

my %table = (
    "update"	=>	\&update,
    "checkout"	=>	\&checkout,
    "build"	=>	\&build,
    "clean"	=>	\&clean,
    "realclean"	=>	\&realclean,
    "distclean"	=>	\&distclean,
    "checktars"	=>	\&checktars,
);

#  Add skip for -n option
if ($options{'n'}) {
    foreach (@modules) {
	$_->{'skip'} = "yes" unless ($_->{'name'} eq $options{'n'});
    }
}

# If using a temp file to not need to restart over an update...
if ($command eq "update" and not $options{'c'} and -f $git_last_update) {
    my $lastupdate = `cat $git_last_update`;
    foreach (@modules) {
	last if ("$_->{path}/$_->{name}" eq $lastupdate);
	$_->{'skip'} = "yes";
    }
}
foreach (@modules) {
    print(STDERR "--> $_->{name}\n");
    my $function = $table{$command};
    $function->($_) unless($_->{'skip'});
}
# If using a temp file to not need to restart over an update...
if ($command eq "update" and -f $git_last_update) {
    x_system("rm -f $git_last_update");
}

# Restore current directory
chdir($dir);