#!/usr/bin/perl

use Getopt::Long;
use POSIX;
use XML::Parser;
use User::pwent;
use Sys::Hostname;
use Pod::Usage;

my $gptfile;
my $setupfile;
my $release = "1";
my $directory;
my $setupdirectory;
my $toolkitversion = "5.2.0";
my $email;
my $nodoc;
my $help;

GetOptions('gptfile=s' => \$gptfile,
	   'setupfile=s' => \$setupfile,
	   'release=s' => \$release,
	   'directory=s' => \$directory,
	   'toolkitversion=s' => \$toolkitversion,
	   'email=s' => \$email,
	   'nodoc' => \$nodoc,
	   'help' => \$help);

Pod::Usage::pod2usage() if defined $help;

die "Missing --gptfile option" unless defined $gptfile;

setlocale(LC_TIME, 'C');

my $login = getlogin || getpwuid($<);
my $pw = getpwnam($login);
my ($fullname, $location, $phone) = split(/,/, $pw->gecos);
my $host = hostname;

$email = "$login\@$host" unless defined $email;

@versions = split(/\./, $toolkitversion);
if (@versions[0] < 5) {
    $sourcedir = "gt@versions[0]/$toolkitversion";
}
else {
    $sourcedir = "gt@versions[0]/@versions[0].@versions[1]/$toolkitversion";
}

if (defined $directory) {
    $setupdirectory = $directory;
    $setupdirectory =~ s![^/]*$!setup!;
}

my $parser = new XML::Parser(Style => 'Objects', Pkg => 'GPT');

my %srcdeps;
my %setupdeps;

my $gptdoc = $parser->parsefile($gptfile);

my $gptmeta = $gptdoc->[0];
my $gptname = $gptmeta->{Name};

my $gptagingver = (grep {$_->isa('GPT::Aging_Version')} @{$gptmeta->{Kids}})[0];
my $gptmajorver = $gptagingver->{Major};
my $gptminorver = $gptagingver->{Minor};

my $gptdesc = (grep {$_->isa('GPT::Description')} @{$gptmeta->{Kids}})[0];
my $description = $gptdesc->{Kids}->[0]->{Text};
$description =~ s!^\s+|\s+$!!g;

my $gptfuncgroup = (grep {$_->isa('GPT::Functional_Group')} @{$gptmeta->{Kids}})[0];
my $funcgroup = $gptfuncgroup->{Kids}->[0]->{Text}; 
$funcgroup =~ s!^\s+|\s+$!!g;

my $srcpkg = (grep {$_->isa('GPT::src_pkg')} @{$gptmeta->{Kids}})[0];
for my $srcdep (grep {$_->isa('GPT::Source_Dependencies')} @{$srcpkg->{Kids}})
{
    my $type = $srcdep->{Type};
    $srcdeps{$type} = {} unless defined $srcdeps{$type};
    for my $dep (grep {$_->isa('GPT::Dependency')} @{$srcdep->{Kids}})
    {
	my $depname = $dep->{Name};
	my $deppkg = $dep->{Package} if defined $dep->{Package};
	$depname = $depname . "-progs" if ($deppkg eq "pgm");
	$depname = $depname . "-doc" if ($deppkg eq "doc");
	$depname =~ tr/_/-/;
	my $depversion = (grep {$_->isa('GPT::Version')} @{$dep->{Kids}})[0];
	my $depverel = (grep {$_->isa('GPT::Simple_Version')}
	    @{$depversion->{Kids}})[0];
	my $depver = $depverel->{Major};
	$srcdeps{$type}{$depname} = $depver
	    unless (defined $srcdeps{$type}{$depname}
		    and $srcdeps{$type}{$depname} >= $depver);
    }
}

