summaryrefslogtreecommitdiff
path: root/build-aux/build_info.pl
blob: f346d3d2ae688898cab8303d26f91f4c049cbb9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env perl

# Generate build_info.c.

# Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.

# 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 3 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.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use strict;
use warnings;

use Carp qw(croak);

my $file = shift @ARGV;

{
    my $data = parse_config();
    output_code($data);
}

sub parse_config
{
    my $features = [];
    my $choice_key;
    my $choice = [];
    my $list = $features;

    open(my $fh, '<', "$file.in") or die "Cannot open $file.in: $!";

    while (<$fh>) {
        next if /^\s*$/;

        if ($list eq $choice) {
            unless (s/^\s+//) {
                $list = $features;
                push @$features, [$choice_key, $choice];
                $choice = [];
                undef $choice_key;
            }
        } elsif (/^([A-Za-z0-9_-]+) \s+ choice:\s*$/x) {
            $choice_key = $1;
            $list = $choice;
            next;
        }

        if (/^([A-Za-z0-9_-]+) \s+ (.*)$/x) {
            push @$list, [$1, $2];
        } else {
            croak "Can't parse line: $_";
        }
    }

    if ($list eq $choice) {
        push @$features, [$choice_key, $choice];
    }

    close($fh);

    return $features;
}

sub output_code
{
    my $features = shift;

    open(my $fh, '>', "$file") or die "Cannot open $file: $!";

    print $fh do { local $/; <DATA> }, "\n";
    print $fh <<EOC;
const char *compiled_features[] =
{

EOC
    foreach my $feature (sort { $a->[0] cmp $b->[0] } @$features) {
        my ($name, $check) = @$feature;

        if (ref $check eq 'ARRAY') {
            my ($ch_name, $ch_check) = @{ shift @$check };
            print $fh <<EOC;
#if $ch_check
  "+$name/$ch_name",
EOC
            foreach my $choice (@$check) {
                ($ch_name, $ch_check) = @$choice;

                print $fh <<EOC;
#elif $ch_check
  "+$name/$ch_name",
EOC
            }
                print $fh <<EOC;
#else
  "-$name",
#endif

EOC
        } else {
            print $fh <<EOC;
#if $check
  "+$name",
#else
  "-$name",
#endif

EOC
        }
    }
    print $fh <<EOC;

  /* sentinel value */
  NULL
};


EOC
}

__DATA__
/* Autogenerated by build_info.pl - DO NOT EDIT */

/* This stores global variables that are initialized with
   preprocessor declarations for output with the --version flag.

   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.  */

#include "wget.h"
#include <stdio.h>
#include "version.h"