|
使用方法:
保存成inse17.pl
./inse17,pl --cvs
只进行cvs更新,不编译
./inse17.pl
自动编译EFL程序源码成deb包 然后自动安装
./inse17.pl --e17
只编译e17窗口管理器并安装
./inse17.pl --buildnext
如果你前面已经编译了一部分,现在想继续而不是从头开始编译所有包,那使用这个选项
./inse17.pl --help
查看帮助
由于新的debian 从changelog里面读版本信息,而这个文件每次make distclean时都会删除
所以我根据configure 里面的信息生成新的changelog
最新改正:
2006.6.5 增加buildnext选项
增加examine目录,这个目录被engage依赖
2006.6.4 版本信息从configure文件里面拿
另外debian sid里面编译时会出错,这个问题是因为sid中autoconf有兼容问题引起的
需要安装debian stable里面的autoconf(版本号2.59a-3,,下载地址http://ftp.us.debian.org/debian/pool/main/a/autoconf/autoconf_2.59a-3_all.deb,下载后使用dpkg -i autoconf_2.59a-3_all.deb安装)
然后修改一下/etc/apt/preferences
我的内容如下:
[code:1]
Package: enlightenment
Pin: version 0.16.999*
Pin-Priority: 999
Package: enlightenment-data
Pin: version 0.16.999*
Pin-Priority: 999
Package: autoconf
Pin: version 2.59a-3
Pin-Priority: 999
[/code:1]
inse17.pl的内容:
[code:1]
#!/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){
run_cmd("cvs -z3 -d$cvsserver co $dir/$subdir",1);
}
}
}
#
# 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 @_;
}
[/code:1] |
|