#!/usr/bin/perl

# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
#
# For the purpose of standalone builds of lb/jobid/lbjp-common components
# it is copied on tagging 

# $Header: /cvs/jra1mw/org.glite.lbjp-common.gss/configure,v 1.24.2.2 2012/07/26 07:55:13 zsustr Exp $
#
# Copyright (c) Members of the EGEE Collaboration. 2004-2010.
# See http://www.eu-egee.org/partners/ for details on the copyright holders.
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

use Getopt::Long;
use POSIX qw(locale_h strftime);

my $pwd = `pwd`; chomp $pwd;
my $prefix = '/usr';
my $stagedir = undef;
my $root = $pwd.'/stage';
my $sysroot = '';
my $sysconfdir;
my $localstatedir;
my $staged;
my $module;
my $thrflavour = 'gcc64dbgpthr';
my $nothrflavour = 'gcc64dbg';
my $mode = 'build';
my $help = 0;
my $listmodules;
my ($version, $force_version);
my $branch;
my $output;
my $lb_tag = '';
my $lbjp_tag = '';
my $jp_tag = '';
my $jobid_tag = '';
my $libdir = getlibdir();
my $project = 'emi';
my $project_version;
my (%projects, %project);
my $debug = 0;
my $pkg_config_env = (defined $ENV{PKG_CONFIG_PATH}) ? "$ENV{PKG_CONFIG_PATH}:" : '';

my @nodes = qw/client server logger logger-msg nagios utils client-java doc ws-test db jpprimary jpindex jpclient harvester lb px proxyrenewal/;
my @default_nodes = qw/lb px proxyrenewal nagios/;
my %enable_nodes;
my %disable_nodes;
my %default_nodes; @default_nodes{@default_nodes} = (1) x ($#default_nodes + 1);

my %package = (
	'maintainer' => 'CESNET Product Teams <emi-lb@metacentrum.cz>',
	'uploaders' => 'František Dvořák <valtri@civ.zcu.cz>',
	'url' => 'http://glite.cern.ch',
	'debian_vcs' => 'Vcs-Cvs: :pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw
Vcs-Browser: http://jra1mw.cvs.cern.ch/cgi-bin/jra1mw.cgi',
);

# key:      internal package name (arguments, ...)
# 'pkg':    pkg-config name
# 'prefix': used when pkg-config fails
my %externs = (
	cares => {
		prefix => '/opt/c-ares',
		pkg => 'libcares'
	},
	classads => {
		prefix=> '/usr',
		pkg => 'classads'
	},
	cppunit => {
		prefix=> '/usr',
		pkg => 'cppunit'
	},
	expat => {
		prefix=> '/usr',
		pkg => 'expat'
	},
	globus => {
		prefix=> '/opt/globus',
		pkg => 'globus-gssapi-gsi'
	},
	'myproxy-devel' => {
		prefix=> '/opt/globus',
		pkg => 'myproxy'
	},
	'myproxy-server' => {
		prefix=> '',
	},
	'myproxy-admin' => {
		prefix=> '',
	},
	gsoap => {
		prefix=> '/usr',
		pkg => 'gsoap'
	},
	gsoapxx => {
		prefix=> '/usr',
		pkg => 'gsoap++'
	},
	mysql => {
		prefix=> '/usr'
	},
	'mysql-devel' => {
		prefix=> ''
	},
	'mysql-server' => {
		prefix => ''
	},
	voms => {
		prefix => '/opt/glite',
		pkg => 'voms-2.0'
	},
	gridsite => {
		prefix => '/opt/glite'
	},
	lcas => {
		prefix => '/opt/glite',
		pkg => 'lcas'
	},
	trustmanager => {
		prefix => '/opt/glite'
	},
	trustmanager_axis => {
		prefix => '/opt/glite'
	},
	utiljava => {
		prefix=> '/opt/glite'
	},
	ant => {
		prefix=> '/usr'
	},
	jdk => {
		prefix=> '/usr/java/latest',
		locations => [ '/usr/lib/jvm/java', '/usr/lib/jvm/default-java', '/usr/java/latest' ],
	},
	libtar => {
		prefix=> '/usr'
	},
	axis => {
		prefix=> '/usr'
	},
	log4c => {
		prefix=> '/usr'
	},
	postgresql => {
		prefix=> '/usr'
	},
	activemq => {
		prefix=>'/opt/activemq-cpp-library',
		pkg => 'activemq-cpp'
	},
);

my %jar = (
	'jakarta-commons-codec' => '/usr/share/java/commons-codec.jar',
	'jakarta-commons-lang' => '/usr/share/java/commons-lang.jar',
);


my %glite_prefix;
my %need_externs;
my %need_externs_type;
my %need_jars;
my %extrafull;
my %extranodmod;
my %deps;
my %deps_type;
my %buildroot;
my (%etics_externs, %etics_projects);

#
# modules of the subsystems
#
# additional modules from $project{modules} are automatically added
#
my %lbmodules = (
	'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim logger-msg nagios client-devel client-progs common-devel logger-devel state-machine-devel/], 
	'lbjp-common' => [qw/db log maildir server-bones trio jp-interface gss gsoap-plugin db-devel log-devel maildir-devel server-bones-devel trio-devel jp-interface-devel gss-devel gsoap-plugin-devel/],
	'jobid' => [qw/api-c api-c-devel api-cpp api-cpp-devel api-java/],
	'jp' => [ qw/client doc index primary server-common ws-interface/ ],
	'gridsite' => [ qw/apache libs commands core devel slashgrid services service-clients gsexec/ ],
	'px' => [ qw/proxyrenewal myproxy-yaim proxyrenewal-devel proxyrenewal-progs/ ],
	'canl' => [ qw/c c-devel/ ],
	);

#
# sub-packages
#
# modify %lbmodules, %deps_aux, %extrafull, and %properties accodingly
#
my %subpackages = (
	'jobid.api-c-devel' => 'jobid.api-c',
	'jobid.api-cpp-devel' => 'jobid.api-cpp',
	'lbjp-common.db-devel' => 'lbjp-common.db',
	'lbjp-common.gsoap-plugin-devel' => 'lbjp-common.gsoap-plugin',
	'lbjp-common.gss-devel' => 'lbjp-common.gss',
	'lbjp-common.jp-interface-devel' => 'lbjp-common.jp-interface',
	'lbjp-common.log-devel' => 'lbjp-common.log',
	'lbjp-common.maildir-devel' => 'lbjp-common.maildir',
	'lbjp-common.server-bones-devel' => 'lbjp-common.server-bones',
	'lbjp-common.trio-devel' => 'lbjp-common.trio',
	'lb.client-progs' => 'lb.client',
	'lb.client-devel' => 'lb.client',
	'lb.common-devel' => 'lb.common',
	'lb.logger-devel' => 'lb.logger',
	'lb.state-machine-devel' => 'lb.state-machine',
	'px.proxyrenewal-devel' => 'px.proxyrenewal',
	'px.proxyrenewal-progs' => 'px.proxyrenewal',
	'canl.c-devel' => 'canl.c',
);

my @opts = (
	'prefix:s' => \$prefix,
	'staged=s' => \$staged,
	'module=s' => \$module,
	'thrflavour:s' => \$thrflavour,
	'nothrflavour:s' => \$nothrflavour,
	'mode=s' => \$mode,
	'listmodules=s' => \$listmodules,
	'version=s' => \$force_version,
	'branch=s' => \$branch,
	'output=s' => \$output,
	'stage=s' => \$stagedir,
	'root:s' => \$root,
	'sysroot:s' => \$sysroot,
	'sysconfdir=s' => \$sysconfdir,
	'localstatedir=s' => \$localstatedir,
	'lb-tag=s' => \$lb_tag,
	'lbjp-common-tag=s' => \$lbjp_tag,
	'jp-tag=s' => \$jp_tag,
	'jobid-tag=s' => \$jobid_tag,
	'canl-tag=s' => \$canl_tag,
	'help' => \$help,
	'libdir=s' => \$libdir,
	'project=s' => \$project,
	'debug' => \$debug,
);

for (@nodes) {
	$enable_nodes{$_} = 0;
	$disable_nodes{$_} = 0;
	
	push @opts,"disable-$_",\$disable_nodes{$_};
	push @opts,"enable-$_",\$enable_nodes{$_};
}

push @opts,"with-$_=s",\$externs{$_}{withprefix} for keys %externs;
push @opts,"with-$_=s",\$jar{$_} for keys %jar;

my @keeparg = @ARGV;

GetOptions @opts or die "Errors parsing command line\n";
$prefix=~s/\/$//;
$root=~s/\/$//;
$sysroot=~s/\/$//;
if (not $sysconfdir) { $sysconfdir = $prefix eq '/usr' ? '/etc' : "$prefix/etc"; }
if (not $localstatedir) { $localstatedir = $prefix eq '/usr' ? '/var' : "$prefix/var"; }
$sysconfdir=~s/\/$//;
$localstatedir=~s/\/$//;

$externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-server'}{prefix} eq '';
$externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq '';
$externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq '';

$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq '';
$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq '';
$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq '';

if ($project =~ /^([^0-9]*)(.*)$/) {
	$project = $1;
	$project_version = $2;
}
%project = %{$projects{$project}};
$project_version = $project{current_version} unless $project_version;
if ($project ne 'emi' or $project_version <= 1) {
	$lbmodules{'gridsite'} = [ qw/apache shared commands core devel slashgrid services service-clients gsexec/ ];
}
for my $platform (keys %{$project{etics_externs}}) {
	for $_ (keys %{$project{etics_externs}{$platform}}) {
		$etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_};
	}
}
reshuffle_platforms(\%etics_externs, $project{supported_platforms});
reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms});
for $_ (keys %{$project{etics_projects}}) {
	$etics_projects{$_} = $project{etics_projects}{$_};
}
for $_ (keys %{$project{need_externs_aux}}) {
	$need_externs_aux{$_} = $project{need_externs_aux}{$_};
}
for my $ext (keys %need_externs_aux) {
	for (@{$need_externs_aux{$ext}}) {
		my ($pkg, $type) =/([^:]*)(?::(.*))?/;
		$type = 'BR' unless ($type);

		push @{$need_externs{$ext}},$pkg;
		$need_externs_type{$ext}->{$pkg} = $type;
	}
}
if ($project eq 'emi') {
	$extranodmod{lb} = 'lb.emi-lb';
	$extranodmod{px} = 'px.emi-px';
}
for $_ (keys %{$project{modules}}) {
	push @{$lbmodules{$_}},@{$project{modules}{$_}};
}


