无双TM 发表于 2006-5-28 11:27:23

latest E17 build script

you can:
1.use this script to download E17 cvs source code(use --cvs option)
2.build E17 to deb packages(default)
3.use "autogen.sh --prefix=/usr;make;make install" to build e17(add --make option)


#!/usr/bin/perl
#
use strict;
use FileHandle;
use Getopt::Long;

my$autobuilddir   = 1;    #   if true,then auto build all directory
my$autobuild      = 1;    #   if true,auto build all packages in a directory
my$autocvs      = 0;    #   if true, auto download source code from CVS
my$usedeb          = 1;    #   if true, will create deb and install deb package,else use "make install" to install
my$versuffix          = "";   #        if you want to special the suffix to all deb package's versions,you can add to here,such as "-0527"

my$help          = 0;
my$make          = 0;
GetOptions(
    'cvs'   =>\$autocvs,
    'help'=>\$help,
    'deb'   =>\$usedeb,
    'make'   =>\$make,
);
usage()if($help);
$usedeb        = 0 if($make);

my @e17objs =(
    ['e17/libs','../..',
    'eet',
    'evas',
    'ecore',
    'embryo'
    ],
    ['e17/apps','../..',
    'e'
    ],
);
my @eflobjs =(
    ['e17/libs','../..',
    'eet',
    'edb',
    'evas',
    'ecore',
    'embryo',
    'imlib2',
    'edje',
    'epeg',
    'epsilon',
    'esmart',
    'emotion',#        (note that you'll need to have xine-lib installed as emotion uses it)
    'engrave',#        (this is currently needed for e_utils only)
    'ewl',        #        (this is needed for some apps only)
    'etox'
    ],
    ['e17/proto','../..',
    'etk'         #        (this is needed for some apps only)
    ],
    ['e17/apps','../..',
    'e',
    'entice',        #       (image viewer)
    'entrance',#       (login manager)
    'eclair',        #       (media player)
    'elicit'         #       (color picker/screen magnifier)
    ],
    ['misc','..',
    'engage',        #       (standalone dockbar and E17 module)
    'erss',        #       (RSS feed application that does not work correctly in E17)
    'embrace' #       (mail checker and E17 module)
    ],
    ['misc','..',
    'entropy',#       (file manager)
    'exhibit'        #       (image viwer)
    ],
);

my$fd_build   = new FileHandle ">build.log";
my$fd_screen= new FileHandle ">screen.log";

check_debbuildenv();    # if you don't want to build deb package, comment this line
if($autocvs){
    get_cvs() ;
    die;
}
do_install(@eflobjs);

close($fd_build);
close($fd_screen);



sub usage{
print   "inse17.pl options:\n";
print   "\t--cvs        only do cvs update,then exit\n";
print   "\t--make        use \"autogen.sh;make;make install\" to build and install the E17\n";
print   "\t--deb        build deb pkg then install\n";
print   "\t--help        show help file\n";
print   "default is --deb\nif you want to sepcial build packages,you can edit \@eflobjs array\n";
die;
}

sub do_install(){
    my @compileobjs = @_;
    log_screen("\n\nstart build debian packages\n\n");
    my $objs;
    foreach $objs (@compileobjs){
        my   @objarray   = @$objs;
        my   $dir       = shift(@objarray);
        my   $back_dir   = shift(@objarray);
        if( ! -d $dir ){
          log_screen("dir:$dir not exist,will skip compile it\n");
          next;
        }
        next if( (!$autobuilddir)
          && (!choseact("are you want to build dir:$dir\n")) );

        log_screen("start parse:<<<<<   $dir>>>>>: back:$back_dir\n");
        chdir $dir;
        system('rm -f *.deb *.dsc *.tar.gz *.changes');

        my   $subdir;
        foreach $subdir (@objarray){
          if( !(-d $subdir) ){
                log_screen("dir:$subdir not exist,skip compile it\n");
                next;
          }
          chdir($subdir);
          while( parsedir($subdir) ){}
          $fd_build->autoflush(1);
          log_screen("\n");
          chdir("../");
          system('rm -f *.dsc *.tar.gz *.changes');
        }
        chdir $back_dir;
    }
}




