The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use lib 'lib';
use Alien::QtSmoke;
use Cwd;
use File::Fetch;
use File::Path;
use File::Spec;
use ExtUtils::MakeMaker;

my $CWD = Cwd::cwd(); 

sub fetch_kdebindings {
    my $version = Alien::QtSmoke->version();

    my $downloadDir = File::Spec->catdir( $CWD, 'src' );

    my @mirrors = (
        'http://chernabog.cc.vt.edu/pub/projects',
        'http://ftp.gtlib.cc.gatech.edu/pub',
        'ftp://carroll.aset.psu.edu/pub',
        'http://kde.mirrors.tds.net/pub',
        'http://ibiblio.org/pub/mirrors',
        'ftp://ftp.ussg.iu.edu/pub',
        'http://mirror.cc.columbia.edu/pub/software',
        'http://mirrors.isc.org/pub',
        'ftp://chernabog.cc.vt.edu/pub/projects',
        'ftp://ibiblio.org/pub/mirrors',
        'http://ftp.ussg.iu.edu',
        'ftp://kde.mirrors.tds.net/pub',
        'ftp://ftp.gtlib.cc.gatech.edu/pub',
    );

    foreach my $url ( @mirrors ) {
        $url .= "/kde/stable/$version/src/kdebindings-$version.tar.bz2";

        print "Attempting to download kdebindings source package\n";
        print "from $url\n";
        my $ff = File::Fetch->new( uri => $url ) or next;
        my $loc = $ff->fetch( to => $downloadDir ) or next;

        next if( !$loc || $ff->error() );

        print "Successfully downloaded kdebindings source.\n";
        return $loc;
    }

    die 'Unable to fetch kdebinding source.';
}

sub extract_kdebindings {
    my ( $src ) = @_;
    my $srcDir = File::Spec->catdir( $CWD, 'src' );
    chdir $srcDir;
    system "tar -xf $src";
    if ( ($? >> 8) > 0 ) {
        die "Unable to extract sources: $!\n";
    }
}

sub build_kdebindings {
    my $version = Alien::QtSmoke->version();
    my $prefix = Alien::QtSmoke->prefix();
    my $srcDir = File::Spec->catdir( $CWD, 'src', "kdebindings-$version" );
    my $buildDir = File::Spec->catdir( $srcDir, 'build' );
    my $qtSmokeBuildDir = File::Spec->catdir( $buildDir, 'smoke', 'qt' );

    File::Path::mkpath( $buildDir );
    chdir $buildDir;

    # Just build QtSmoke
    my $cmakeArgs = qq( -DCMAKE_INSTALL_PREFIX=$prefix \\
    -DENABLE_SMOKE=on                                  \\
    -DENABLE_QTRUBY=off                                \\
    -DENABLE_QTWEBKIT_SMOKE=off                        \\
    -DENABLE_QTSCRIPT_SMOKE=off                        \\
    -DENABLE_QTUITOOLS_SMOKE=off                       \\
    -DENABLE_QTTEST_SMOKE=off                          \\
    -DENABLE_PHONON_SMOKE=off                          \\
    -DENABLE_QSCI_SMOKE=off                            \\
    -DENABLE_QWT_SMOKE=off                             \\
    -DENABLE_KDE_SMOKE=off                             \\
    -DENABLE_KDEVPLATFORM_SMOKE=off                    \\
    -DENABLE_KHTML_SMOKE=off                           \\
    -DENABLE_KTEXTEDITOR_SMOKE=off                     \\
    -DENABLE_SOLID_SMOKE=off                           \\
    -DENABLE_PLASMA_SMOKE=off                          \\
    -DENABLE_QTWEBKIT_RUBY=off                         \\
    -DENABLE_QTUITOOLS_RUBY=off                        \\
    -DENABLE_QTSCRIPT=off                              \\
    -DENABLE_QTTEST=off                                \\
    -DENABLE_PHONON_RUBY=off                           \\
    -DENABLE_QSCINTILLA_RUBY=off                       \\
    -DENABLE_QWT_RUBY=off                              \\
    -DENABLE_SOPRANO_RUBY=off                          \\
    -DENABLE_KDEVPLATFORM_RUBY=off                     \\
    -DENABLE_KORUNDUM_RUBY=off                         \\
    -DENABLE_KHTML_RUBY=off                            \\
    -DENABLE_KTEXTEDITOR_RUBY=off                      \\
    -DENABLE_SOLID_RUBY=off                            \\
    -DENABLE_KROSSRUBY=off                             \\
    -DENABLE_PLASMA_RUBY=off                           \\
    -DENABLE_QIMAGEBLITZ_SMOKE=off );
    system "cmake .. $cmakeArgs -Wno-dev";
    if ( ($? >> 8) > 0 ) {
        die "Running cmake failed: $!\n";
    }

    chdir $qtSmokeBuildDir;

    system "make";
    if ( ($? >> 8) > 0 ) {
        die "Compiling QtSmoke failed while running make: $!\n";
    }
    system "make install";
    if ( ($? >> 8) > 0 ) {
        die "Installing QtSmoke failed while running make install: $!\n";
    }
}

sub main {
    my $src = fetch_kdebindings();
    extract_kdebindings( $src );
    chdir $CWD;
    build_kdebindings();

    chdir $CWD;
    WriteMakefile(
        NAME => 'Alien::QtSmoke',
        VERSION_FROM => 'lib/Alien/QtSmoke.pm',
        AUTHOR => 'Chris Burel <chrisburel[at]gmail[dot]com>',
        ABSTRACT => 'Builds the QtSmoke library'
    );
}

main();