for my $setupdep (grep {$_->isa('GPT::Source_Setup_Dependency')}
    @{$gptmeta->{Kids}})
{
    my $type = $setupdep->{PkgType};
    $setupdeps{$type} = {} unless defined $setupdeps{$type};
    for my $dep (grep {$_->isa('Setup_Dependency')} @{$setupdep->{Kids}})
    {
	my $depname = $dep->{Name};
	$depname =~ tr/_/-/;
	my $depversion = (grep {$_->isa('GPT::Version')} @{$dep->{Kids}})[0];
	my $depverel = (grep {$_->isa('GPT::Simple_Version')}
	    @{$depversion->{Kids}})[0];
	my $depver = $depverel->{Major};
	$setupdeps{$type}{$depname} = $depver
	    unless (defined $setupdeps{$type}{$depname}
		    and $setupdeps{$type}{$depname} >= $depver);
    }
}

my $buildenv = (grep {$_->isa('GPT::Build_Environment')} @{$srcpkg->{Kids}})[0];
my $pkglibsel = (grep {$_->isa('GPT::pkg_libs')} @{$buildenv->{Kids}})[0];
$pkglibs = $pkglibsel->{Kids}->[0]->{Text} if defined $pkglibsel;

my $setupname;
my $setupversion;
my $setupdescription;
my $postinstall;

if (defined $setupfile) {

    my $setupdoc = $parser->parsefile($setupfile);

    my $setupmeta = $setupdoc->[0];
    $setupname = $setupmeta->{Name};

    die "Setup package name does not match main package name"
	if ($setupname ne $gptname . '_setup');

    my $setupagingver = (grep {$_->isa('GPT::Aging_Version')}
	@{$setupmeta->{Kids}})[0];
    my $setupmajorver = $setupagingver->{Major};
    my $setupminorver = $setupagingver->{Minor};

    my $setupdesc = (grep {$_->isa('GPT::Description')} @{$setupmeta->{Kids}})[0];
    $setupdescription = $setupdesc->{Kids}->[0]->{Text};
    $setupdescription =~ s!^\s+|\s+$!!g;

    my $setupsrcpkg = (grep {$_->isa('GPT::src_pkg')} @{$setupmeta->{Kids}})[0];
    for my $srcdep (grep {$_->isa('GPT::Source_Dependencies')} @{$setupsrcpkg->{Kids}})
    {
	my $type = $srcdep->{Type};
	$srcdeps{$type} = {} unless defined $srcdeps{$type};
	for my $dep (grep {$_->isa('GPT::Dependency')} @{$srcdep->{Kids}})
	{
	    my $depname = $dep->{Name};
	    my $deppkg = $dep->{Package}
		if defined $dep->{Package};
	    $depname = $depname . "-progs" if ($deppkg eq "pgm");
	    $depname =~ tr/_/-/;
	    my $depversion = (grep {$_->isa('GPT::Version')}
		@{$dep->{Kids}})[0];
	    my $depverel = (grep {$_->isa('GPT::Simple_Version')}
		@{$depversion->{Kids}})[0];
	    my $depver = $depverel->{Major};
	    $srcdeps{$type}{$depname} = $depver
		unless (defined $srcdeps{$type}{$depname}
			and $srcdeps{$type}{$depname} >= $depver);
	}
    }

    for my $setupdep (grep {$_->isa('Source_Setup_Dependency')} @{$setupsrcpkg->{Kids}})
    {
	my $type = $setupdep->{PkgType};
	$setupdeps{$type} = {} unless defined $setupdeps{$type};
	for my $dep (grep {$_->isa('GPT::Setup_Dependency')} @{$setupdep->{Kids}})
	{
	    my $depname = $dep->{Name};
	    $depname =~ tr/_/-/;
	    my $depversion = (grep {$_->isa('GPT::Version')}
		@{$dep->{Kids}})[0];
	    my $depverel = (grep {$_->isa('GPT::Simple_Version')}
		@{$depversion->{Kids}})[0];
	    my $depver = $depverel->{Major};
	    $setupdeps{$type}{$depname} = $depver
		unless (defined $setupdeps{$type}{$depname}
			and $setupdeps{$type}{$depname} >= $depver);
	}
    }

    my $setuppostinstall = (grep {$_->isa('GPT::Post_Install_Program')} @{$setupsrcpkg->{Kids}})[0];
    $postinstall = $setuppostinstall->{Kids}->[0]->{Text}
	if defined $setuppostinstall->{Kids}->[0];
    $postinstall =~ s!^\s+|\s+$!!g;

    $setupversion = $setupmajorver . '.' . $setupminorver;
}

