process roken.h.in with a perlscript when cross compiling
This commit is contained in:
182
cf/roken-h-process.pl
Normal file
182
cf/roken-h-process.pl
Normal file
@@ -0,0 +1,182 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
require 'getopts.pl';
|
||||
|
||||
my $debug = 0;
|
||||
|
||||
Getopts('dc:p:o:') || die "foo";
|
||||
|
||||
if ($opt_d) {
|
||||
$debug = 1;
|
||||
}
|
||||
|
||||
die "missing arg" if (!defined $opt_c || !defined $opt_p || !defined $opt_o);
|
||||
|
||||
my %defines;
|
||||
my $IN;
|
||||
my $OUT;
|
||||
|
||||
print "parse config.h\n" if ($debug);
|
||||
|
||||
open IN, $opt_c || die "failed open ${opt_c}";
|
||||
|
||||
my @nesting;
|
||||
|
||||
push @nesting, 1;
|
||||
|
||||
while (<IN>) {
|
||||
if (m/\s*#ifdef\s+(.*)/) {
|
||||
my $var = $1;
|
||||
if (defined $defines{$var}) {
|
||||
push @nesting, 1;
|
||||
} else {
|
||||
push @nesting, 0;
|
||||
}
|
||||
next;
|
||||
} elsif (m/\s*#ifndef\s+(.*)/) {
|
||||
my $var = $1;
|
||||
if (defined $defines{$var}) {
|
||||
push @nesting, 0;
|
||||
} else {
|
||||
push @nesting, 1;
|
||||
}
|
||||
next;
|
||||
} elsif (m/\s*#else/) {
|
||||
my $var = pop @nesting;
|
||||
$var = !$var;
|
||||
push @nesting, $var;
|
||||
next;
|
||||
} elsif ($nesting[$#nesting] and m/\s*#define\s+(\w+)\s+(\S+)/) {
|
||||
my $res = $2;
|
||||
$res = 1 if (!defined $res);
|
||||
$defines{$1} = $res;
|
||||
}
|
||||
}
|
||||
|
||||
close IN;
|
||||
|
||||
if ($debug) {
|
||||
foreach my $i (keys %defines) {
|
||||
print "k: $i v: $defines{$i}\n";
|
||||
}
|
||||
}
|
||||
|
||||
open IN, "$opt_p" || die "failed open ${opt_p}";
|
||||
open OUT, ">$opt_o" || die "failed open ${opt_o}";
|
||||
|
||||
print "parse roken.h.in\n" if ($debug);
|
||||
|
||||
print OUT "/* This is an OS dependent, generated file */\n";
|
||||
print OUT "\n";
|
||||
print OUT "\n";
|
||||
print OUT "#ifndef __ROKEN_H__\n";
|
||||
print OUT "#define __ROKEN_H__\n";
|
||||
print OUT "\n";
|
||||
|
||||
@nesting = (1);
|
||||
|
||||
while (<IN>) {
|
||||
if (m/\s*#ifdef\s+(.*)/) {
|
||||
my $var = $1;
|
||||
if (defined $defines{$var}) {
|
||||
push @nesting, 1;
|
||||
} else {
|
||||
push @nesting, 0;
|
||||
}
|
||||
next;
|
||||
} elsif (m/\s*#ifndef\s+(.*)/) {
|
||||
my $var = $1;
|
||||
if (defined $defines{$var}) {
|
||||
push @nesting, 0;
|
||||
} else {
|
||||
push @nesting, 1;
|
||||
}
|
||||
next;
|
||||
} elsif (m/\s*#if\s+(.*)/) {
|
||||
my $res = parse_if($1);
|
||||
print "line = $res: $1\n" if ($debug);
|
||||
push @nesting, $res;
|
||||
next;
|
||||
} elsif (m/\s*#elif\s+(.*)/) {
|
||||
my $res = pop @nesting;
|
||||
if ($res gt 0) {
|
||||
$res = -1;
|
||||
} else {
|
||||
my $res = parse_if($1);
|
||||
}
|
||||
push @nesting, $res;
|
||||
next;
|
||||
} elsif (m/\s*#else/) {
|
||||
my $var = pop @nesting;
|
||||
$var = !$var;
|
||||
push @nesting, $var;
|
||||
next;
|
||||
} elsif (m/\s*#endif/) {
|
||||
pop @nesting;
|
||||
next;
|
||||
}
|
||||
print "line: $_\n" if ($debug);
|
||||
print "nesting dep $#{nesting}\n" if ($debug);
|
||||
my $i = 0, $t = 1;
|
||||
while ($i le $#nesting) {
|
||||
$t = 0 if ($nesting[$i] le 0);
|
||||
print "nesting $i val $nesting[$i] -> $t\n" if ($debug);
|
||||
$i++;
|
||||
}
|
||||
if ($t) {
|
||||
print OUT;
|
||||
}
|
||||
}
|
||||
|
||||
print OUT "#define ROKEN_VERSION " . $defines{"PACKAGE_VERSION"} . "\n";
|
||||
print OUT "\n";
|
||||
print OUT "#endif /* __ROKEN_H__ */\n";
|
||||
|
||||
|
||||
close IN;
|
||||
|
||||
exit 0;
|
||||
|
||||
sub parse_if
|
||||
{
|
||||
my ($neg, $var);
|
||||
|
||||
$_ = shift;
|
||||
|
||||
if (m/^\s*$/) {
|
||||
print "end $_\n" if ($debug);
|
||||
return 1;
|
||||
} elsif (m/^([^&]+)\&\&(.*)$/) {
|
||||
print "$1 and $2\n" if ($debug);
|
||||
return parse_if($1) and parse_if($2);
|
||||
} elsif (m/^([^\|]+)\|\|(.*)$/) {
|
||||
print "$1 or $2\n" if ($debug);
|
||||
return parse_if($1) or parse_if($2);
|
||||
} elsif (m/^\s*(\!)?\s*defined\((\w+)\)/) {
|
||||
($neg, $var) = ($1, $2);
|
||||
print "def: ${neg}-defined(${var})\n" if ($debug);
|
||||
my $res = defined $defines{$var};
|
||||
if ($neg eq "!") {
|
||||
if ($res) {
|
||||
$res = 0;
|
||||
} else {
|
||||
$res = 1;
|
||||
}
|
||||
}
|
||||
print "res: $res\n" if ($debug);
|
||||
return $res;
|
||||
} elsif (m/^\s*(\!)?(\w+)/) {
|
||||
($neg, $var) = ($1, $2);
|
||||
print "var: $neg $var\n" if ($debug);
|
||||
my $res;
|
||||
if (defined $defines{$var}) {
|
||||
$res = $defines{$var};
|
||||
} else {
|
||||
$res = 0;
|
||||
}
|
||||
$res = ! $res if ($neg =~ m/!/);
|
||||
print "res: $res\n" if ($debug);
|
||||
return $res;
|
||||
}
|
||||
die "failed parse: $_\n";
|
||||
}
|
@@ -188,6 +188,9 @@ SUFFIXES += .hin
|
||||
.hin.h:
|
||||
cp $< $@
|
||||
|
||||
# Make make-roken deprecated in 1.4 when we know that roken-h-process.pl works
|
||||
if !CROSS_COMPILE
|
||||
|
||||
roken.h: make-roken$(EXEEXT)
|
||||
@./make-roken$(EXEEXT) > tmp.h ;\
|
||||
if [ -f roken.h ] && cmp -s tmp.h roken.h ; then rm -f tmp.h ; \
|
||||
@@ -196,6 +199,16 @@ roken.h: make-roken$(EXEEXT)
|
||||
make-roken.c: roken.h.in roken.awk
|
||||
$(AWK) -f $(srcdir)/roken.awk $(srcdir)/roken.h.in > make-roken.c
|
||||
|
||||
else
|
||||
|
||||
roken.h: $(top_srcdir)/cf/roken-h-process.pl roken.h.in
|
||||
perl $(top_srcdir)/cf/roken-h-process.pl \
|
||||
-c $(top_builddir)/include/config.h \
|
||||
-p $(srcdir)/roken.h.in -o roken.h
|
||||
|
||||
endif
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
roken.awk roken.h.in \
|
||||
$(man_MANS) \
|
||||
|
Reference in New Issue
Block a user