Resync configure.
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Fri, 16 Dec 2011 16:29:16 +0000 (16:29 +0000)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Fri, 16 Dec 2011 16:29:16 +0000 (16:29 +0000)
26 files changed:
org.glite.jobid.api-c/configure
org.glite.jobid.api-cpp/configure
org.glite.jobid.api-java/configure
org.glite.lb.client-java/configure
org.glite.lb.client/configure
org.glite.lb.common/configure
org.glite.lb.doc/configure
org.glite.lb.emi-lb/configure
org.glite.lb.harvester/configure
org.glite.lb.logger-msg/configure
org.glite.lb.logger/configure
org.glite.lb.server/configure
org.glite.lb.state-machine/configure
org.glite.lb.types/configure
org.glite.lb.utils/configure
org.glite.lb.ws-interface/configure
org.glite.lb.ws-test/configure
org.glite.lb.yaim/configure
org.glite.lbjp-common.db/configure
org.glite.lbjp-common.gsoap-plugin/configure
org.glite.lbjp-common.gss/configure
org.glite.lbjp-common.jp-interface/configure
org.glite.lbjp-common.log/configure
org.glite.lbjp-common.maildir/configure
org.glite.lbjp-common.server-bones/configure
org.glite.lbjp-common.trio/configure

index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100644 (file)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {
index 16595a2..45b5c78 100755 (executable)
@@ -59,6 +59,14 @@ 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
@@ -289,8 +297,8 @@ if ($listmodules) {
        exit 0;
 }
 
-warn "$0: --version, --branch and --output make sense only in --mode=etics\n"
-       if ($version || $output || $branch) && $mode ne 'etics';
+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{$_}; }
@@ -1040,10 +1048,71 @@ sub full
        return $extrafull{$short} ? $extrafull{$short} : "$cvs_prefix.$short";
 }
 
+sub get_version
+{
+       my ($top_srcdir) = @_;
+
+       my ($subsys,$module) = split /\./,$fmod,2;
+       my ($major,$minor,$rev,$age);
+
+       if ($version) {
+               $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";
+
+               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;
+
+               $version = "$major.$minor.$rev-$age";
+       }
+
+       return ($major, $minor, $rev, $age);
+}
+
+sub get_description
+{
+       my $top_srcdir = shift;
+
+       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;
-       my ($old_locale, $date);
        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
@@ -1058,6 +1127,8 @@ canl.c
 
        my $short = shift;
        my $full = full $short;
+       my ($subsys,$module) = split /\./,$short,2;
+       my $packageName = "$project{tag_prefix}{$subsys}$subsys-${module}";
 
        unless ($aux{$short}) {
                print "Makefile.inc not needed in $full\n";
@@ -1082,14 +1153,23 @@ canl.c
                }
        }
 
+       my ($major, $minor, $rev, $age) = get_version $top_srcdir;
+       my ($package_summary, $package_description) = get_description $top_srcdir;
+       if ($package_description) { $package_description =~ s/(.{1,79}\S|\S+)\s+/$1\n/mg; }
+       my $package_description_debian = $package_description;
+       $package_description_debian =~ s/^/ /mg;
+
+       my ($old_locale, $specdate, $debdate);
+
        mkdir $build."project" unless (-d $build."project");
        open PKGCHL,">".$build."project/changelog"
                or die $build."project/changelog: $!\n";
        $old_locale = setlocale(LC_TIME);
        setlocale(LC_TIME, "C");