if ($help) { usage(); exit 0; }

if ($listmodules) {
	my $name_prefix = ($listmodules eq 'gridsite' and $project eq 'glite') ? 'org' : $project{etics_name};
	my @m;

	if (exists $lbmodules{$listmodules}) {
		@m = map exists $subpackages{$listmodules . '.' . $_} ? "" : "$name_prefix.$listmodules.$_",@{$lbmodules{$listmodules}};
	} else {
		if ($project eq 'emi' and $project_version == 1) {
			# no sub-packages in EMI-1
		} else {
			for my $sub (keys %subpackages) {
				push @m, $sub if ($subpackages{$sub} eq $listmodules);
			}
		}
	}
	print map $_ eq "" ? "" : "$_ ", @m;
	print "\n";
	exit 0;
}

warn "$0: --branch and --output make sense only in --mode=etics\n"
	if ($output || $branch) && $mode ne 'etics';

my $en;
for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }

my $dis;
for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }

die "--enable-* and --disable-* are mutually exclusive\n"
	if $en && $dis;

die "--module cannot be used with --enable-* or --disable-*\n"
	if $module && ($en || $dis);

die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},{$lbmodules{jp}};

if ($dis) {
	for (@nodes) {
		$enable_nodes{$_} = 1 unless ($disable_nodes{$_} or not $default_nodes{$_});
	}
}

if (!$en && !$dis) { for (@nodes) { $enable_nodes{$_} = 1 if ($default_nodes{$_}) } };

for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }

$stagedir = $root unless $stagedir;
$stagedir=~s/\/$// if ($stagedir);

if ($mode eq 'build') { for my $ext (keys %externs) {
	if (defined $externs{$ext} and defined $externs{$ext}{withprefix}) { $externs{$ext}{prefix} = $externs{$ext}{withprefix}; }
	elsif (defined $externs{$ext}{pkg}) {
		my ($flag, $env, $cmd, $ret);
		my $pkg = $externs{$ext}{pkg};
		my $flagname = uc $externs{$ext}{pkg};
		$flagname =~ s/-[0-9\.]*$//;
		$flagname =~ y/-\+/_X/;

		print "Checking $pkg ... ";
		$env = "PKG_CONFIG_PATH=$pkg_config_env$stagedir$prefix/$libdir/pkgconfig";
		$cmd = "$env pkg-config $pkg --exists >/dev/null";
		`$cmd`; $ret = $?;
		print "('$cmd' => $ret)\n" if ($debug);
		if ($ret == 0) {
			$externs{$ext}{prefix}=`$env pkg-config $pkg --variable=prefix`;
			chomp $externs{$ext}{prefix};
			print "$externs{$ext}{prefix}\n";

			$flag=`$env pkg-config $pkg --cflags`;
			$externs{$ext}{flags} .= "${flagname}_CFLAGS=$flag" if ($flag);
			$flag=`$env pkg-config $pkg --libs`;
			$externs{$ext}{flags} .= "${flagname}_LIBS=$flag" if ($flag);
		} else {
			print "(using default $externs{$ext}{prefix})\n";
		}
		print "\n" if ($debug);
	}
	elsif ($ext eq 'jdk') {
		my $jdk_prefix;

		print "Looking for some caffein ... ";
		if (defined($ENV{'JDK_HOME'}) and -f "$ENV{'JDK_HOME'}/include/jni.h") {
			$jdk_prefix = $ENV{'JDK_HOME'};
			print "JDK_HOME=$jdk_prefix\n";
		} elsif (defined($ENV{'JAVA_HOME'}) and -f "$ENV{'JAVA_HOME'}/include/jni.h") {
			$jdk_prefix = $ENV{'JAVA_HOME'};
			print "JAVA_HOME=$jdk_prefix\n";
		} else {
			foreach my $i (0..$#{$externs{$ext}{locations}}) {
				if (-e $externs{$ext}{locations}[$i] and -f "$externs{$ext}{locations}[$i]/include/jni.h") {
					$jdk_prefix=$externs{$ext}{locations}[$i];
					print "(found directory $jdk_prefix)\n";
					last;
				}
			}
			print "(using default $externs{$ext}{prefix})\n" unless ($jdk_prefix);
		}
		$externs{$ext}{prefix} = $jdk_prefix if ($jdk_prefix);
	}
} }

if ($mode eq 'build') {
	print "Writing config.status\n";
	open CONF,">config.status" or die "config.status: $!\n";
	for ('JDK_HOME', 'JAVA_HOME', 'PKG_CONFIG_PATH') {
		print CONF "$_=$ENV{$_} " if (defined $ENV{$_});
	}
	print CONF "$0 @keeparg\n";
	close CONF;
}


my @modules;
my %aux;