sub parsedir()
{
    my $pkg   = $_[0];
    log_screen("\n\nenter directory:".$pkg."\n");
    return 0 if((!$autobuild) && (!choseact("are you want to build:$pkg\n")) );
    my $curpwd   = qx(pwd);
    chomp($curpwd);

    $fd_build->autoflush(0);
    log_screen("\tcur dir is:\n\t$curpwd\n");

    chmod 755,'debian/rules' if(! -x 'debian/rules');
    chmod 755,'autogen.sh' if(! -x 'autogen.sh');
    system("make distclean >/dev/null 2>&1");

    if(!$usedeb){
#if you don't use deb,then you can call these line
        run_cmd('CFLAGS="-O3 -mtune=pentium4" ./autogen.sh --prefix=/usr');
        run_cmd('make');
        run_cmd('make uninstall');
        run_cmd('make install');
        return ;
    }

    mk_changelog();

    log_screen("\trun:   dpkg-buildpackage -us -uc -rfakeroot 2>&1\n");
    open(MAKEFI,"dpkg-buildpackage -us -uc -rfakeroot 2>&1|") || die "exec fail\n";
    log_screen( 'dpkg-buildpackage -us -uc -rfakeroot 2>&1'."\n");

    my @pkgs;
    my $line;
    while($line=<MAKEFI>){
        my $notlog   = 1;
        if($line=~m/\berror\b/i){
          if($line!~m/dpkg-genchanges:\s+error:\s+cannot\s+open\s+\.dsc/){
                $notlog = 0;
                log_screen($line);
          }
        }
        log_build( $line) if($notlog);

        if($line=~m/\bUnmet\s+build\s+dependencies\b/i){
          log_screen($line);
          log_screen("are you want to install missing dependence then rebuild this package or skip build this package(default:skip)\n");
          log_screen("press n to skip,else you press 'Y' after finish install missing packages\n");
          return choseact("") ;
        }
        next if($line!~m/dpkg-deb:\s+building\s+package\s+\`([^']+)\'\s+in\s+\`([^']+)\'/);

        log_screen("\tpkg:[$1:\t$2]\n");
        push(@pkgs,$2);
    }
    close(MAKEFI);

    if($#pkgs < 0){
        log_screen("error no package found,build message is write to build.log file\n");
    }
    else{
        my $pkgfile = join(" ",@pkgs);
        log_screen( "\n>>>>>>>>>\n\tdpkg -i $pkgfile\n\n");
        run_cmd("dpkg -i $pkgfile");
    }
    log_screen("\n");
    return 0;
}





#
#   choose user select
#
sub choseact()
{
    log_screen( $_[0]."\nplease input yes or no [Y]\n");
    my $in=<STDIN>;
    if($in=~m/n/i){
        log_screen( "cancel\n");
        return 0;
    }
    log_screen( "\n");
    return 1;
}


#
#   downlaod E17 source code from CVS
#
sub get_cvs()
{
    print   "get CVS source code\n";
    print   "login CVS:,when need you input password,press return directly\n";
    print   'cvs -d:pserver:[email protected]:/var/cvs/e login'."\n";
    system('cvs -d:pserver:[email protected]:/var/cvs/e login');
    print   'chech out E17:'."\n";
    print   'cvs -z3 -d:pserver:[email protected]:/var/cvs/e co e17'."\n";
    system('cvs -z3 -d:pserver:[email protected]:/var/cvs/e co e17');
    print   'chech out Misc:'."\n";
    print   'cvs -z3 -d:pserver:[email protected]:/var/cvs/e co misc'."\n";
    system('cvs -z3 -d:pserver:[email protected]:/var/cvs/e co misc');
}

#
#   check debian build env
#
sub check_debbuildenv()
{
    my @pkglist = qx(dpkg --get-selections);
    my $lines   = join(':',@pkglist);

    check_pkg($lines,"autoconf",1);
    check_pkg($lines,"automake",1,"(version >=1.7)");
    check_pkg($lines,"libtool",1);
    check_pkg($lines,"pkg-config",1);

    if($usedeb){
        check_pkg($lines,"fakeroot",1);
        check_pkg($lines,"dpkg-dev",1);
    }

    check_pkg($lines,"libxcursor-dev",0,"(it may need by ecore,if link ecore fail, please install it)");

    log_screen("if you use xorg and the build script report xlibs-dev not install, you need to modify the {directory}/debian/control file, change xlibs-dev to libx11-dev\n");
}
sub check_pkg()
{
    my($pkglists,$pkgname,$exitmode,$version)=@_;
    my$exit   = 0;
    $exit       = 1 if( $pkglists!~m/\b$pkgname[^:]*\s+install/);
    if( $exit ){
        log_screen("WARNNING: ") if(! $exitmode );
        log_screen("you don't install $pkgname, please use \n\tapt-get install $pkgname\n to install it.$version \n");
        die if( $exitmode );
    }
}







#
#   run a command,and log command output to screen.log
#
sub run_cmd()
{
    my $cmd   = $_[0];
    my $fd;
    open($fd,"$cmd 2>&1 |");
    if( ! $fd ){
        log_screen("exec $cmd fail,check if this command exist\n");
        die;
    }
    my $line;
    while($line=<$fd>){
        log_screen($line);
    }
}




sub mk_changelog()
{
    my        $fcontrl;
    open($fcontrl,"debian/control");
    if( ! $fcontrl ){
        log_screen("open control file fails\n");
        return ;
    }

    my        $line;
    my        $ver;
    while($line=<$fcontrl>){
        chomp($line);
        if( $line=~m/Standards-Version:\s*(\w.*)/i){
          $ver        = $1;
          chomp($ver);
          last;
        }
    }

    close($fcontrl);
    if(!$ver){
        log_screen("get version fal\n");
        return ;
    }
    log_screen("version number is:$ver\n");

    my        $fi;
    my        $fo;
    open($fi,"debian/changelog.in");
    open($fo,">debian/changelog");

    $line   = <$fi>;

    $line   =~s/\@VERSION\@/$ver$versuffix/;
    print   $fo $line;
    while($line=<$fi>){
        print        $fo $line;
    }
    close($fi);
    close($fo);
}






#
#   log screen output
#
sub log_screen()
{
    print   @_;
    print   $fd_screen @_;
    log_build(@_);
}

#
#   log build result to build.log
#
sub log_build()
{
    print   $fd_build @_;
}

无双TM 发表于 2006-5-28 11:35:42

when I use it to build latest E17, evas has problem
I don't know if it is E17's source problem or my env problem
so don't use it now.
页: [1]
查看完整版本: latest E17 build script