my $name = $gptname;
$name =~ tr/_/-/;

my $version = $gptmajorver . '.' . $gptminorver;

my $libs = 1;
if (!defined $srcdeps{'lib_link'} and !defined $srcdeps{'rtl_runtime'}) {
    $libs = 0;
}

my $develpkg = 1;
my $docpkg = 1;
my $progspkg = 0;

if (!$libs) {
    $develpkg = 0;
    $docpkg = 0;
}
else {
    $docpkg = 0 if defined $nodoc;
    $progspkg = 1 if (defined $srcdeps{'pgm_link'} or
		      defined $srcdeps{'pgm_runtime'});
}

print "%ifarch alpha ia64 ppc64 s390x sparc64 x86_64\n";
print "%global flavor gcc64\n";
print "%else\n";
print "%global flavor gcc32\n";
print "%endif\n\n";

print "Name:\t\t$name\n";
print "%global _name %(tr - _ <<< %{name})\n";
print "Version:\t$version\n";
print "%global setupversion $setupversion\n" if defined $setupfile;
print "Release:\t$release%{?dist}\n";
print "Summary:\tGlobus Toolkit - $description\n";
print "\n";

if ($libs) {
    print "Group:\t\tSystem Environment/Libraries\n";
}
else {
    print "Group:\t\tApplications/Internet\n";
}
print "License:\tASL 2.0\n";
print "URL:\t\thttp://www.globus.org/\n";
print "Source:\t\thttp://www.globus.org/ftppub/$sourcedir/packages/src/%{_name}-%{version}.tar.gz\n";
if (defined $setupfile) {
    print "Source1:\thttp://www.globus.org/ftppub/$sourcedir/packages/src/%{_name}_setup-%{setupversion}.tar.gz\n";
}
print "#\t\tREADME file\n";
print "Source8:\t";
print "GLOBUS-CCOMMONLIB" if ($funcgroup eq 'Common');
print "GLOBUS-CCOMMONLIB" if ($funcgroup eq 'Core');
print "GLOBUS-GRAM5"      if ($funcgroup eq 'GRAM');
print "GLOBUS-GRAM5"      if ($funcgroup eq 'Pre-WS GRAM');
print "GLOBUS-GRAM5"      if ($funcgroup eq 'ResourceManagement');
print "GLOBUS-GRAM5"      if ($funcgroup eq 'WS GRAM');
print "GLOBUS-GRIDFTP"    if ($funcgroup eq 'FileAccess');
print "GLOBUS-GRIDFTP"    if ($funcgroup eq 'GridFTP');
print "GLOBUS-GSIC"       if ($funcgroup eq 'Security');
print "GLOBUS-RLS"        if ($funcgroup eq 'Data');
print "GLOBUS-XIO"        if ($funcgroup eq 'Communication');
print "\n";
if ($docpkg) {
    print "#\t\tThis is a workaround for the broken epstopdf script in RHEL5\n";
    print "#\t\tSee: https://bugzilla.redhat.com/show_bug.cgi?id=450388\n";
    print "Source9:\tepstopdf-2.9.5gw\n";
}
my $p = 0;
while ($ARGV[$p]) {
    print "#\t\t### INSERT PATCH DESCRIPTION HERE ###:\n";
    print "#\t\thttp://bugzilla.globus.org/bugzilla/show_bug.cgi?id=###BUG NUMBER###\n";
    print "Patch$p:" . ($p < 10 ? "\t\t" : "\t") . "$ARGV[$p]\n";
    $p++;
}
print "BuildRoot:\t%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)\n";
print "\n";

