QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1427|回复: 1

latest E17 build script

[复制链接]
发表于 2006-5-28 11:27:23 | 显示全部楼层 |阅读模式
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)

[code:1]
#!/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 @_;
}
[/code:1]
 楼主| 发表于 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.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 06:02 , Processed in 0.048038 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表