#!/usr/bin/perl -w
# Helper script to strip unused parts out of crossrpms's rpm.specs
#
# Usage: specstrip < infile > outfile
# Copyright (C) 2005,2006 Ralf Corsépius, Ulm, Germany,
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For a copy of the GNU General Public License, visit
# http://www.gnu.org or write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# $Id$
use Getopt::Long;
use strict;
my $newlib = 0;
my $infos = 0;
my $prefix = '/usr';
my $verbose = 0;
my @languages = ();
my %options = ();
GetOptions(
\%options,
'prefix=s' => \$prefix,
'enable-infos' => sub { $options{infos} = 1 },
'disable-infos' => sub { $options{infos} = 0 },
'newlib!',
'languages=s' => \@languages,
'verbose+' => \$verbose
) or die( "failed to GetOptions" );
if ( !defined($options{infos}) )
{ # User did not override, use defaults
if ( $prefix =~ m/^\/usr$/ ) {
$infos = 0;
} elsif ( $prefix =~ m/^\/usr\/local$/ ) {
$infos = 0;
} else {
$infos = 1;
}
} else {
$infos = int($options{infos});
}
if ( defined($options{newlib}) )
{
$newlib = $options{newlib};
} else {
$newlib = 0;
}
if ( $verbose ) {
print STDERR "INFOS : $infos\n";
print STDERR "PREFIX : $prefix\n";
}
my %langs;
foreach ( split(/,/,join(',',@languages)) ){
$langs{$_} = 1;
}
my @condstack ;
my @actionstack ;
push @condstack,'<>';
my @npatterns = (
"(\"%\{_prefix\}\" (!=|==) \"/usr\")",
"(%build_cxx)",
"(%build_gnat)",
"(%build_objc)",
"(%build_gcj)",
"(%build_libgcj)",
"(%build_f95)",
"(%build_g77)",
"(%build_newlib)",
"(%build_infos)"
);
my @ppatterns = (
);
push @ppatterns, "(\"%\{_prefix\}\" " . (("$prefix" eq '/usr') ? '!=' : '==' ) . " \"/usr\")";
push @ppatterns, "(%build_gnat " . ( ($langs{gnat}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_cxx " . ( ($langs{cxx}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_objc " . ( ($langs{objc}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_gcj " . ( ($langs{gcj}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_libgcj " . ( ($langs{libgcj}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_f95 " . ( ($langs{f95}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_g77 " . ( ($langs{g77}) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_newlib " . ( ($newlib) ? "==" : "!=" ) . " 0)";
push @ppatterns, "(%build_infos " . ( ($infos) ? "==" : "!=" ) . " 0)";
my $npat = join('|',@npatterns);
my $ppat = join('|',@ppatterns);
if ( $verbose > 1 ) {
print STDERR "PPAT: ", $ppat, "\n";
print STDERR "NPAT: ", $npat, "\n";
}
my @buffer0 = <> ;
my @buffer2 ;
foreach (@buffer0)
{
chomp $_;
if ( /^%if(os|)\s+(.*)$/ )
{
push @condstack,"<$2>";
if ( $condstack[$#condstack] =~ m/$npat/ ) {
# transform unary conditionals into binary conditionals
if ( $condstack[$#condstack] =~/.*<(%[a-zA-Z_0-9]+)>.*/ ) {
$condstack[$#condstack] = "<$1 != 0>";
}
} else {
push @buffer2, { state => join('',@condstack), line => "$_" };
}
} elsif ( /^%else.*$/ )
{
my %ops = (
"!=" => "==",
"==" => "!="
);
if ( $condstack[$#condstack] =~/.*<(.*) (!=|==) (.*)>.*/ ) {
$condstack[$#condstack] = "<$1 " . $ops{$2} . " $3>";
if ( $condstack[$#condstack] =~ m/$npat/ ) {
} else {
push @buffer2, { state => join('',@condstack), line => "$_" };
}
} else {
push @buffer2, { state => join('',@condstack), line => "$_" };
}
} elsif ( /^%endif.*$/ )
{
if ( $condstack[$#condstack] =~ m/$npat/ ) {
} else {
push @buffer2, { state => join('',@condstack), line => "$_" };
}
pop @condstack;
} else {
push @buffer2, { state => join('',@condstack), line => "$_" };
}
}
my @buffer3;
foreach my $i ( @buffer2 )
{
# print STDERR $i->{state}, $i->{line}, "\n";
if ( $i->{state} =~ m/($ppat)/ ) {
} else {
push @buffer3, $i->{line}, "\n"
}
}
print STDOUT @buffer3;