# C 2006 Edscott Wilson Garcia: GPL distribution package install; use Exporter; @ISA = qw(Exporter); @EXPORT = qw(falloff autogen make_cmd check release_check dependency version download_tarball); $system_serial=0; $local_serial=0; @command_packages=("fgr","scramble"); @library_packages=("dbh","libtubo","libxffm","xffm-gui"); @top_packages=("xffm-filemanager","xffm-icons","xfdiff"); @plugins=("xffm-applications","xffm-book","xffm-fstab","xffm-locate","xffm-proc","xffm-recent","xffm-samba","xffm-trash"); sub init{ $i=0; foreach $p (@command_packages){$all_packages[$i++] = $p} foreach $p (@library_packages){$all_packages[$i++] = $p} foreach $p (@top_packages){$all_packages[$i++] = $p} foreach $p (@plugins){$all_packages[$i++] = $p} $i=0; $libxffm_dependent_packages[$i++] = "xffm-gui"; foreach $p (@top_packages){$libxffm_dependent_packages[$i++] = $p} foreach $p (@plugins){$libxffm_dependent_packages[$i++] = $p} if (not $release_init) { $serial_signature_directory="libraries/libxffm"; foreach $p (@command_packages){$directory{$p} = 'command-line-utilities/'.$p} foreach $p (@library_packages){$directory{$p} = 'libraries/'.$p} foreach $p (@plugins){$directory{$p} = 'filemanager-plugins/'.$p} foreach $p (@top_packages){$directory{$p} = 'graphic-utilities/'.$p} } else { $serial_signature_directory="libxffm-$release_init"; foreach $p (@command_packages){$directory{$p} = "$p-$release_init"} foreach $p (@library_packages){$directory{$p} = "$p-$release_init"} foreach $p (@plugins){$directory{$p} = "$p-$release_init"} foreach $p (@top_packages){$directory{$p} = "$p-$release_init"} } } sub move_tarballs{ &init; $command="rm -rf ../xffm-$ARGV[1] && mkdir ../xffm-$ARGV[1]"; $_=`$command`; foreach $p (@all_packages){ $command="mv $directory{$p}/*.tar.gz ../xffm-$ARGV[1]"; print "$p -------------------------------------------------------------\n"; print "$command\n"; $_=`$command`; if ($? != 0) { &falloff} } $command="cd .. && tar -czf xffm-$ARGV[1].tar.gz xffm-$ARGV[1] && mv xffm-$ARGV[1].tar.gz xffm-$ARGV[1]"; $_=`$command`; if ($? != 0) { &falloff} $command="cd ../xffm-$ARGV[1] && md5sum *.tar.gz > md5"; $_=`$command`; if ($? != 0) { &falloff} } sub autogen{ &init; if (not $ARGV[0]){ print "You may pass arguments needed by autogen.sh or configure scripts\nto the $0 program...\n"; } $pwd=`pwd`; chop $pwd; foreach $p (@all_packages){ $command="cd $directory{$p} && ./autogen.sh $ARGV[0] $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] $ARGV[5] $ARGV[6] $ARGV[7] $ARGV[8] $ARGV[9]"; print "$p -------------------------------------------------------------\n"; print "$command\n"; $_=`$command`; if ($? != 0) { &falloff} } } sub dependency{ &init; @deps=( "GLIB"=>"GTK"=>"DBH"=>"LIBTUBO"=>"LIBXFFM"=>"XFFMGUI"=>"XFFMFILEMANAGER" ); %depname=( "GLIB" => "glib-2.0", "GTK" => "gtk+-2.0", "DBH" => "dbh-1.0", "LIBTUBO" => "libtubo", "LIBXFFM" => "libxffm", "XFFMGUI" => "xffm-gui", "XFFMFILEMANAGER" => "xffm-filemanager", ); if (not $ARGV[0]){ usage: print "This script is to update dependency requirements:\n\tARGV[0] is one of: GLIB GTK DBH LIBTUBO LIBXFFM XFFMGUI XFFMFILEMANAGER\n\tARGV[1] is the new dependency version.\n\nThis will update all affected configure.ac scripts. \n"; exit(0); } undef $ok; foreach $d (@deps){ if ($d eq $ARGV[0]) {$ok=1}} if (not $ok){ print "\n***Error: invalid dependency: $ARGV[0]\n\n"; goto usage; } if (not $ARGV[1]){ print "\n***Error: no dependency version specified for $ARGV[0]\n\n"; goto usage; } foreach $p (@all_packages){ undef $dependent; $configure_ac=$directory{$p}."/configure.ac"; $dot_configure_ac=$directory{$p}."/.configure.ac"; open INPUT,$configure_ac or die "cannot open $configure_ac"; open OUTPUT,">$dot_configure_ac" or die "cannot open $dot_configure_ac"; while (){ $s=$ARGV[0]; $d=$ARGV[1]; if (/XDT_CHECK_PACKAGE/ and /$s/) { if (not $dependent){ print "$configure_ac"; print " -----------------------------\n"; print; print " ==> \n"; $dependent=1; } print "XDT_CHECK_PACKAGE([$s], [$depname{$s}], [$d])\n"; print OUTPUT "XDT_CHECK_PACKAGE([$s], [$depname{$s}], [$d])\n"; } else { print OUTPUT $_; } } close INPUT; close OUTPUT; if ($dependent) { `mv $dot_configure_ac $configure_ac`; } else { `rm $dot_configure_ac`; } } } sub version{ &init; @vers=( "version_major"=>"version_minor"=>"version_micro" ); if (not $ARGV[0]){ usage: print "This script is to update version numbers:\n\tARGV[0] is one of: version_major version_minor version_micro\n\tARGV[1] is the new version number.\n\nThis will update all affected configure.ac scripts. \n"; exit(0); } undef $ok; foreach $d (@vers){ if ($d eq $ARGV[0]) {$ok=1}} if (not $ok){ print "\n***Error: invalid version specification: $ARGV[0]\n\n"; goto usage; } if (not defined $ARGV[1]){ print "\n***Error: no version specified for $ARGV[0]\n\n"; goto usage; } foreach $p (@all_packages){ undef $dependent; $configure_ac=$directory{$p}."/configure.ac"; $dot_configure_ac=$directory{$p}."/.configure.ac"; open INPUT,$configure_ac or die "cannot open $configure_ac"; open OUTPUT,">$dot_configure_ac" or die "cannot open $dot_configure_ac"; while (){ $v=$ARGV[0]; $d=$ARGV[1]; if (/m4_define\(\[$v\]/) { if (not $dependent){ print "$configure_ac"; print " -----------------------------\n"; print; print " ==> \n"; $dependent=1; } print "m4_define([$v], [$d])\n"; print OUTPUT "m4_define([$v], [$d])\n"; } else { print OUTPUT $_; } } close INPUT; close OUTPUT; if ($dependent) { `mv $dot_configure_ac $configure_ac`; } else { `rm $dot_configure_ac`; } } } sub changelog_make{ &init; foreach $p (@all_packages){ $command="cd $directory{$p} && svn log > ChangeLog && svn update && svn commit -m \"ChangeLog update for $p\""; print "$p -------------------------------------------------------------\n"; print "$command\n"; $_=`$command`; if ($? != 0) { &falloff} print; } } sub usual_make{ &init; if (not $ARGV[0]){ print "You may pass arguments needed by make \nto the $0 program...\n"; } foreach $p (@all_packages){ $command="cd $directory{$p} && make $ARGV[0] $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] $ARGV[5] $ARGV[6] $ARGV[7] $ARGV[8] $ARGV[9]"; print "$p -------------------------------------------------------------\n"; print "$command\n"; $_=`$command`; #if ($? != 0) { &falloff} } } sub make_cmd{ if ($ARGV[0] eq "dist" and not $ARGV[1]) { print "\n***Error: a release version must be specified\n\n"; exit(0); } if ($ARGV[0] eq "dist" and $ARGV[1]) { $save=$ARGV[1]; undef $ARGV[1]; } if ($ARGV[0] eq "Changelog" or $ARGV[0] eq "changelog" or $ARGV[0] eq "ChangeLog") { &changelog_make; } else { &usual_make; } if ($ARGV[0] eq "dist") { $ARGV[1]=$save; &move_tarballs; } } sub version_sum{ @num=split /\./,$v; $v_sum=0; $m=10000; foreach $n (@num) { $v_sum += ($n*$m); $m /=100; } } sub help { print "usage: installer [arguments]\n The arguments are the same ones you would pass to autogen.sh or configure\n\n"; exit(0); } sub private_check{ &init; if (not $ENV{LDFLAGS}) {$ENV{LDFLAGS}="-L/usr/X11R6/lib"} elsif ($ENV{LDFLAGS} ne "/usr/X11R6/lib"){ $old_ldflags=$ENV{LDFLAGS}; $ENV{LDFLAGS}="$old_ldflags -L/usr/X11R6/lib"; } print "LDFLAGS=$ENV{LDFLAGS}\n"; $u_n=0; if ($ARGV[0] eq "-h" or $ARGV[0] eq "--help" or $ARGV[0] eq "help"){ &help; } if (not $ARGV[0]){ print "You may pass arguments needed by autogen.sh or configure scripts\nto the $0 program...\n"; # sleep(1); } $pwd=`pwd`; chop $pwd; &setenv; &collect_min_version; print "checking installed versions...\n"; # sleep(1); %version=(); foreach $package (@all_packages){ $v=`pkg-config --modversion $package`; chop $v; if (not $v) { print "********** "; $v=-1000; } else { $version{$package}=$v; } &version_sum; $v_cur=$v_sum; $v=$min_version{"$package"}; &version_sum; print "**********$package $version{$package} ($v_cur, $v_sum)\n"; print "$package $version{$package}"; if ($v_cur >= $v_sum){ print " (OK)\n"; } else { print " (needs updating)\n"; $u[$u_n++]=$package; } # sleep 1; } &get_serials; if ($local_serial!=$system_serial){ foreach $sp (@libxffm_dependent_packages){ foreach $z (@u) { if ($z eq $sp) {goto found} } $u[$u_n++]=$sp; print "$sp (header dependency)\n"; found: } } print "-----------------------------------------------------------------\n"; print "Arguments to configure scripts...\n"; if ($ARGV[0]){ print "\t $ARGV[0] $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] $ARGV[5] $ARGV[6] $ARGV[7] $ARGV[8] $ARGV[9]"; } else { print "\tnone\n"; } print "Using PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}\n"; print "(if this is not correct, please define PKG_CONFIG_PATH)\n"; print "\n--> About to update the following:\n"; undef $something; foreach $uu (@u){ if (not $something) {$something=1} else {$something++} print $uu." to ".$min_version{$uu}."\n"; $last=$uu; } print "-- press RETURN to continue (CTRL-C to cancel):"; if (not $something){ print "\nNothing to update! Enhorabuena.\n"; exit (1); } if (not $release_init) {$in=;} else {$in="\n"} if ($in ne "\n") { chop $in; undef ($l); foreach $uu (@u){ if ($uu eq $in){ $l=$uu; } } if (not $l) { print "\"$in\" is not a valid option\n"; goto again; } $last=$l; goto keep_going; } if ($something==1){goto keep_going} again: print "Last program to update [$last]: "; if (not $release_init) {$in=;} else {$in="\n"} if ($in ne "\n") { chop $in; undef ($l); foreach $uu (@u){ if ($uu eq $in){ $l=$uu; } } if (not $l) { print "\"$in\" is not a valid option\n"; goto again; } $last=$l; } keep_going: print "\n-- $0 should stop after $last is updated.\n"; sleep 2; foreach $uu (@u){ chdir "$pwd/$directory{$uu}"; print "Now updating $uu to $min_version{$uu}\n"; print "++chdir $pwd/$directory{$uu}\n"; if (not $release_init) { $command="sh ./autogen.sh $ARGV[0] $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] $ARGV[5] $ARGV[6] $ARGV[7] $ARGV[8] $ARGV[9]"; } else { $command="sh ./configure $ARGV[0] $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] $ARGV[5] $ARGV[6] $ARGV[7] $ARGV[8] $ARGV[9]"; } print "Doing $command...\n"; $_=`$command`; if ($? != 0) { &falloff} print "Doing make...\n"; $_=`make`; if ($? != 0) { &falloff} $_=`sudo -V`; if (/Sudo version/) { $command="sudo make install"; } else { $command="make install"; } print "executing: $command...\n"; $_=`$command`; if ($? != 0) { &falloff} print "chdir $pwd\n"; chdir "$pwd"; print "--------------------------------------------------------\n"; if ($last eq $uu) {goto done;} } done: &finish; } sub check{ undef $release_init; &private_check; } sub release_check{ ($release_init)=@_; &private_check; } sub collect_min_version { %min_version=(); print "collecting version information...\n"; sleep(2); foreach $p (@all_packages){ $d=$directory{$p}; # print "p=$p, d=$d\n"; chdir "$pwd/$directory{$p}"; # print "++chdir $pwd/$directory{$p}\n"; $m=""; open INPUT,"configure.ac" or die "cannot open $pwd/$directory{$p}/configure.ac"; while (){ if (/m4_define/) { if (/version_major/ and not /version_minor/){ # print; ($dump,$_)=split /,/; ($dump,$_)=split /\[/; ($version_major,$_)=split /\]/; $m_v = $version_major; # print "version_major=$version_major\n"; } if (/version_minor/ and not /version_major/){ # print; ($dump,$_)=split /,/; ($dump,$_)=split /\[/; ($version_minor,$_)=split /\]/; $m_v .= "."; $m_v .= $version_minor; # print "version_minor=$version_minor\n"; } if (/version_micro/ and not /version_major/){ # print; ($dump,$_)=split /,/; ($dump,$_)=split /\[/; ($version_micro,$_)=split /\]/; $m_v .= "."; $m_v .= $version_micro; # print "version_micro=$version_micro\n"; } if (/version_nano/ and not /version_major/){ # print; ($dump,$_)=split /,/; ($dump,$_)=split /\[/; ($version_nano,$_)=split /\]/; $m_v .= "."; $m_v .= $version_nano; # print "version_nano=$version_nano\n"; } # print "got version=$m_v\n"; $min_version{$p}=$m_v; } } chdir "$pwd"; } close INPUT; foreach $p (@all_packages){ print "$p ---> $min_version{$p}\n"; } } sub falloff { if (/\*\*\*/ and /Error/){ if (/Fatal error/){ ($out,$dump) = split /Fatal error/,$_,2; } else {$out=$_} print $out; print "****** Error updating $uu to version $min_version{$uu}\n"; print "During $command\n"; print "Report compilation errors at xfce4-dev\@xfce.org (with \"xffm\" in subject).\nInclude the full output of the $0 script.\n\n"; } else { print; print "****** Error updating $uu to version $min_version{$uu}\n"; print "During $command\n"; print "Insuficient priviledges?\n"; print "(You may have to scroll up to see where the error occurred)\n\n"; } &finish; exit (0); } sub finish{ if ($auto_pkg) { undef $ENV{PKG_CONFIG_PATH}; } } sub setenv{ print "Setting PKG_CONFIG_PATH...\n"; if (not $ENV{PKG_CONFIG_PATH}){ for ($i=0; $i<9; $i++){ $_=$ARGV[$i]; if (/--prefix/){ ($dump,$prefix) = split /=/,$_,2; $pkglib=$prefix."/lib/pkgconfig"; $ENV{PKG_CONFIG_PATH}=$pkglib; $auto_pkg=1; } } if (not $ENV{PKG_CONFIG_PATH}){ $pkglib="/usr/local/lib/pkgconfig"; $ENV{PKG_CONFIG_PATH}=$pkglib; $auto_pkg=1; } } print "PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}\n"; } sub get_serials{ if (not $prefix) {$prefix="/usr/local"} print "-----------------------------------------------------\n"; print "Checking serial signature in $prefix/include/xffm ... "; open IN,"$prefix/include/xffm/types.h"; while () { if (/define LIBXFFM_SERIAL/) { ($dump,$ss) = split /LIBXFFM_SERIAL/, $_, 2; $system_serial=$ss+0; goto done; } } print ("\nError locating system library serial version:\nShould be at $prefix/include/xffm/types.h"); done: close IN; print $system_serial."\n"; print "Checking current serial signature ... "; open IN,"$serial_signature_directory/libs/types.h"; while () { if (/define LIBXFFM_SERIAL/) { ($dump,$ss) = split /LIBXFFM_SERIAL/, $_, 2; $local_serial=$ss+0; goto done_too; } } print ("Error locating local serial version\n"); done_too: print $local_serial."\n"; if ($local_serial!=$system_serial){ print "Header versions do not match.\n"; } } sub download_tarball { ($release,@servers)=@_; $i=0; retry: if ($i > $#servers) {&falloff} $server=$servers[$i]; print "Install for release $release\n"; $_=`ls -F md5`; if (not /md5/){ print "Getting md5 information with wget, please wait...\n"; $command="wget -O md5 http://$server/xffm/distfiles/xffm-$release/md5"; $_=`$command`; if ($? != 0) {$i++; goto retry;} } $_=`ls -F xffm-$release.tar.gz`; if (not /xffm-$release.tar.gz/){ print "Getting tarball with wget, please wait...\n"; $command="wget -O xffm-$release.tar.gz http://$server/xffm/distfiles/xffm-$release/xffm-$release.tar.gz"; print $command . "\n"; $_=`$command`; if ($? != 0) {$i++; goto retry;} } print "Verifying md5 information, please wait...\n"; $md5sum=`md5sum xffm-$release.tar.gz`; print "md5sum: $md5sum\n"; undef $verified; open INPUT, "md5" or die "cannot open file: md5"; while (){ if (/$md5sum/){ $verified=1; } } if (not $verified) { `rm md5 && rm xffm-$release.tar.gz`; goto retry; } print "MD5 information OK\n"; $command="cp xffm-$release.tar.gz xffm-$release.tar.gz.bak && gunzip -f xffm-$release.tar.gz"; print $command."\n"; $_=`$command`; if ($? != 0) { &falloff} $command="tar -xf xffm-$release.tar"; print $command."\n"; $_=`$command`; if ($? != 0) { &falloff} `rm xffm-$release.tar && mv xffm-$release.tar.gz.bak xffm-$release.tar.gz`; chdir "xffm-$release"; $_=`ls *.tar.gz`; @tarfiles=split; foreach $tarfile (@tarfiles){ $command="gunzip -f $tarfile"; print $command."\n"; $_=`$command`; if ($? != 0) { &falloff} } $_=`ls *.tar`; @tarfiles=split; foreach $tarfile (@tarfiles){ $command="tar -xf $tarfile"; print $command."\n"; $_=`$command`; if ($? != 0) { &falloff} `rm $tarfile`; } }