if (!$libs) {
    my $hasrequires = 0;
    if (defined $setupfile) {
	print "Provides:\t%{name}-setup = %{setupversion}\n";
	print "Requires:\tglobus-common >= 11.5\n";
	$hasrequires = 1;
    }
    while (($key, $value) = each(%{$srcdeps{'pgm_link'}})) {
	# Explicit Requires for libraries should not be used according to the
	# packaging guidelines. The autogenerated Requires on sonames make them
	# redundant. Only add Requires for XIO plugins.
	if ($key =~ /^globus-xio-/) {
	    print "Requires:\t$key%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	    $hasrequires = 1;
	}
    }
    # Need at least one Requires to own directories
    print "Requires:\tglobus-common\n" unless $hasrequires;
    while (($key, $value) = each(%{$srcdeps{'pgm_runtime'}})) {
	print "Requires:\t$key" . ($value > 0 ? " >= $value\n" : "\n");
    }
    while (($key, $value) = each(%{$setupdeps{'pgm'}})) {
	print "Requires:\t$key" . ($value > 0 ? " >= $value\n" : "\n")
	    unless $key eq 'trusted-ca-setup';
    }
    print "BuildRequires:\tgrid-packaging-tools >= 3.4\n";
    print "BuildRequires:\tglobus-core%{?_isa} >= 8\n";
    while (($key, $value) = each(%{$srcdeps{'compile'}})) {
	if ($key ne "globus-core") {
	    print "BuildRequires:\t$key-devel%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	}
    }
}
else {
    my $hasrequires = 0;
    while (($key, $value) = each(%{$srcdeps{'lib_link'}})) {
	# Explicit Requires for libraries should not be used according to the
	# packaging guidelines. The autogenerated Requires on sonames make them
	# redundant. Only add Requires for XIO plugins.
	if ($key =~ /^globus-xio-/) {
	    print "Requires:\t$key%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	    $hasrequires = 1;
	}
    }
    # Need at least one Requires to own directories
    print "Requires:\tglobus-common\n" unless $hasrequires;
    while (($key, $value) = each(%{$srcdeps{'rtl_runtime'}})) {
	print "Requires:\t$key%{?_isa}" . ($value > 0 ? " >= $value\n" : "\n");
    }
    while (($key, $value) = each(%{$setupdeps{'rtl'}})) {
	print "Requires:\t$key" . ($value > 0 ? " >= $value\n" : "\n")
	    unless $key eq 'trusted-ca-setup';
    }
    print "BuildRequires:\tgrid-packaging-tools >= 3.4\n";
    print "BuildRequires:\tglobus-core%{?_isa} >= 8\n";
    while (($key, $value) = each(%{$srcdeps{'compile'}})) {
	if ($key ne "globus-core") {
	    print "BuildRequires:\t$key-devel%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	}
    }
    while (($key, $value) = each(%{$srcdeps{'doc_runtime'}})) {
	print "BuildRequires:\t$key" . ($value > 0 ? " >= $value\n" : "\n");
    }
    if ($docpkg) {
	print "BuildRequires:\tdoxygen\n";
	print "BuildRequires:\tgraphviz\n";
	print "%if \"%{?rhel}\" == \"5\"\n";
	print "BuildRequires:\tgraphviz-gd\n";
	print "%endif\n";
	print "BuildRequires:\tghostscript\n";
	print "%if %{?fedora}%{!?fedora:0} >= 9 || %{?rhel}%{!?rhel:0} >= 5\n";
	print "BuildRequires:\ttex(latex)\n";
	print "%else\n";
	print "BuildRequires:\ttetex-latex\n";
	print "%endif\n";
    }
    if ($progspkg) {
	print "\n";
	print "%package progs\n";
	print "Summary:\tGlobus Toolkit - $description Programs\n";
	print "Group:\t\tApplications/Internet\n";
	print "Provides:\t%{name}-setup = %{setupversion}\n"
	    if defined $setupfile;
	print "Requires:\t%{name}%{?_isa} = %{version}-%{release}\n";
	print "Requires:\tglobus-common >= 11.5\n" if defined $setupfile;
	while (($key, $value) = each(%{$srcdeps{'pgm_link'}})) {
	    # Explicit Requires for libraries should not be used according
	    # to the packaging guidelines. The autogenerated Requires on
	    # sonames make them redundant.
	    # Only add Requires for XIO plugins.
	    print "Requires:\t$key%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n")
		if $key =~ /^globus-xio-/;
	}
	while (($key, $value) = each(%{$srcdeps{'pgm_runtime'}})) {
	    print "Requires:\t$key" . ($value > 0 ? " >= $value\n" : "\n")
		unless $key eq $name;
	}
	while (($key, $value) = each(%{$setupdeps{'pgm'}})) {
	    print "Requires:\t$key" . ($value > 0 ? " >= $value\n" : "\n")
		unless $key eq 'trusted-ca-setup' or $key eq $name;
	}
    }
}

if ($develpkg) {
    print "\n";
    print "%package devel\n";
    print "Summary:\tGlobus Toolkit - $description Development Files\n";
    print "Group:\t\tDevelopment/Libraries\n";
    print "Requires:\t%{name}%{?_isa} = %{version}-%{release}\n";
    while (($key, $value) = each(%{$srcdeps{'compile'}})) {
	if ($key eq "globus-core") {
	    print "Requires:\t$key%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	}
	else {
	    print "Requires:\t$key-devel%{?_isa}" .
		($value > 0 ? " >= $value\n" : "\n");
	}
    }
}

if ($docpkg) {
    print "\n";
    print "%package doc\n";
    print "Summary:\tGlobus Toolkit - $description Documentation Files\n";
    print "Group:\t\tDocumentation\n";
    print "%if %{?fedora}%{!?fedora:0} >= 10 || %{?rhel}%{!?rhel:0} >= 6\n";
    print "BuildArch:\tnoarch\n";
    print "%endif\n";
    print "Requires:\t%{name} = %{version}-%{release}\n";
}

print "
%description
The Globus Toolkit is an open source software toolkit used for building Grid
systems and applications. It is being developed by the Globus Alliance and
many others all over the world. A growing number of projects and companies are
using the Globus Toolkit to unlock the potential of grids for their cause.

The %{name} package contains:
$description
";

print "
%description progs
The Globus Toolkit is an open source software toolkit used for building Grid
systems and applications. It is being developed by the Globus Alliance and
many others all over the world. A growing number of projects and companies are
using the Globus Toolkit to unlock the potential of grids for their cause.

The %{name}-progs package contains:
$description Programs
" if ($progspkg);

print "$setupdescription\n" if defined $setupfile;

print "
%description devel
The Globus Toolkit is an open source software toolkit used for building Grid
systems and applications. It is being developed by the Globus Alliance and
many others all over the world. A growing number of projects and companies are
using the Globus Toolkit to unlock the potential of grids for their cause.

The %{name}-devel package contains:
$description Development Files
" if ($develpkg);

print "
%description doc
The Globus Toolkit is an open source software toolkit used for building Grid
systems and applications. It is being developed by the Globus Alliance and
many others all over the world. A growing number of projects and companies are
using the Globus Toolkit to unlock the potential of grids for their cause.

The %{name}-doc package contains:
$description Documentation Files
" if ($docpkg);

print "
%prep
%setup -q -n %{_name}-%{version}
";

print "%setup -D -T -q -n %{_name}-%{version} -a 1\n" if defined $setupfile;

$p = 0;
while ($ARGV[$p]) {
    print "%patch$p -p1\n";
    $p++;
}

print "
%if \"%{rhel}\" == \"5\"
mkdir bin
install %{SOURCE9} bin/epstopdf
%endif
" if ($docpkg);

print "
%build";

print "
%if \"%{rhel}\" == \"5\"
export PATH=\$PWD/bin:\$PATH
%endif
" if ($docpkg);

print "
# Remove files that should be replaced during bootstrap
rm -f doxygen/Doxyfile*
rm -f doxygen/Makefile.am
rm -f pkgdata/Makefile.am
rm -f globus_automake*
rm -rf autom4te.cache

unset GLOBUS_LOCATION
unset GPT_LOCATION
%{_datadir}/globus/globus-bootstrap.sh
";

if ($docpkg) {
    print "
%configure --disable-static --with-flavor=%{flavor} \\
	   --enable-doxygen --with-docdir=%{_docdir}/%{name}-%{version}
";
}
else {
    print "
%configure --disable-static --with-flavor=%{flavor} \\
	   --with-docdir=%{_docdir}/%{name}-%{version}
";
}

print "
# Reduce overlinking
sed 's!CC -shared !CC \\\${wl}--as-needed -shared !g' -i libtool

make %{?_smp_mflags}
";

print "
# setup package
cd %{_name}_setup-%{setupversion}

# Remove files that should be replaced during bootstrap
rm -f doxygen/Doxyfile*
rm -f doxygen/Makefile.am
rm -f pkgdata/Makefile.am
rm -f globus_automake*
rm -rf autom4te.cache

%{_datadir}/globus/globus-bootstrap.sh

%configure --without-flavor --with-docdir=%{_docdir}/%{name}-%{version}

make %{?_smp_mflags}

cd -
" if defined $setupfile;

print "
%install";

print "
%if \"%{rhel}\" == \"5\"
export PATH=\$PWD/bin:\$PATH
%endif
" if ($docpkg);

print "
rm -rf \$RPM_BUILD_ROOT
make install DESTDIR=\$RPM_BUILD_ROOT
";

print "
# setup package
cd %{_name}_setup-%{setupversion}
make install DESTDIR=\$RPM_BUILD_ROOT
cd -

# Register setup
perl -MGrid::GPT::Setup <<EOF
my \\\$metadata = new Grid::GPT::Setup(package_name => \"%{_name}_setup\",
				     globusdir => \"\$RPM_BUILD_ROOT%{_prefix}\");
\\\$metadata->finish();
EOF

# Create setup files

### INSERT RELEVANT PARTS OF $postinstall HERE ###
" if defined $setupfile;

print "
GLOBUSPACKAGEDIR=\$RPM_BUILD_ROOT%{_datadir}/globus/packages
";

if (not defined $pkglibs) {
    print "
# This library is opened using lt_dlopenext, so the libtool archive
# (.la file) can not be removed - fix the libdir and clear dependency_libs
# ... and move it to the main package
for lib in `find \$RPM_BUILD_ROOT%{_libdir} -name 'lib*.la'` ; do
  sed -e \"s!^libdir=.*!libdir=\\'%{_libdir}\\'!\" \\
      -e \"s!^dependency_libs=.*!dependency_libs=\\'\\'!\" -i \$lib
done
grep 'lib.*\\.la\$' \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_dev.filelist \\
  >> \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_rtl.filelist
sed '/lib.*\\.la\$/d' -i \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_dev.filelist
" if ($libs);
}
else {
    print "
# Remove libtool archives (.la files)
find \$RPM_BUILD_ROOT%{_libdir} -name 'lib*.la' -exec rm -v '{}' \\;
sed '/lib.*\\.la\$/d' -i \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_dev.filelist
" if ($libs);
}

print "
# Move license file to main package
grep GLOBUS_LICENSE \$GLOBUSPACKAGEDIR/%{_name}/noflavor_doc.filelist \\
  >> \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_rtl.filelist
sed /GLOBUS_LICENSE/d -i \$GLOBUSPACKAGEDIR/%{_name}/noflavor_doc.filelist

# Remove unwanted documentation (needed for RHEL4)
rm -f \$RPM_BUILD_ROOT%{_mandir}/man3/*_%{_name}-%{version}_*.3
sed -e '/_%{_name}-%{version}_.*\\.3/d' \\
  -i \$GLOBUSPACKAGEDIR/%{_name}/noflavor_doc.filelist
" if ($docpkg);

print "
# Install README file
install -m 644 -p %{SOURCE8} \\
  \$RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}/README

# Generate package filelists
";

if (!$libs) {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_pgm.filelist \\\n";
    print "    \$GLOBUSPACKAGEDIR/%{_name}_setup/noflavor_pgm.filelist \\\n"
	if defined $setupfile;
    print "  | sed s!^!%{_prefix}! > package.filelist\n";
}
else {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_rtl.filelist \\\n";
    print "  | sed s!^!%{_prefix}! > package.filelist\n";
}

if (!$docpkg) {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/noflavor_doc.filelist \\\n";
    print "  | sed -e 's!/man/.*!&\*!' -e 's!^!%doc %{_prefix}!' >> package.filelist\n";
}

if ($progspkg) {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_pgm.filelist \\\n";
    print "    \$GLOBUSPACKAGEDIR/%{_name}_setup/noflavor_pgm.filelist \\\n"
	if defined $setupfile;
    print "  | sed s!^!%{_prefix}! > package-progs.filelist\n";
}

if ($develpkg) {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/%{flavor}_dev.filelist \\\n";
    print "  | sed s!^!%{_prefix}! > package-devel.filelist\n";
}

if ($docpkg) {
    print "cat \$GLOBUSPACKAGEDIR/%{_name}/noflavor_doc.filelist \\\n";
    print "  | sed -e 's!/man/.*!&\*!' -e 's!^!%doc %{_prefix}!' > package-doc.filelist\n";
}

print "
%clean
rm -rf \$RPM_BUILD_ROOT
";

print "
%post -p /sbin/ldconfig

%postun -p /sbin/ldconfig
" if ($libs);

print "
%files -f package.filelist
%defattr(-,root,root,-)
%dir %{_datadir}/globus/packages/%{_name}
%dir %{_docdir}/%{name}-%{version}
%doc %{_docdir}/%{name}-%{version}/README
";

print "
%files -f package-progs.filelist progs
%defattr(-,root,root,-)
" if ($progspkg);

print "%dir %{_datadir}/globus/packages/%{_name}_setup
%{_datadir}/globus/packages/setup/%{_name}_setup
" if defined $setupfile;

print "
%files -f package-devel.filelist devel
%defattr(-,root,root,-)
" if ($develpkg);

print "
%files -f package-doc.filelist doc
%defattr(-,root,root,-)
%dir %{_docdir}/%{name}-%{version}/html
" if ($docpkg);

print "
%changelog
* " . strftime('%a %b %d %Y', localtime) . " $fullname <$email> - $version-$release
- Autogenerated
"

__END__

=head1 NAME

B<globus-spec-creator> - Generate an RPM spec file from a GPT source
package description

=head1 SYNOPSIS

B<globus-spec-creator> [options] [patches ...]

Options:

=over

=item B<-gptfile> filename

The package's GPT source package description file (mandatory)

=item B<-setupfile> filename

The corresponding setup package's GPT source package description file
(default: none)

=item B<-release> releasenumber

The RPM release number (default: 1)

=item B<-directory> directory

The package's source directory in the toolkit installer

=item B<-toolkitversion> versionnumber

Globus toolkit version (default: 5.2.0)

=item B<-email> emailaddress

The packagers e-mail address (default: username@hostname)

=item B<-nodoc>

Disable the generation of the doc RPM

=item B<-help>

Show help

=back

Arguments:

Each additional argument will be added as a patch in the generated
specfile.

=head1 EXAMPLE

globus-spec-creator -g globus_common-10.2/pkgdata/pkg_data_src.gpt.in
-s globus_common_setup-2.6/pkgdata/pkg_data_src.gpt.in -r 3 -d
common/source

=head1 SEE ALSO

See http://fedoraproject.org/wiki/PackagingDrafts/Globus for
additional information and examples.

=head1 AUTHOR

Mattias Ellert E<lt>mattias.ellert@fysast.uu.seE<gt>

=cut
