|
|

楼主 |
发表于 2006-9-20 08:41:08
|
显示全部楼层
// newe17.pl 2006/9/1
使用
perl newe17.pl --cvs 做cvs下载
使用 perl newe17.pl 做自动安装
- #!/usr/bin/perl
- #
- use strict;
- use FileHandle;
- use Getopt::Long;
- my $versuffix = ""; # if you want to special the suffix to all deb package's versions,you can add to here,such as "-0527"
- # cvs server address
- my $cvsserver = ":pserver:anonymous\@anoncvs.enlightenment.org:/var/cvs/e";
- # if you use make to install,you can set build options
- my $manualinsdir ="/usr"; # where install e17 to
- my $manualinscflags ='CFLAGS="-O3 -mtune=pentium4" '; # compile optimize
- my $usedeb = 1; # if true, will create deb and install deb package,else use "make install" to install
- my $autobuilddir = 1; # if true,then auto build all directory
- my $autobuildsubdir= 1; # if true,auto build all packages in a directory
- my $autocvs = 0; # if true, auto download source code from CVS
- my $builde17 = 0; # if not set, default build all efl program
- my $help = 0;
- my $make = 0;
- my $confirmdir = 0;
- my $confirmsubdir = 0;
- my $buildnext = 0;
- GetOptions(
- 'cvs' =>\$autocvs,
- 'e17' =>\$builde17,
- 'help' =>\$help,
- 'make' =>\$make,
- 'deb' =>\$usedeb,
- 'idir' =>\$confirmdir,
- 'isubdir' =>\$confirmsubdir,
- 'buildnext' =>\$buildnext
- );
- usage() if($help);
- $usedeb = 0 if($make);
- $autobuilddir = 0 if($confirmdir);
- $autobuildsubdir = 0 if($confirmsubdir);
- my @e17objs =(
- ['e17/libs','../..',
- 'eet',
- 'evas',
- 'ecore',
- 'embryo',
- 'edje'
- ],
- ['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)
- ],
- ['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)
- 'examine'
- ],
- ['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";
- my $useobjs = \@eflobjs;
- $useobjs = \@e17objs if( $builde17 );
- print "\nthe script output will redefine to\n\tbuild.log\n,the screen output will redefine to \n\tscreen.log\nif you want to check fail reason, please open these two files\n";
- if($autocvs){
- get_cvs_dirs(@$useobjs);
- die;
- }
- check_debbuildenv(); # if you don't want to build deb package, comment this line
- do_install(@$useobjs);
- 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--e17 only build E17 windows manager,default will build all EFL program\n";
- print "\t--make use "$manualinscflags autogen.sh --prefix=$manualinsdir;make;make install" to build and install the E17\n";
- print "\t--deb build deb pkg then install\n";
- print "\t--idir when build every big dir,make sure first\n";
- print "\t--isubdir when build every sub dir,make sure first\n";
- print "\t--buildnext if you want to skip the first build dir,use this options\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) || $buildnext )
- && (!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");
- if( ((!$autobuildsubdir) || $buildnext)
- && (!choseact("are you want to build:$pkg\n")) ){
- return 0;
- }
- $buildnext = 0;
- 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');
- if(!$usedeb){
- #if you don't use deb,then will call these line
- system("make distclean >/dev/null 2>&1");
- run_cmd($manualinscflags.'./autogen.sh --prefix='.$manualinsdir);
- run_cmd('make');
- run_cmd('make uninstall');
- run_cmd('make install');
- return ;
- }
- run_cmd($manualinscflags."./autogen.sh --prefix=/usr",1);
- system("make distclean >/dev/null 2>&1");
- 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/
- && $line!~m/\(ignored\)/ ){
- $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\n");
- log_screen("if the dependence is refer to a deprecate package,you can edit $curpwd/debian/control file to remove or modify the dependence\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) if( $2!~m/debug/);
- }
- close(MAKEFI);
- my $pkgfile = join(" ",@pkgs);
- chomp($pkgfile);
- if( $pkgfile ){
- run_cmd("dpkg -i $pkgfile");
- }
- else{
- log_screen("error no package found,build message is write to build.log file\n");
- }
- 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_dirs()
- {
- my @dirs = @_;
- log_screen("\n\nstart get CVS sourcecode\n\n");
- log_screen("cvs -d$cvsserver login\n");
- system("cvs -d$cvsserver login");
- log_screen('check out E17:'."\n");
- my $objs;
- foreach $objs (@dirs){
- my @objarray = @$objs;
- my $dir = shift(@objarray);
- shift(@objarray);
- log_screen("start checkout:<<<<< $dir >>>>>\n");
- my $subdir;
- foreach $subdir (@objarray){
- log_screen("cvs -z3 -d$cvsserver co $dir/$subdir\n");
- system("cvs -z3 -d$cvsserver co $dir/$subdir > /dev/NULL");
- }
- }
- }
- #
- # 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, replace xlibs-dev with xorg-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,$hide) = @_;
- my $fd;
- open($fd,"$cmd 2>&1 |");
- log_screen("\trun:\t$cmd\n");
- if( ! $fd ){
- log_screen("\trun $cmd fail,check build.log to look the fail\n");
- die;
- }
- my $line;
- while($line=<$fd>){
- if($hide){
- log_build($line);
- }
- else{
- log_screen($line);
- }
- }
- }
- sub mk_changelog()
- {
- my $fcontrl;
- open($fcontrl,"configure");
- if( ! $fcontrl ){
- log_screen("open configure to read version info fails\n");
- return ;
- }
- my $line;
- my $ver;
- my $stat = 0;
- while($line=<$fcontrl>){
- if($line=~m/^\s*PACKAGE=\s*/){
- $stat = 1;
- next;
- }
- if($stat == 1 ){
- if( $line=~m/^\s*VERSION\s*=\s*(\w.*)/i){
- $ver = $1;
- chomp($ver);
- last;
- }
- $stat = 0;
- }
- }
- close($fcontrl);
- if(!$ver){
- log_screen("get version fail\n");
- return ;
- }
- log_screen("\tversion 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 @_;
- }
复制代码 |
|