From: short <> Date: Tue, 19 Aug 2003 16:22:41 +0000 (+0000) Subject: +Support for 'foreign' RPM build where "orig-$name-*.tar.gz" archive is used. X-Git-Tag: lufs_0_9_6_captive1~19 X-Git-Url: http://git.jankratochvil.net/?p=macros.git;a=commitdiff_plain;h=8d1e5812718e7fa4c79c2af83e2a217b1542eb81;ds=sidebyside +Support for 'foreign' RPM build where "orig-$name-*.tar.gz" archive is used. --- diff --git a/AutoGen.pm b/AutoGen.pm index 343d463..64dbad3 100644 --- a/AutoGen.pm +++ b/AutoGen.pm @@ -119,15 +119,25 @@ my(@names)=@_; return $r[0]; } +sub _system_error +{ +my($code,$cmd)=@_; + + confess $cmd.": $code=".join(",", + (!WIFEXITED($code) ? () : ("EXITSTATUS(".WEXITSTATUS($code).")")), + (!WIFSIGNALED($code) ? () : ("TERMSIG(" .WTERMSIG($code) .")")), + (!WIFSTOPPED($code) ? () : ("STOPSIG(" .WSTOPSIG($code) .")")), + ); +} + sub _system { my(@args)=@_; - system(@args) and confess join(" ",@args).": $?=".join(",", - (!WIFEXITED($?) ? () : ("EXITSTATUS(".WEXITSTATUS($?).")")), - (!WIFSIGNALED($?) ? () : ("TERMSIG(" .WTERMSIG($?) .")")), - (!WIFSTOPPED($?) ? () : ("STOPSIG(" .WSTOPSIG($?) .")")), - ); + my $rc_sub=pop @args if ref $args[$#args]; + $rc_sub||=sub { $_[0]==0; }; + my $rc=system(@args); + _system_error $?,join(" ",@args) if !WIFEXITED($?) || !&{$rc_sub}(WEXITSTATUS($?)); } # Assumed wildcard pattern expansion to exactly one item if !$nocheck @@ -136,10 +146,11 @@ sub _copy my(@files)=@_; my $nocheck=shift @files if $files[0] eq "nocheck"; + my $flag=shift @files if ref $files[0]; my $dest=pop @files; # expand pattern to properly match © resulting filenames count @files=map({ glob $_; } @files); - @files==copy @files,$dest or $nocheck or confess "$!"; + @files==copy((!$flag ? () : $flag),@files,$dest) or $nocheck or confess "$!"; } # Assumed wildcard pattern expansion to exactly one item if !$nocheck @@ -164,6 +175,15 @@ my(@files)=@_; _remove @files; } +sub _mkdir +{ +my(@dirs)=@_; + + for (@dirs) { + mkdir $_ or confess "$!"; + } +} + sub _prepdist { my($class,$name)=@_; @@ -177,8 +197,7 @@ my($class,$name)=@_; "ARGV"=>[qw(--copy)], "configure_args"=>[split /\s+/,$configure_args], ); - _remove $Options{"ChangeLog"} || "ChangeLog"; # force its rebuild by Makefile/rcs2log - _system "make dist $name.spec"; + _remove "nocheck",($Options{"ChangeLog"} || "ChangeLog"); # force its rebuild by Makefile/rcs2log } # $args{ @@ -193,7 +212,35 @@ my($class,%args)=@_; _rpmeval("_tmppath" )."/$name-*-root", _rpmeval("_builddir")."/$name-*"; $class->_prepdist($name); - _copy "$name-*.tar.gz",_rpmeval("_sourcedir"); + _system "make $name.spec"; + my $spec=_readfile "$name.spec"; + my $patch=($spec=~/^Patch\d*:\s*(.*)$/m)[0]; + _system "make dist"; + if (!$patch) { + _copy "$name-*.tar.gz",_rpmeval("_sourcedir"); + } + else { + my @origs; + for my $glob ("orig-$name-*.tar.{gz,Z}") { + @origs=glob "orig-$name-*.tar.{gz,Z,bz2}"; + confess "Invalid glob $glob: ".join(",",@origs) if 1!=@origs; + } + my $base=($origs[0]=~/^orig-(.*)[.]tar[.](?:gz|Z)$/)[0]; + _copy $origs[0],_rpmeval("_sourcedir")."/".($origs[0]=~/^orig-(.*)$/)[0]; + _system "tar xzf ".$origs[0]; + _mkdir $base."-orig"; + # FIXME: Copy also dot-prefixed files! + _move \1,$base."/*",$base."-orig/"; + _system "tar xzf $name-*.tar.gz"; + # Use single-argument system() as we need shell redirection. + # FIXME: Use directory-independent _cleanfiles(), not root-directory '.cvsignore'. + # "-X -" does not work, it needs to be stat(2)able file. + _system "diff -ruP -X .cvsignore -I '".'[$]\(Id\|RCSfile\)\>.*[$]'."'" + ." $base-orig/ $base/" + ." >"._rpmeval("_sourcedir")."/".$patch, + sub { $_[0]==0 || $_[0]==1; }; # diff(1) returns non-zero return code on any diffs. + _remove \1,$base,$base."-orig"; + } _system(join(" ","rpmbuild", "-ba", "--rmsource", # _remove _rpmeval("_sourcedir")."/$name-*.tar.gz"; @@ -217,8 +264,7 @@ my($class,%args)=@_; my $name=$Options{"name"}; $class->_prepdist($name); - _system "tar xzf $name-*.tar.gz"; - _remove "$name-*.tar.gz"; # permit "cd $name-*" below + _system "make distdir"; _system(join(" ","cd $name-*;dpkg-buildpackage", "-rfakeroot", ($args{"sign"} ? () : ("-us","-uc")),