# 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`;
}
}