if ($module) {
#	push @modules,split(/[,.]+/,$module);
	push @modules,$module;
}
else {
	@modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
	
	my $n;

	do {
		local $"="\n";
 		$n = $#modules;
		push @modules,(map @{$deps{$_}},@modules);

		undef %aux; @aux{@modules} = (1) x ($#modules+1);
		@modules = keys %aux;
	} while ($#modules > $n);
}

@aux{@modules} = (1) x ($#modules+1);
delete $aux{$_} for (split /,/,$staged);
@modules = keys %aux;

mode_build() if $mode eq 'build';
mode_checkout() if $mode eq 'checkout';
mode_etics($module) if $mode eq 'etics';

sub mode_build {
	print "\nBuilding modules: @modules\n";
	print "Mode: "; print $module ? "single module" : "multiple modules"; print "\n";
	
	my @ext = map @{$need_externs{$_}},@modules;
	my @myjars = map @{$need_jars{$_}},@modules;
	undef %aux; @aux{@ext} = 1;
	@ext = keys %aux;
	undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
	@myjars = keys %aux;
	
	print "\nRequired externals:\n";
	print "\t$_: ".($externs{$_}{prefix}?$externs{$_}{prefix}:'-')."\n" for @ext;
	print "\t$_: $jar{$_}\n" for @myjars;
	for (@ext) { if (defined($externs{$_}{flags})) { print "$externs{$_}{flags}"; } };
	print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";

	mkinc($_) for @modules;

	if ($module) {
		print "Not creating summary Makefile\n" if $debug;
	} else {
		print "Creating Makefile\n";

		open MAK,">Makefile" or die "Makefile: $!\n";

		print MAK "all: @modules\n\n";
		print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n";
		print MAK "clean check install:\n";

		for (@modules) {
			my $full = full($_);
			print MAK "\tcd $full/$buildroot{$_} && \${MAKE} \$@\n"
		}

		print MAK "\ndistclean:\n";

		for (@modules) {
			my $full = full($_);
			print MAK $buildroot{$_} eq '' ?
				"\tcd $full && \${MAKE} distclean\n" :
				"\trm -rf $full/$buildroot{$_}\n"
		}

		print MAK "\n";

		for (@modules) {
			my %ldeps; undef %ldeps;
			@ldeps{@{$deps{$_}}} = 1;
			for my $x (split /,/,$staged) { delete $ldeps{$x}; }
			my @dnames = $module ? () : keys %ldeps;
			my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage';

			my $full = full($_);
			my $build = $buildroot{$_};

			print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n";
			print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n";
		}

		close MAK;
	}
}
	
sub mode_checkout() {
	for (@modules) {
		my $module = $_;
		my $tag = "";
		if ($lb_tag){
			for (@{$lbmodules{lb}}){
				if ("lb.".$_ eq $module){
					$tag = '-r '.$lb_tag;
				}
			}	
		}
		if ($lbjp_tag) {
			for (@{$lbmodules{'lbjp-common'}}){
				if ("lbjp-common.".$_ eq $module){
                                        $tag = '-r '.$lbjp_tag;
                                }
			}
		}
		if ($jp_tag){
			for (@{$lbmodules{'jp'}}){
	                        if ("jp.".$_ eq $module){
                                        $tag = '-r '.$jp_tag;
	                        }
                        }
		}
		if ($jobid_tag){
			for (@{$lbmodules{jobid}}){
				if ("jobid.".$_ eq $module){
                                        $tag = '-r '.$jobid_tag;
                                }
			}
		}
		if ($canl_tag) {
			for (@{$lbmodules{'canl'}}){
				if ("canl.".$_ eq $module){
                                        $tag = '-r '.$canl_tag;
                                }
			}
		}
		#if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
		#	print "found";
		#}
		$_ = full($_);
		print "\n*** Checking out $_\n";
		system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
	}
}

BEGIN{
%etics_externs = (
	default => {
		'myproxy-devel'=>'myproxy-devel',
		'myproxy-server'=>'myproxy-server',
		'myproxy-admin'=>'myproxy-admin',
		cares=>'c-ares',
		utiljava=>'org.glite.security.util-java',
		gpt=>'gpt',
		fetchcrl=>'fetch-crl',
		activemq=>'activemq-cpp-library',
	},
);

%etics_projects = (
);

%need_externs_aux = (
	'lb.client' => [ qw/cppunit:B classads:B libtool:B globus:B pkgconfig:B/ ],
	'lb.common' => [ qw/expat cares:B cppunit:B classads:B libtool:B globus:B pkgconfig:B/ ],
	'lb.doc' => [ qw/tetex-latex:B/ ],
	'lb.logger' => [ qw/cppunit:B libtool:B globus:B pkgconfig:B/ ],
	'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B globus:B pkgconfig:B/ ],
	'lb.nagios' => [ qw/globus_proxy_utils:R/ ],
	'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql-server:R cppunit:B gsoap:B classads:B voms:B lcas gridsite:B bison:B libtool:B libxml2 flex:B pkgconfig:B/ ],
	'lb.state-machine' => [ qw/classads:B libtool:B libxslt:B expat:B globus:B pkgconfig:B/ ],
	'lb.utils' => [ qw/cppunit:B libtool:B globus:B pkgconfig:B/ ],
	'lb.ws-interface' => [ qw/libxslt:B tidy:B/ ],
	'lb.ws-test' => [ qw/gsoap:B libtool:B globus:B pkgconfig:B/ ],
	'lb.types' => [ qw// ],
	'lb.harvester' => [ qw/docbook-utils:B libtool:B globus:B pkgconfig:B/ ],
	'lbjp-common.db' => [ qw/mysql-devel:B postgresql:B cppunit:B log4c:B libtool:B pkgconfig:B/ ],
	'lbjp-common.log' => [ qw/log4c libtool:B/ ],
	'lbjp-common.maildir' => [ qw/libtool:B/ ],
	'lbjp-common.server-bones' => [ qw/libtool:B/ ],
	'lbjp-common.trio' => [ qw/cppunit:B libtool:B pkgconfig:B/ ],
	'lbjp-common.jp-interface' => [ qw/cppunit:B log4c:B libtool:B pkgconfig:B/ ],
	'lbjp-common.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B pkgconfig:B/ ],
	'lbjp-common.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B pkgconfig:B/ ],
	'jobid.api-c' =>  [ qw/cppunit:B libtool:B openssl:B pkgconfig:B/ ],
	'jobid.api-cpp' =>  [ qw/cppunit:B libtool:B pkgconfig:B/ ],
	'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
	'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B pkgconfig:B/ ],
        'jp.doc' => [],
        'jp.index' => [ qw/gsoap globus_essentials:R globus:B mysql-server:R pkgconfig:B/ ],
        'jp.primary' => [ qw/classads:B gsoap libtar globus_essentials:R globus:B  mysql-server:R pkgconfig:B/ ],
        'jp.server-common' => [],
        'jp.ws-interface' => [],
	'gridsite.core' => [ qw/httpd-devel:B gsoap:B globus:B curl:B doxygen:B fuse-devel:B libxml2:B openssl:B doxygen:B pkgconfig:B/ ],
	'gridsite.commands' => [ qw/curl:R openssl:R/ ],
	'gridsite.apache' => [ qw/libxml2:R openssl:R curl:R/ ],
	'gridsite.libs' => [ qw/libxml2:R openssl:R/ ],
	'gridsite.shared' => [ qw/libxml2:R openssl:R/ ],
	'gridsite.devel' => [ qw// ],
	'gridsite.slashgrid' => [ qw/curl:R fuse:R/],
	'gridsite.services' => [ qw/curl:R gsoap:R/ ],
	'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ],
	'gridsite.gsexec' => [ qw// ],
	'gridsite.1.5-compat' => [ qw/httpd-devel:B gsoap:B globus:B curl:B doxygen:B fuse-devel:B libxml2:B openssl:B doxygen:B/ ],
	'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B voms:B libtool:B pkgconfig:B/ ],
	'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec
	'canl.c' => [ qw/cares:B openssl:B libtool:B bison:B flex:B krb5-devel:B pkgconfig:B tetex-latex:B/ ],
);

%need_jars = (
	'jobid.api-java' => [ qw/jakarta-commons-codec/ ],
	'lb.client-java' => [ qw/jakarta-commons-lang/ ],
);

for my $jar (keys %need_jars) {
	for (@{$need_jars{$jar}}) {
		$need_externs_type{$jar}->{$_} = 'BR'; 	# XXX
	}
}

%deps_aux = (
	'lb.client' => [ qw/
		lb.types:B lb.common
		lbjp-common.trio
		jobid.api-cpp:B jobid.api-c
		lbjp-common.gss
	/ ],
	'lb.client-java' => [ qw/
		lb.types:B
		lb.ws-interface:B
		jobid.api-java
	/ ],
	'lb.common' => [ qw/
		jobid.api-cpp:B jobid.api-c
		lb.types:B lbjp-common.trio lbjp-common.gss
	/ ],
	'lb.doc' => [ qw/lb.types:B/ ],
	'lb.logger' => [ qw/
		lbjp-common.trio
		lbjp-common.log
		jobid.api-c
		lb.common
		lbjp-common.gss
	/ ],
	'lb.logger-msg' => [ qw/
		lb.logger:B
	/ ],
	'lb.nagios' => [ qw/
		lb.client:R
		lb.ws-test:R
		lb.utils:R
	/ ],
	'lb.server' => [ qw/
		lb.ws-interface lb.types:B lb.common lb.state-machine lb.utils:R
		lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log
		jobid.api-c
		lbjp-common.gsoap-plugin lbjp-common.gss
	/ ],
	'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface lbjp-common.gss/ ],
	'lb.utils' => [ qw/
		lbjp-common.jp-interface
		jobid.api-c
		lbjp-common.trio lbjp-common.maildir
		lb.client lb.state-machine lb.types:B
	/ ],
	'lb.ws-test' => [ qw/lbjp-common.gsoap-plugin lb.ws-interface/ ],
	'lb.ws-interface' => [ qw/lb.types:B/ ],
	'lb.types' => [ qw// ],
	'lb.harvester' => [ qw/
		jobid.api-c lbjp-common.trio lbjp-common.db lb.common lb.client
		lbjp-common.gss lbjp-common.log
	/ ],
	'lb.yaim' => [ qw// ],
	'lb.glite-LB' => [ qw/
		lb.logger:R lb.server:R lb.utils:R lb.doc:R
		lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R
		lb.logger-msg:R
	/ ],
	'lb.emi-lb' => [ qw/
		lb.logger:R lb.server:R lb.utils:R lb.doc:R
		lb.ws-test:R lb.harvester:R lb.yaim:R lb.client-java:R
		lb.logger-msg:R
	/ ],
	'lbjp-common.db' => [ qw/lbjp-common.trio lbjp-common.log/ ],
	'lbjp-common.maildir' => [ qw// ],
	'lbjp-common.log' => [ qw// ],
	'lbjp-common.server-bones' => [ qw/lbjp-common.log/ ],
	'lbjp-common.trio' => [ qw// ],
	'lbjp-common.gss' =>  [ qw// ],
	'lbjp-common.gsoap-plugin' =>  [ qw/lbjp-common.gss/ ],
	'jobid.api-c' =>  [ qw// ],
	'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
	'jobid.api-java' =>  [ qw// ],

	'lbjp-common.jp-interface' => [ qw/lbjp-common.trio lbjp-common.db jobid.api-c/ ],

	'jp.client' => [ qw/
                jp.ws-interface
                lbjp-common.jp-interface lbjp-common.maildir
                jobid.api-c
                lbjp-common.gsoap-plugin
        / ],
	'jp.doc' => [ qw// ],
	'jp.index' => [ qw/
                jp.server-common jp.ws-interface
                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
                lbjp-common.gsoap-plugin
        / ],
	'jp.primary' => [ qw/
                jobid.api-c
                jp.server-common jp.ws-interface
                lb.state-machine
                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
                lbjp-common.gsoap-plugin
        / ],
	'jp.server-common' => [ qw/ 
                lbjp-common.jp-interface lbjp-common.db
        / ],
	'jp.ws-interface' => [ qw// ],

	'gridsite.core' => [ qw// ],
	'gridsite.commands' => [ qw/gridsite.core:B/ ],
	'gridsite.apache' => [ qw/gridsite.core:B/ ],
	'gridsite.libs' => [ qw/gridsite.core:B / ],
	'gridsite.shared' => [ qw/gridsite.core:B / ],
	'gridsite.devel' => [ qw/gridsite.core:B/ ],
	'gridsite.slashgrid' => [ qw/gridsite.core:B/],
	'gridsite.services' => [ qw/gridsite.core:B/ ],
	'gridsite.service-clients' => [ qw/gridsite.core:B/ ],
	'gridsite.gsexec' => [ qw/gridsite.core:B/ ],

	'px.proxyrenewal' => [ qw// ],
	'px.glite-PX' => [qw/px.myproxy-yaim:R/],
	'px.emi-px' => [qw/px.myproxy-yaim:R/],
	'px.myproxy-yaim' => [ qw// ],
	'px.myproxy-config' => [],

	'canl.c' => [],

	# sub-packages (virtual ETICS components depending on the main)
	'jobid.api-c-devel' => [ qw/jobid.api-c:B/ ],
	'jobid.api-cpp-devel' => [ qw/jobid.api-cpp:B/ ],
	'lbjp-common.db-devel' => [ qw/lbjp-common.db:B/ ],
	'lbjp-common.gsoap-plugin-devel' => [ qw/lbjp-common.gsoap-plugin:B/ ],
	'lbjp-common.gss-devel' => [ qw/lbjp-common.gss:B/ ],
	'lbjp-common.jp-interface-devel' => [ qw/lbjp-common.jp-interface:B/ ],
	'lbjp-common.log-devel' => [ qw/lbjp-common.log:B/ ],
	'lbjp-common.maildir-devel' => [ qw/lbjp-common.maildir:B/ ],
	'lbjp-common.server-bones-devel' => [ qw/lbjp-common.server-bones:B/ ],
	'lbjp-common.trio-devel' => [ qw/lbjp-common.trio:B/ ],
	'lb.client-progs' => [ qw/lb.client:B/ ],
	'lb.client-devel' => [ qw/lb.client:B/ ],
	'lb.common-devel' => [ qw/lb.common:B/ ],
	'lb.logger-devel' => [ qw/lb.logger:B/ ],
	'lb.state-machine-devel' => [ qw/lb.state-machine:B/ ],
	'px.proxyrenewal-devel' => [ qw/px.proxyrenewal:B/ ],
	'px.proxyrenewal-progs' => [ qw/px.proxyrenewal:B/ ],
	'canl.c-devel' => [ qw/canl.c:B/ ],
);

for my $ext (keys %deps_aux) {
	for (@{$deps_aux{$ext}}) {
		/([^:]*)(?::(.*))?/;
		push @{$deps{$ext}},$1;
		my $type = $2 ? $2 : 'BR';
		$deps_type{$ext}->{$1} = $type;
	}
}


%extrafull = (
	gridsite=>'org.gridsite.core',
	'canl.c' => 'emi.canl.canl-c',
	'canl.c-devel' => 'emi.canl.canl-c',
	'jobid.api-c-devel' => 'org.glite.jobid.api-c',
	'jobid.api-cpp-devel' => 'org.glite.jobid.api-cpp',
	'lbjp-common.db-devel' => 'org.glite.lbjp-common.db',
	'lbjp-common.gsoap-plugin-devel' => 'org.glite.lbjp-common.gsoap-plugin',
	'lbjp-common.gss-devel' => 'org.glite.lbjp-common.gss',
	'lbjp-common.jp-interface-devel' => 'org.glite.lbjp-common.jp-interface',
	'lbjp-common.log-devel' => 'org.glite.lbjp-common.log',
	'lbjp-common.maildir-devel' => 'org.glite.lbjp-common.maildir',
	'lbjp-common.server-bones-devel' => 'org.glite.lbjp-common.server-bones',
	'lbjp-common.trio-devel' => 'org.glite.lbjp-common.trio',
	'lb.client-devel' => 'org.glite.lb.client',
	'lb.client-progs' => 'org.glite.lb.client',
	'lb.common-devel' => 'org.glite.lb.common',
	'lb.logger-devel' => 'org.glite.lb.logger',
	'lb.state-machine-devel' => 'org.glite.lb.state-machine',
	'px.proxyrenewal-devel' => 'org.glite.px.proxyrenewal',
	'px.proxyrenewal-progs' => 'org.glite.px.proxyrenewal',
);

#( java => 'client-java' );
%extranodmod = (
	db => 'lbjp-common.db',
	jpprimary => 'jp.primary',
	jpindex => 'jp.index',
	jpclient => 'jp.client',
	lb => 'lb.glite-LB',
	px => 'px.glite-PX',
	proxyrenewal => 'px.proxyrenewal',
	canl => 'canl.c',
);

%obsoletes = (
	'lb.yaim' => [ qq/glite-yaim-lb/ ],
	'px.proxyrenewal' => [ qq/glite-security-proxyrenewal/ ],
	'px.myproxy-yaim' => [ qq/glite-yaim-myproxy/ ],
	'px.myproxy-config' => [ qq/myproxy-config/ ], # in myproxy-config.spec
	'lbjp-common.gss' => [ qq/glite-security-gss/ ],
	'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ],
);

%conflicts = (
);

%provides = (
	'lbjp-common.gss' => [ qq/glite-security-gss/ ],
	'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ],
	'lb.nagios' => [ qq/glite-lb-nagios-plugins/ ],
);

%cvs_prefix = (
	'lb' => 'org.glite',
	'jp' => 'org.glite',
	'jobid' => 'org.glite',
	'lbjp-common' => 'org.glite',
	'gridsite' => 'org',
	'px' => 'org.glite',
	'canl' => 'emi',
);

%cvs_tag_prefix = (
	'lb' => 'glite-',
	'jp' => 'glite-',
	'jobid' => 'glite-',
	'lbjp-common' => 'glite-',
	'gridsite' => '',
	'px' => 'glite-',
	'canl' => 'emi-',
);

# ==== projects specification ====
# etics_name ........... ETICS project name
# conf_prefix .......... ETICS configurations name prefix
# tag_prefix ........... VCS tag prefix
# local_prefix ......... prefix (relative to stage)
# etics_externs ........ ETICS modules names of externals
#                        (${NAME.location}, ETICS conf. dependencies)
# etics_projects ....... ETICS project names of externals
# etics_externs_devel .. ETICS modules names of devel versions of externals
# etics_locations ...... ETICS locations in ${NAME.location} properties
# need_externs_aux ..... project-specific external dependencies
# supported_platforms .. platforms supported by the project
# modules .............. additional modules in subsystems
%projects = (
	glite => {
		current_version => 3,
		etics_name => 'org.glite',
		conf_prefix => { %cvs_tag_prefix },
		tag_prefix => { %cvs_tag_prefix },
		flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}',
		local_prefix => '',
		etics_externs => {
			default => {
				globus_essentials=>'vdt_globus_essentials',
				globus=>'globus',
				globus_proxy_utils=>'vdt_globus_essentials',
				gridsite=>'org.gridsite.libs',
				yaim_core=>'org.glite.yaim.core',
				gip_release=>'glite-info-provider-release',
				gip_service=>'glite-info-provider-service',
				bdii=>'bdii',
				glite_version=>'glite-version',
				glite_info_templates=>'glite-info-templates',
				glue_schema=>'glue-schema',
				trustmanager=>'org.glite.security.trustmanager',
				axis=>'axis',
				lcas=>'org.glite.security.lcas',
				gsoapxx=>'-',
				jdk=>'jdk',
				voms=>'org.glite.security.voms-api-cpp',
			},
		},
		etics_externs_devel => {
			default => {
				gridsite=>'org.gridsite.devel',
				voms=>'org.glite.security.voms-api',
			},
		},
		etics_projects => {
			vdt=>[qw/globus globus_essentials globus_proxy_utils gpt/],
			'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/],
		},
		etics_locations => {
			'*' => '',
		},
		need_externs_aux => {
			'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ],
			'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ],
			'lb.yaim' => [ qw/yaim_core:R/ ],
			'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/],
			'px.myproxy-yaim' => [ qw/yaim_core:R/ ],
		},
		supported_platforms => {
			sl5_x86_64_gcc412 => 1,
			sl5_ia32_gcc412 => 1,
			deb5_x86_64_gcc432 => 1,
			deb5_ia32_gcc432 => 1,
			slc4_x86_64_gcc346 => 1,
			slc4_ia32_gcc346 => 1,
		},
		modules => {
			'lb' => [ qw/glite-LB/ ],
			'px' => [ qw/glite-PX/ ],
		},
	},

	emi => {
		current_version => 2,
		etics_name => 'emi',
		conf_prefix => {
			'lb' => 'emi-',
			'jp' => 'emi-',
			'jobid' => 'emi-',
			'lbjp-common' => 'emi-',
			'gridsite' => 'emi-',
			'px' => 'emi-',
			'canl' => 'emi-',
		},
		tag_prefix => { %cvs_tag_prefix },
		flavours => '--thrflavour= --nothrflavour=',
		local_prefix => '/usr',
		etics_externs => {
			default => {
				globus_essentials=>'globus-gssapi-gsi',
				globus=>'globus-gssapi-gsi-devel',
				globus_proxy_utils=>'globus-proxy-utils',
				gridsite=>'emi.gridsite.libs',
				yaim_core=>'emi.yaim.yaim-core',
				yaim_bdii=>'emi.bdii.yaim-bdii',
				gip_service=>'emi.bdii.glite-info-provider-service',
				bdii=>'emi.bdii.core',
				glite_version=>'emi.emi-version',
				glue_schema=>'emi.bdii.glue-schema',
				trustmanager=>'emi.java-security.trustmanager',
				trustmanager_axis=>'emi.java-security.trustmanager-axis',
				axis=>'axis1.4',
				lcas=>'emi.sac.lcas',
				gsoapxx=>'-',
				jdk=>'java',
				voms => 'emi.voms.voms-api',
			},
			sl5_x86_64_gcc412EPEL => {
				'myproxy-devel' => 'myproxy-devel.x86_64',
			},
			sl6_x86_64_gcc446EPEL => {
				'myproxy-devel' => 'myproxy-devel.x86_64',
			},
			deb6_x86_64_gcc445 => {
				axis => 'axis1.4',
				# mappings in ETICS project configuration
				#globus_essentials => 'libglobus-gssapi-gsi4',
				#globus => 'libglobus-gssapi-gsi-dev',
				#axis => 'libaxis-java',
				#cares => 'libc-ares2',
				#cppunit => 'libcppunit',
				#expat => 'libexpat1',
				#log4c => 'liblog4c3',
				#curl => 'libcurl3',
				#'mysql' => 'libmysqlclient16',
				#'mysql-devel' => 'libmysqlclient-dev',
				#libxslt => 'xsltproc',
				#'jakarta-commons-codec' => 'libcommons-codec-java',
				#'jakarta-commons-lang' => 'libcommons-lang-java',
				#'tetex-latex' => 'texlive-latex-extra',
				#'perl-LDAP' => 'libnet-ldap-perl',
				#'fuse-lib' => 'libfuse2',
				#'fuse' => 'fuse-utils',
			},
		},
		etics_externs_devel => {
			default => {
				cares => 'c-ares-devel',
				classads => 'classads-devel',
				cppunit => 'cppunit-devel',
				expat => 'expat-devel',
				gsoap => 'gsoap-devel',
				voms => 'emi.voms.voms-api-devel',
				libtar => 'libtar-devel',
				log4c => 'log4c-devel',
				postgresql => 'postgresql-devel',
				curl => 'curl-devel',
				libxml2 => 'libxml2-devel',
				openssl => 'openssl-devel',
				gridsite=>'emi.gridsite.devel',
				jdk=>'java-devel',
			},
			deb6_x86_64_gcc445 => {
				# mappings in ETICS project configuration
				#cares => 'libc-ares-dev',
				#cppunit => 'libcppunit-dev',
				#expat => 'libexpat1-dev',
				#libtar => 'libtar-dev',
				#log4c => 'liblog4c-dev',
				#postgresql => 'libpq-dev',
				#curl => 'libcurl4-openssl-dev',
				#libxml2 => 'libxml2-dev',
				#openssl => 'libssl-dev',
				#'tetex-latex' => 'texlive-latex-extra',
				#libxslt=>'xsltproc',
				#'httpd-devel' => 'apache2-prefork-dev',
				#'fuse-devel' => 'libfuse-dev',
				#gsoap => 'gsoap',
				#'krb5-devel' => 'libkrb5-dev',
			},
		},
		etics_projects => {
			'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/],
		},
		etics_locations => {
			axis => 'axis',
		},
		need_externs_aux => {
			'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ],
			'lb.emi-lb' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ],
			'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R/ ],
			'px.emi-px' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/],
			'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ],
		},
		supported_platforms => {
			sl5_x86_64_gcc412EPEL => 1,
			sl5_ia32_gcc412EPEL => 1,
			sl6_x86_64_gcc446EPEL => 1,
			deb6_x86_64_gcc445 => 1,
		},
		modules => {
			'lb' => [ qw/emi-lb/ ],
			'px' => [ qw/emi-px/ ],
		},
	},
);

%platform_properties = (
	'jobid.api-java' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'lb.types' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'lb.doc' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'lb.ws-interface' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'lb.yaim' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'lb.nagios' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'px.yaim' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'px.myproxy-config' => {
		default => { 'package.buildarch' => 'noarch' },
	},
	'gridsite.devel' => {
		default => { 'packageName' => 'gridsite-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libgridsite-dev' },
	},
	'canl.c-devel' => {
		default => { 'packageName' => 'canl-c-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libcanl-dev' },
	},
	'jobid.api-c-devel' => {
		default => { 'packageName' => 'glite-jobid-api-c-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-jobid-dev' },
	},
	'jobid.api-cpp-devel' => {
		default => { 'packageName' => 'glite-jobid-api-cpp-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-jobid-cpp-dev' },
	},
	'lbjp-common.db-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-db-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-db-dev' },
	},
	'lbjp-common.gsoap-plugin-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-gsoap-plugin-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-gsoap-plugin-dev' },
	},
	'lbjp-common.gss-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-gss-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-gss-dev' },
	},
	'lbjp-common.jp-interface-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-jp-interface-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-jp-interface-dev' },
	},
	'lbjp-common.log-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-log-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-log-dev' },
	},
	'lbjp-common.maildir-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-maildir-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-maildir-dev' },
	},
	'lbjp-common.server-bones-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-server-bones-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-server-bones-dev' },
	},
	'lbjp-common.trio-devel' => {
		default => { 'packageName' => 'glite-lbjp-common-trio-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lbjp-common-trio-dev' },
	},
	'lb.client-devel' => {
		default => { 'packageName' => 'glite-lb-client-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lb-client-dev' },
	},
	'lb.common-devel' => {
		default => { 'packageName' => 'glite-lb-common-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lb-common-dev' },
	},
	'lb.state-machine-devel' => {
		default => { 'packageName' => 'glite-lb-state-machine-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lb-state-machine-dev' },
	},
	'lb.logger-devel' => {
		default => { 'packageName' => 'glite-lb-logger-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-lb-logger-dev' },
	},
	'px.proxyrenewal-devel' => {
		default => { 'packageName' => 'glite-px-proxyrenewal-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libglite-security-proxyrenewal-dev' },
	},
	'canl.c-devel' => {
		default => { 'packageName' => 'canl-c-devel' },
		deb6_x86_64_gcc445 => { 'packageName' => 'libcanl-c-dev' },
	},
);

my @k = keys %deps_aux;
@buildroot{@k} = ('') x ($#k+1);

$buildroot{'gridsite.core'} = 'src';
}

sub full
{
	my ($short) = @_;
	my $subsys = $short;
	$subsys =~ s/\..*//;

	my $cvs_prefix = exists $cvs_prefix{$subsys} ? $cvs_prefix{$subsys} : 'org.glite';
	return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
}

sub get_version
{
	my ($fmod, $top_srcdir) = @_;

	my ($subsys,$mod) = split /\./,$fmod,2;
	my ($major,$minor,$rev,$age);
	my $old_;

	if ($force_version) {
		$force_version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
		($major,$minor,$rev,$age) = ($1,$2,$3,$4);
	}
	else {
		my $path = "$top_srcdir/project";
		if ($subsys eq 'gridsite') {
			$path = "$cvs_prefix{$subsys}.$subsys.core/project";
		}
		open V,"$path/version.properties"
			or die "$path/version.properties: $!\n";

		$old_ = $_;
		while (<V>) {
			chomp;
			($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
			$age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
		}
		close V;
		$_ = $old_;
	}
	$version = "$major.$minor.$rev-$age";

	return ($major, $minor, $rev, $age);
}

sub get_description
{
	my ($top_srcdir) = @_;

	my $cvs_module = $top_srcdir;
	my $package_description = "";
	my $package_summary = "";

	if (-e "$cvs_module/project/package.description") {
		open V, "$cvs_module/project/package.description";
		$package_description = join ("", <V>);
		close V;
		chomp $package_description;
	}
	else {
		print STDERR "package.description not found for $subsys.$module!\n"; }

	if (-e "$cvs_module/project/package.summary") {
		open V, "$cvs_module/project/package.summary";
		$package_summary = join ("", <V>);
		close V;
		chomp $package_summary;
		$package_summary =~ s/\n/\\n/g;
	}
	else {
		print STDERR "package.summary not found for $subsys.$module!\n"; }

	return ($package_summary, $package_description);
}

sub mkinc
{
	my %aux;
	undef %aux;
	my @m=qw/
lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.logger-msg lb.nagios lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB lb.emi-lb
lbjp-common.gss lbjp-common.gsoap-plugin
jobid.api-c jobid.api-cpp jobid.api-java
lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface lbjp-common.gss lbjp-common.gsoap-plugin
jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
px.proxyrenewal px.myproxy-yaim px.glite-PX px.myproxy-config px.emi-px
canl.c
/;
	@aux{@m} = (1) x ($#m+1);

	my ($short) = @_;
	my $full = full $short;
	my ($subsys,$mod) = split /\./,$short,2;
	my $packageName = "$project{tag_prefix}{$subsys}$subsys-${mod}";

	unless ($aux{$short}) {
		print "Makefile.inc not needed in $full\n";
		return;
	}

	my $top_srcdir = '.';
	my $abs_srcdir = '';
	my $build = '';

	if ($module) {
		$top_srcdir = $0;
		$top_srcdir =~ s,/?[^/]*$,,;
		$abs_srcdir = $top_srcdir;
		$top_srcdir =~ s,^$,\.,;
	} else {
		$build = "$full/";
		$abs_srcdir = "$full/";
		unless ($buildroot{$_} eq '') {
			$top_srcdir = '..';
			$build .= "$buildroot{$_}/";
			unless (-d "$build") {
				mkdir "$build" or die "mkdir $build: $!\n";
			}
		}
	}

	my ($major, $minor, $rev, $age) = get_version $short, $abs_srcdir;
	my ($package_summary, $package_description) = get_description $abs_srcdir;
	if ($package_description) { $package_description =~ s/(.{1,78}\S|\S+)\s+/$1\n/mg; }
	my $package_description_debian = $package_description;
	$package_description_debian =~ s/^/ /mg;

	my ($old_locale, $specdate, $debdate);

	# files for ETICS always in root source directory
	mkdir $abs_srcdir."project" unless (-d $abs_srcdir."project");
	open PKGCHL,">".$abs_srcdir."project/changelog"
		or die $abs_srcdir."project/changelog: $!\n";
	$old_locale = setlocale(LC_TIME);
	setlocale(LC_TIME, "C");
	$specdate = strftime("%a %b %d %Y", gmtime());
	$debdate = strftime("%a, %d %b %Y %H:%M:%S %z", gmtime());
	setlocale(LC_TIME, $old_locale);
	print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
- automatically generated package
};
	close PKGCHL;

	unless ($top_srcdir eq '.') {
		unlink $build."Makefile";
		symlink "$top_srcdir/Makefile",$build."Makefile" or die "symlink $top_srcdir/Makefile ".$build."Makefile: $!\n";
	}

	open MKINC,">".$build."Makefile.inc"
		or die $build."Makefile.inc: $!\n";

	print "Creating ".$build."Makefile.inc\n";

	print MKINC qq{project = $project
PREFIX = $root
prefix = $prefix
stagedir = $stagedir
sysroot = $sysroot
sysconfdir = $sysconfdir
localstatedir = $localstatedir
thrflavour = $thrflavour
nothrflavour = $nothrflavour
libdir = $libdir
top_srcdir = $top_srcdir
};

	for (@{$need_externs{$short}}) {
		next unless defined $externs{$_} and defined $externs{$_}{prefix};
		print MKINC "${_}_prefix = $externs{$_}{prefix}\n";
		print MKINC "$externs{$_}{flags}" if defined $externs{$_}{flags};
	}

	for (@{$need_jars{$short}}) {
		print MKINC "${_}_jar = $jar{$_}\n"
	}

	my $need_gsoap = 0;
	for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }

	print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;

	close MKINC;

	my $dh;
	my $debian = 0;

	opendir $dh, "$abs_srcdir/project" || die "Can't open $abs_srcdir/project: $!";
	for my $dir (readdir $dh) {
		if ($dir=~/^(.*)\.spec$/) {
			if ($1 ne $packageName) {
				printf STDERR "Changed RPM name: $packageName --> $1\n" if ($debug);;
				$packageName=$1;
			}
			last;
		}
	}
	closedir $dh;

	for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog", "debian.copyright") {
		if (-f "$abs_srcdir/project/$file") {
			my $old_ = $_;
			printf STDERR "Creating $build$file\n" if ($debug);;
			open DST, ">$build$file";
			open SRC, "<$abs_srcdir/project/$file";
			while (<SRC>) {
				if (/\@MODULE\@/) { s/\@MODULE\@/$full/g; }
				if (/\@URL\@/) { s/\@URL\@/$package{url}/g; }
				if (/\@SUMMARY\@/) { s/\@SUMMARY\@/$package_summary/g; }
				if (/\@DESCRIPTION\@/) { s/\@DESCRIPTION\@/$package_description/g; }
				if (/\@DEBIAN_DESCRIPTION\@/) { s/\@DEBIAN_DESCRIPTION\@/$package_description_debian/g; }
				if (/\@VERSION\@/) { s/\@VERSION\@/$version/g; }
				if (/\@MAJOR\@/) { s/\@MAJOR\@/$major/g; }
				if (/\@MINOR\@/) { s/\@MINOR\@/$minor/g; }
				if (/\@REVISION\@/) { s/\@REVISION\@/$rev/g; }
				if (/\@AGE\@/) { s/\@AGE\@/$age/g; }
				if (/\@MAINTAINER\@/) { s/\@MAINTAINER\@/$package{maintainer}/g; }
				if (/\@UPLOADERS\@/) { s/\@UPLOADERS\@/$package{uploaders}/g; }
				if (/\@DEBIAN_VCS\@/) { s/\@DEBIAN_VCS\@/$package{debian_vcs}/g; }
				if (/\@DEBIAN_DATE\@/) { s/\@DEBIAN_DATE\@/$debdate/g; }
				if (/\@SPEC_DATE\@/) { s/\@SPEC_DATE\@/$specdate/g; }
				if (/^\s*.+\/configure\s/ and $force_version) {
					print "Version forced to $version\n" if ($debug);;
					s/--version\s+\S+\s?//;
					s/$/ --version $version/;
				}
				printf DST "%s", "$_";
			}
			close SRC;
			close DST;
			$_ = $old_;
		}
	}

	if ($module and -d $build."debian") {
		print "Skipping ${build}debian/ (no rewrite in single module mode)\n" if ($debug);
		`rm -f ${build}debian.*`;
	} else {
		print "Creating ${build}debian/\n" if ($debug);;

		`rm -rfv  ${build}debian`;
		mkdir $build."debian" or die $!;
		`cp $abs_srcdir/project/debian.* ${build}debian/ 2>/dev/null`;
		`mv ${build}debian.* ${build}debian/ 2>/dev/null`;
		`rm -f ${build}debian/*.orig`;
		opendir $dh, "${build}debian" || die "Can't open ${build}debian: $!";
		for $_ (readdir $dh) {
			if (/^debian\.(.*)/) {
				`mv ${build}debian/$_ ${build}debian/$1`;
				$debian = 1;
			}
		}
		closedir $dh;

		if ($debian) {
			my ($dir, $file);

			chmod 0755, "${build}debian/rules";
			$file="${build}debian/docs"; if (not -f $file) { `touch $file`; }
			$dir="${build}debian/source"; if (not -d $dir) { mkdir $dir; }
			$file="${build}debian/source/format"; if (not -f $file) { `echo "3.0 (quilt)" > $file` }
			$file="${build}debian/compat"; if (not -f $file) { `echo "7" > $file` }
			$file="${build}debian/changelog"; if (not -f $file) {
				open FH, ">$file" or die $!;
				print FH qq{$packageName ($major.$minor.$rev-$age) unstable; urgency=low

  * Automatically generated package

 -- $package{maintainer}  $debdate
};
				close FH;
			}

		} else {
			`rm -rf ${build}debian`;
		}
	}
}

BEGIN{
};

sub mode_etics_packaging {
	my ($fmod, $cmd, $rpmprepare, $debprepare) = @_;
	my ($workspaceDir, $srcPackageName, $srcAge, $topDir);

	# old-school packaging by ETICS for EMI-1
	if ($project eq 'emi' and $project_version == 1 and $fmod ne 'gridsite.core') { return; }

	if ($fmod eq 'gridsite.core') {
		$workspaceDir = '..';
		$srcPackageName = 'gridsite';
		$srcAge = '';
		$topDir = '../';
	} else {
		$workspaceDir = '${workspaceDir}';
		$srcPackageName = '${packageName}';
		$srcAge = '-${age}';
		$topDir = '';
	}

	$cmd->{clean} = 'make clean
	rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
	$cmd->{default}{packaging} = $rpmprepare;
	$cmd->{default}{packaging} .= "dir=\${workspaceDir}/rpm_build_src_\$\$
	mkdir -p \${package.tgzLocation} \${package.SRPMSLocation} \$dir/{BUILD,RPMS,SOURCES,SRPMS} 2>/dev/null || true
	cp -vf $workspaceDir/$srcPackageName-\${version}${srcAge}.src.tar.gz \${package.tgzLocation}/
	cp -vf $workspaceDir/$srcPackageName-\${version}${srcAge}.src.tar.gz \$dir/SOURCES/
	rpmbuild -bs --nodeps --define \"_topdir \$dir\" $srcPackageName.spec
	cp -v \$dir/SRPMS/*.src.rpm \${package.SRPMSLocation}/
	rm -rf \$dir";

	for my $p ('deb5_x86_64_gcc432', 'deb5_ia32_gcc432', 'deb6_x86_64_gcc445', 'deb6_ia32_gcc445') {
		for my $c (keys %{$cmd->{default}}) { $cmd->{$p}{$c} = $cmd->{default}{$c}; }
		$cmd->{$p}{clean} = 'make clean
	rm -rfv ${package.tgzLocation} ${package.SDEBSLocation}';
		$cmd->{$p}{packaging} = $debprepare;
		$cmd->{$p}{packaging} .= "dir=\${workspaceDir}/dpkg_build_src_\$\$
	mkdir -p \${package.tgzLocation} \${package.SDEBSLocation} \$dir 2>/dev/null || true
	cp -vf $workspaceDir/$srcPackageName-\${version}${srcAge}.src.tar.gz \${package.tgzLocation}/
	cp -vf $workspaceDir/$srcPackageName-\${version}${srcAge}.src.tar.gz \$dir/${srcPackageName}_\${version}.orig.tar.gz
	tar xzf \$dir/${srcPackageName}_\${version}.orig.tar.gz -C \$dir
	cp -rf ${topDir}debian/ \$dir/$srcPackageName-\${version}/
	cd \$dir/$srcPackageName-\${version}
	dpkg-buildpackage -S -d -nc
	cd -
	cp -v \$dir/*.tar.gz \$dir/*.dsc \${package.SDEBSLocation}/
	rm -rf \$dir";
	}
}

sub mode_etics {
	$fmod = shift;

	die "$0: --module required with --etics\n" unless $fmod;
	
	my ($subsys,$module) = split /\./,$fmod,2;
	my $full = full "$subsys.$module";

	my ($major,$minor,$rev,$age) = get_version $fmod, $full;

	# XXX: --with ignored for platform-dependend packages
	my @copts = ();
	my %ge;
	@ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1);

	for (@{$need_externs{"$subsys.$module"}}) {
	    if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) {
		my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_;
		next if ($eext eq '-');
		if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) {
			$eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_});
			push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
		} else {
			if ($ge{$_} and not defined $externs{$_}{pkg}) {
				push @copts, "--with-$_=\${stageDir}";
			}
		}
	    }
	}

	for (@{$need_jars{"$subsys.$module"}}) {
		my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_;

		push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_});
	}

	my $conf;
	my $conftag;
	my ($confprefix, $nameprefix, $packageName);

	$dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";

	$confprefix = $project{conf_prefix}{$subsys};
	$nameprefix = $confprefix;
	$nameprefix =~ s/-$//;
	$nameprefix =~ s/-/\./g;
	$packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";

	if ($branch) {
		$conf = "$confprefix${subsys}-${module}_$branch"; 
		$conftag = $branch;
		# forced low age number
		$age = $branch eq 'HEAD' ? '0head' : '0dev';
		# add project major version number
		$age .= '.'.$project_version;
		push @copts, '--version ${version}-${age}';
	}
	else {
		$conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
# XXX: gridsite hack
		$conftag = $subsys eq 'gridsite' ? "$project{tag_prefix}{$subsys}${subsys}_R_${major}_${minor}_${rev}" : 
			"$project{tag_prefix}{$subsys}$subsys-${module}_R_${major}_${minor}_${rev}_${age}";

		# lowering age for older packaging
		if ($project eq 'emi' and $project_version == 1) {
			$age = $age - 1;
		}

		# '.emi1' suffix for older packaging
		if ($project eq 'emi' and $project_version == 1) {
			$age = $age.'.'.$project.$project_version;
		}
	}
	if ($project eq 'emi' and $project_version == 1) {
		$conf = $conf.$project.$project_version;
	}

	my $file = $output ? $output : "$conf.ini";
	open C,">$file" or die "$file: $!\n";

	my $buildroot = $buildroot{"$subsys.$module"} eq '' ? '#no build.root' : "build.root = " . $buildroot{"$subsys.$module"};

	my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';

	my $cvs_module = full "$subsys.$module";
	my ($package_summary, $package_description) = get_description $cvs_module;
	if ($package_description) {
		$package_description =~ s/\n/\\n/g;
		$package_description = "package.description = $package_description\n";
	}
	if ($package_summary) {
		$package_summary = "package.summary = $package_summary\n";
	}

	my %cmd;
	$cmd_vcs{checkout} = "cvs -d \${vcsroot} co -d \${moduleName} ".($conftag eq 'HEAD' ? '-A' : '-r ${tag}')." $cvs_module 2>/dev/null";
	#$cmd_vcs{checkout} = "((test -d jra1mw/.git && (cd jra1mw; git pull)) || (git clone -q http://scientific.zcu.cz/git/jra1mw.git";
	#$cmd_vcs{checkout} .= " && (cd jra1mw; git checkout -b \${tag} --track origin/\${tag})" unless ($conftag eq /HEAD/);
	#$cmd_vcs{checkout} .= ")) && (test -d \${moduleName} || ln -s jra1mw/$cvs_module \${moduleName})";
	$cmd_vcs{checkout} .= "\n\ttest -f \${packageName}-\${version}-\${age}.src.tar.gz || (ln -s \${moduleName} \${packageName}-\${version}; tar -chf - \${packageName}-\${version} --exclude CVS --exclude .git --exclude .etics | gzip --best > \${packageName}-\${version}-\${age}.src.tar.gz; rm \${packageName}-\${version})";
	$cmd_vcs{tag} = "cvs -d \${vcsroot} tag -R \${tag} ${moduleName}";

	$cmd{default}{init} = 'None';
	$cmd{default}{configure} = 'None';
	$cmd{default}{compile} = 'None';
	$cmd{default}{test} = 'None';
	$cmd{default}{install} = 'None';
	$cmd{default}{packaging} = 'None';
	$cmd{default}{clean} = 'make clean';

	if (exists $subpackages{$fmod}) {
		$cmd{default}{clean} = 'None';
		$cmd{default}{packaging} = "echo building nothing, $subpackages{$fmod} will build this package";
		$cmd_vcs{checkout} = "mkdir -v \${moduleName} 2>/dev/null || true";
	} elsif ($subsys eq 'gridsite') {
		$cmd_vcs{tag} = 'None';

		if ($module eq 'core') {
			my $flags;

			if ($project ne 'glite') {
				# don't evaluate pkg-config calls to get them into source package
				$flags = 'RELEASE_VERSION=${age}
	GSOAPDIR=\`pkg-config gsoap --variable=prefix\`
	OPENSSL_GLOBUS_FLAGS=\`pkg-config globus-openssl --cflags\`
	OPENSSL_GLOBUS_LIBS=\`pkg-config globus-openssl --libs\`';
			} else {
				$flags = 'RELEASE_VERSION=${age}
	GSOAPDIR=${gsoap.location}
	OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor}
	OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}
	HTTPD_FLAGS=-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-1 -I${httpd-devel.location}/include/apr-1.0 -I${httpd-devel.location}/include/apr-0 -I${httpd-devel.location}/include/pcre';
			}

			$cmd{default}{configure} = "cat > Makefile.inc <<EOF
	project = $project$project_version
	top_srcdir = ..
	$flags
	EOF";
			$cmd{default}{compile} = "make prefix=\${prefix}$project{local_prefix} libdir=\${libdir}";
			$cmd{default}{install} = "make prefix=\${prefix}$project{local_prefix} libdir=\${libdir} install";
			mode_etics_packaging($fmod, \%cmd,
				"make prefix=\${prefix}$project{local_prefix} rpm-prepare
	cp gridsite.spec ../\n\t",
				"chmod +x \${moduleDir}/src/make-debian-files || true
	make prefix=\${prefix}$project{local_prefix} deb-prepare\n\t"
			);
		}
		elsif ($module eq '1.5-compat') {
			$cmd_vcs{checkout} = "cvs -d \${vcsroot} co -d \${moduleName} ".($conftag eq 'HEAD' ? '-A' : '-r ${tag}')." $cvs_prefix{$subsys}.$subsys.core 2>/dev/null";
			$cmd{default}{init} = 'echo "/sbin/ldconfig" > project/.post
	echo "/sbin/ldconfig" > project/.postun';
			$cmd{default}{configure} = "cat > src/Makefile.inc <<EOF
	project = emi
	libdir = \${libdir}
	MAJOR_VERSION=1
	MINOR_VERSION=1.5
	PATCH_VERSION=1.5.0
	VERSION=\\\$(PATCH_VERSION)
	RELEASE_VERSION=\${age}
	GSOAPDIR=\\`pkg-config gsoap --variable=prefix\\`
	OPENSSL_GLOBUS_FLAGS=\\`pkg-config globus-openssl --cflags\\`
	OPENSSL_GLOBUS_LIBS=\\`pkg-config globus-openssl --libs\\`
	EOF";
			$cmd{default}{compile} = "make -C src prefix=\${prefix}$project{local_prefix}
	rm -fv project/debian.changelog";
			$cmd{default}{install} = "make -C src prefix=\${prefix}$project{local_prefix} install-lib
	rm -fv \${prefix}$project{local_prefix}/\${libdir}/libgridsite*.so.1
	rm -fv \${prefix}$project{local_prefix}/\${libdir}/libgridsite*.so
	rm -fv \${prefix}$project{local_prefix}/\${libdir}/libgridsite*.a";
			$cmd{default}{packaging} = "None";
		}
		else {
			$cmd{default}{clean} = 'None';
			$cmd{default}{packaging} = "echo building nothing, org.gridsite.core make rpm step will create this";
			$cmd_vcs{checkout} = "mkdir -v \${moduleName} 2>/dev/null || true";
		}
	}
	elsif ($subsys eq 'px' and $module eq 'myproxy-config') {
		$cmd{default}{configure} = "/usr/bin/perl $confdir/configure --root=\${prefix} --prefix= --stage=\${stageDir} --libdir=\${libdir} --project=\${projectName} --module $subsys.$module @copts";
		$cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
	}
	else {
		$cmd{default}{configure} = "/usr/bin/perl $confdir/configure $project{flavours} --root=\${prefix} --prefix=$project{local_prefix} --stage=\${stageDir} --sysroot=\${package.prefix} --libdir=\${libdir} --project=\${projectName} --module $subsys.$module @copts";
		$cmd{default}{compile} = 'make';
		$cmd{default}{test} = 'make check';
		$cmd{default}{install} = 'make install';
		if ($subsys eq 'lb' and $module eq 'client') {
			$cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
			$cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
		}
		mode_etics_packaging($fmod, \%cmd);
	}

	my $defprops = '';

	for my $p (keys %{$platform_properties{"$subsys.$module"}->{default}}) {
		$defprops .= $p . ' = ' . $platform_properties{"$subsys.$module"}->{default}->{$p} . "\n";
	}

	print STDERR "Writing $file\n";
	print C qq{
[Configuration-$conf]
profile = None
moduleName = $project{etics_name}.$subsys.$module
displayName = $conf
description = $cvs_prefix{$subsys}.$subsys.$module
projectName = $project{etics_name}
age = $age
deploymentType = None
vcsroot = :pserver:anonymous\@glite.cvs.cern.ch:/cvs/glite
tag = $conftag
version = $major.$minor.$rev
$dwpath
[Platform-default:VcsCommand]
displayName = None
description = None
tag = $cmd_vcs{tag}
branch = None
commit = None
checkout = $cmd_vcs{checkout}

};

	for my $p (keys %cmd) {
		next if $p ne 'default' and exists $project{supported_platforms} and not exists $project{supported_platforms}{$p};

		print C qq{[Platform-$p:BuildCommand]
postpublish = None
packaging = $cmd{$p}{packaging}
displayName = None
description = None
doc = None
prepublish = None
publish = None
compile = $cmd{$p}{compile}
init = $cmd{$p}{init}
install = $cmd{$p}{install}
clean = $cmd{$p}{clean}
test = $cmd{$p}{test}
configure = $cmd{$p}{configure}
checkstyle = None

};
	}

	print C qq{[Platform-default:Property]
$buildroot
package.preserve.libtool = false
$package_description$package_summary$defprops};

	for (@{$obsoletes{"$subsys.$module"}}) {
		print C "package.obsoletes = $_\n";
		print C "package.replaces = $_\n";
	}
	for (@{$conflicts{"$subsys.$module"}}) {
		print C "package.conflicts = $_\n";
	}
	for (@{$provides{"$subsys.$module"}}) {
		print C "package.provides = $_\n";
	}
	print C "\n";

	for my $pp (keys %{$platform_properties{"$subsys.$module"}}) {
		next if $pp eq 'default';
		next if exists $project{supported_platforms} and not exists $project{supported_platforms}{$pp};

		print C "[Platform-$pp:Property]\n$buildroot\n";

		for my $p (keys %{$platform_properties{"$subsys.$module"}->{$pp}}) {
			print C $p . ' = ' . $platform_properties{"$subsys.$module"}->{$pp}->{$p} . "\n";
		}
		print C "$package_description$package_summary\n";
	}

	for my $platform ('default', keys %{$project{supported_platforms}}) {
		my $used = 0;
		my $output = '';

		for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
			my $eext = $etics_externs{$platform}{$_};
			my $edev = $project{etics_externs_devel}{$platform}{$_};

			# for the default platform using package of the same
			# name for runtime dependency
			if (not $eext) {
				if ($platform eq 'default') {
#print "default runtime $_ on default\n";
					$eext = $_; }
				else {
#print "no runtime $_ on $platform\n";
					$eext = '-'; }
			}
			if ($eext eq '-' and $edev eq '-') {
#print "skipping $_ on $platform\n";
				next;
			}

			my $proj = 'externals';
			for my $p (keys %etics_projects) {
				for $m (@{$etics_projects{$p}}) {
					$proj = $p if $m eq $_;
				}
			}

			my $type = $need_externs_type{"$subsys.$module"}->{$_};

			if ($edev) {
				if ($type eq 'B') {
					# no runtime - change to devel pkg
					$eext = $edev;
				} elsif ($type eq 'BR' or $type eq 'RB') {
					# additional devel pkg
					if ($edev ne '-') { $output .= "$proj|$edev = B\n"; }
				}
			}
			if ($eext ne '-') { $output .= "$proj|$eext = $type\n"; }
		}

		if ($platform eq 'default') {
			for (@{$deps{"$subsys.$module"}}) {
				my $type = $deps_type{"$subsys.$module"}->{$_};
				if (not $used) {
					$used = 1;
				}
				$output .= "$project{etics_name}|$project{etics_name}.$_ = $type\n";
			}
		}

		if ($output) {
					print C qq{
[Platform-$platform:DynamicDependency]
$output};
		}
	}

	close C;

	for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
		my $lib;
		my $main_module;
		@copts = ();

		if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
		else { $lib = '%{_lib}'; }

		my $main_module = "$subsys.$module";
		if (exists $subpackages{$main_module}) { $main_module = $subpackages{$main_module}; }

		# locations hacks
		if ($file =~ /$packageName\.spec$/) {
			if ($fmod eq 'lb.client-java') {
				push @copts, '';
				push @copts, '--with-axis=/usr/local/axis1.4';
			}
		}

		if (-f $file) {
			open DST,">$file.new" or die "$file.new: $!\n";
			open SRC,"<$file" or die "$file: $!\n";
			while (<SRC>) {
				if (/^(\s*).+\/configure\s/) {
					printf DST "%s", "$1";
					printf DST "/usr/bin/perl $confdir/configure $project{flavours} --root=/ --prefix=$project{local_prefix} --libdir=$lib --project=$project --module $main_module@copts\n";
				} else {
					printf DST "%s", "$_";
				}
			}
			close SRC;
			close DST;

			`diff -b "$file" "$file.new"`;
			if ($? == 0) {
				print STDERR "($file not changed)\n" if ($debug);
				unlink "$file.new";
			} else {
				print STDERR "Writing $file\n";
				rename "$file", "$file.orig" unless -f "$file.orig";
				rename "$file.new", "$file";
			}
		}
	}
}

sub gsoap_version {
	local $_;
	my $gsoap_version;
	open S,"$externs{gsoap}{prefix}/bin/soapcpp2 -v 2>&1 |" or die "$externs{gsoap}{prefix}/bin/soapcpp2: $!\n";

	while ($_ = <S>) {
		chomp;

		$gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
		$gsoap_version = $1 if /The gSOAP code generator for C and C\+\+, soapcpp2 release ([.[:digit:][:alpha:]]+)$/;
	}
	close S;
	return $gsoap_version;
}

sub getlibdir {
	if ( -e "/etc/debian_version") { # We are on Debian
		$lib64="lib";
		$lib32="lib32";	}
	else { # Another distribution
		$lib64="lib64";
		$lib32="lib";	}
        $libdir=$lib32;

        open INP, "uname -s | "; # Check kernel name
        $kname= <INP>;
        chomp($kname);
        close INP;

        if ( $kname eq "Linux") {
                $arch = ("x86_64\npowerpc\nppc64\n");

                open INP, "uname -p | "; # Check processor type
                $procname= <INP>;
                chomp($procname);
                close INP;

                if ($arch =~/^$procname\n/) {
                        return ($lib64); }

                open INP, "uname -m | "; # Check machine hardware
                $machname= <INP>;
                chomp($machname);
                close INP;

                if ($arch =~/^$machname\n/) {
                        return ($lib64); }

                # special cases (hyperlink lib64, Debian)
                if (-l "/usr/lib64") {
                        $libdir=$lib32; }

                # if /usr/lib64 doesn't exist at all (AIX)
                unless ( -e "/usr/lib64" ) {
                        $libdir=$lib32; }
        }

        if ( $kname eq "SunOS") {
                if (-e "/usr/lib/64") {
                $libdir="lib/64"; }
        }

        return $libdir;
}

sub reshuffle_platforms($$) {
	my ($data, $platforms) = @_;
	my ($platform, %blacklist, $value);

	return if not $platforms;

	for $platform (keys %$data) {
#print "plat: $platform: $data->{$platform}\n";
		next if $platform eq 'default';
		for $_ (keys %{$data->{$platform}}) {
#print "  blacklist: $_ = $data->{$platform}{$_}\n";
			$blacklist{$_} = 1;
		}
	}

	for $_ (keys %blacklist) {
		$value = $data->{default}{$_} ? $data->{default}{$_} : $_;
		for $platform (keys %$platforms) {
			next if $platform eq 'default';
			if (not defined $data->{$platform}{$_}) {
				$data->{$platform}{$_} = $value;
#print "added $value to $platform\n"
			}
		}
		$data->{default}{$_} = '-';
#print "deleted $_ from default\n";
	}

	# merge dependencies across the supported platforms
	%blacklist = [];
	for $platform (keys %$platforms) {
		next if $platform eq 'default';
		for $_ (keys %{$data->{$platform}}) {
			$blacklist{$_} = 1;
		}
	}
	for $_ (keys %blacklist) {
		$value = undef;
		$same = 1;
		for $platform (keys %$platforms) {
			if (not $value) { $value = $data->{$platform}{$_}; }
			if (not $data->{$platform}{$_} or $value ne $data->{$platform}{$_}) {
				$same = 0;
				last;
			}
		}
		if ($same and $value) {
#print "merged dependency $_\n";
			$data->{default}{$_} = $value;
			for $platform (keys %$platforms) {
				delete $data->{$platform}{$_};
			}
		}
	}
}

sub usage {
	my @ext = keys %externs;
	my @myjars = keys %jar;

	print STDERR qq{
Usage: $0 options

General options (defaults in []):
  --prefix=PREFIX		destination directory [./stage]
  --stage=DIR			staging directory [./stage]
  --root=DIR			installation root (custom relocation root -> sysroot) [./stage]
  --sysroot=DIR			system root (custom relocation root -> sysroot) []
  --sysconfdir=DIR              system configuration directory [PREFIX/etc]
  --staged=module,module,...	what is already in PREFIX (specify without org.glite.)
  --thrflavour=flavour
  --nothrflavour=flavour	threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
  --listmodules=subsys          list modules of a subsystem
  --listmodules=module          list subpackages of a module
  --version=maj.min.rev-age	version used instead of reading version.properties
  --branch=branch		CVS branch/etics name suffix (HEAD, branch_2_1, ...)
  --libdir=libdir		typically [lib,lib64] postfix
  --project=PROJECT		build or generate etics for a project (glite/emi1/emi) [emi]
  --debug			print more details
  
Mode of operation:
  --mode=\{checkout|build|etics\}	what to do [build]
  
What to build:
  --module=module		build this module only
  --enable-NODE			build this "node" (set of modules) only
  --disable-NODE		don't build this node
  --lb-tag=tag			checkout LB modules with specific tag
  --jp-tag=tag			checkout JP modules with specific tag
  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
  --jobid-tag=tag		checkout jobid modules with specific tag
  --canl-tag=tag		checkout canl modules with specific tag

Dependencies (summary of what will be used is always printed):
  --with-EXTERNAL=PATH		where to look for an external [autodetect]
  --with-JAR=JAR		where to look for jars

Available nodes:
    @nodes

Default nodes:
    @default_nodes

Externals (not all for all modules) are:
    @ext

External jars are:
    @myjars

};

}