-       $date = strftime("%a %b %d %Y", gmtime());
+       $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{* $date CESNET team <emi-lb\@metacentrum.cz>
+       print PKGCHL qq{* $specdate CESNET team <emi-lb\@metacentrum.cz>
 - automatically generated package
 };
        close PKGCHL;
@@ -1141,6 +1221,88 @@ top_srcdir = $top_srcdir
        print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
 
        close MKINC;
+
+       my $dh;
+       my $debian = 0;
+
+       opendir $dh, "$top_srcdir/project" || die "Can't open $top_srcdir/project: $!";
+       for $_ (readdir $dh) {
+               if (/^(.*)\.spec$/) {
+                       if ($1 ne $packageName) {
+                               printf STDERR "Changed RPM name: $packageName --> $1\n";
+                               $packageName=$1;
+                       }
+                       last;
+               }
+       }
+       closedir $dh;
+
+       for my $file ("$packageName.spec", "debian.rules", "debian.control", "debian.changelog") {
+               if (-f "$top_srcdir/project/$file") {
+                       printf STDERR "Creating $build$file\n";
+                       open DST, ">$build$file";
+                       open SRC, "<$top_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; }
+                               printf DST "%s", "$_";
+                       }
+                       close SRC;
+                       close DST;
+               }
+       }
+
+       print "Creating ${build}debian/\n";
+
+       `rm -rfv  ${build}debian`;
+       mkdir $build."debian" or die $!;
+       `cp $top_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{
@@ -1152,29 +1314,9 @@ sub mode_etics {
        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);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               my $full = full "$subsys.$module";
-               my $path = "$full/project";
-               if ($subsys eq 'gridsite') {
-                       $path = "$cvs_prefix{$subsys}.$subsys.core/project";
-               }
-               open V,"$path/version.properties"
-                       or die "$path/version.properties: $!\n";
-       
-               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;
-       }
+       my ($major,$minor,$rev,$age) = get_version $full;
 
        # XXX: --with ignored for platform-dependend packages
        my @copts = ();
@@ -1204,7 +1346,7 @@ sub mode_etics {
 
        my $conf;
        my $conftag;
-       my ($confprefix, $nameprefix);
+       my ($confprefix, $nameprefix, $packageName);
 
        $dwpath = "path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz\n";
 
@@ -1212,12 +1354,15 @@ sub mode_etics {
        $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'; }
+               $age = $branch eq 'HEAD' ? '0head' : '0dev';
+               push @copts, '--version ${version}-${age}';
+       }
        else {
                $conf = "$confprefix$subsys-${module}_R_${major}_${minor}_${rev}_${age}"; 
 
@@ -1232,38 +1377,22 @@ sub mode_etics {
 
        my $confdir = $buildroot{"$subsys.$module"} eq '' ? '.' : '..';
 
-       my $package_description = "";
-       my $package_summary = "";
-
        my $cvs_module = full "$subsys.$module";
-
-       if (-e "$cvs_module/project/package.description") {
-               open V, "$cvs_module/project/package.description";
-               $package_description = join ("", <V>);
-               close V;
-               chomp $package_description;
-               $package_description =~ s/\n/\\n/g; 
+       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";
-       } 
-       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; 
+       }
+       if ($package_summary) {
                $package_summary = "package.summary = $package_summary\n";
-       } 
-       else { 
-               print STDERR "package.summary not found for $subsys.$module!\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/epel)" unless ($conftag =~ /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';
@@ -1349,6 +1478,8 @@ sub mode_etics {
                $cmd{default}{packaging} = "make rpm package=".$confprefix."$subsys-myproxy-config";
        }
        else {
+               $cmd{clean} = 'make clean
+       rm -rfv ${package.tgzLocation} ${package.SRPMSLocation}';
                $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';
@@ -1357,6 +1488,29 @@ sub mode_etics {
                        $cmd{default}{compile} = "make rpath=$project{local_prefix}/\${libdir}";
                        $cmd{default}{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}";
                }
+               $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}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/SOURCES/
+       rpmbuild -bs --nodeps --define "_topdir $dir" ${packageName}.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} = 'dir=${workspaceDir}/dpkg_build_src_$$
+       mkdir -p ${package.tgzLocation} ${package.SDEBSLocation} $dir 2>/dev/null || true
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz ${package.tgzLocation}/
+       cp -vf ${workspaceDir}/${packageName}-${version}-${age}.src.tar.gz $dir/${packageName}_${version}.orig.tar.gz
+       tar xzf $dir/${packageName}_${version}.orig.tar.gz -C $dir
+       cp -rf debian/ $dir/${packageName}-${version}/
+       cd $dir/${packageName}-${version}
+       dpkg-buildpackage -S -d -nc
+       cd -
+       cp -v $dir/*.tar.gz $dir/*.dsc ${package.SDEBSLocation}/
+       rm -rf $dir';
+               }
        }
 
        my $defprops = '';
@@ -1502,6 +1656,47 @@ $output};
        }
 
        close C;
+
+       for $file ("$cvs_module/project/debian.rules", "$cvs_module/project/$packageName.spec") {
+               my $lib;
+               @copts = ();
+
+               if ($file =~ /debian\.rules$/) { $lib = 'lib'; }
+               else { $lib = '%{_lib}'; }
+
+               # 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 $subsys.$module@copts\n";
+                               } else {
+                                       printf DST "%s", "$_";
+                               }
+                       }
+                       close SRC;
+                       close DST;
+
+                       `diff -b "$file" "$file.new"`;
+                       if ($? == 0) {
+                               print STDERR "($file not changed)\n";
+                               unlink "$file.new";
+                       } else {
+                               print STDERR "Writing $file\n";
+                               rename "$file", "$file.orig" unless -f "$file.orig";
+                               rename "$file.new", "$file";
+                       }
+               }
+       }
 }
 
 sub gsoap_version {