1#!/usr/bin/perl
2
3# This script reorders config_h.SH after metaconfig
4# Changing metaconfig is too complicated
5#
6# This script is run just after metaconfig, and it
7# is run ONLY ONCE. Not to be used afterwards
8#
9# Copyright (C) 2005-2012 by H.Merijn Brand (m)'12 [22-09-2012]
10#
11# You may distribute under the terms of either the GNU General Public
12# License or the Artistic License, as specified in the README file.
13
14use strict;
15use warnings;
16
17my ($cSH, $ch, @ch, %ch) = ("config_h.SH");
18open $ch, '<', $cSH or die "Cannot open $cSH: $!\n";
19{   local $/ = "\n\n";
20    @ch = <$ch>;
21    close  $ch;
22    }
23
24sub ch_index ()
25{
26    %ch = ();
27    foreach my $ch (0 .. $#ch) {
28	while ($ch[$ch] =~ m{^/\* ([A-Z]\w+)}gm) {
29	    $ch{$1} = $ch;
30	    }
31	}
32    } # ch_index
33
34my %dep = (
35    # This symbol must be defined BEFORE ...
36    BYTEORDER		=> [ qw( UVSIZE				) ],
37    LONGSIZE		=> [ qw( BYTEORDER			) ],
38    MULTIARCH		=> [ qw( BYTEORDER MEM_ALIGNBYTES	) ],
39    HAS_QUAD		=> [ qw( I64TYPE			) ],
40    HAS_GETGROUPS	=> [ qw( Groups_t			) ],
41    HAS_SETGROUPS	=> [ qw( Groups_t			) ],
42    );
43
44my $changed;
45do {
46    $changed = 0;
47    foreach my $sym (keys %dep) {
48	ch_index;
49	foreach my $dep (@{$dep{$sym}}) {
50	    print STDERR "Check if $sym\t($ch{$sym}) precedes $dep\t($ch{$dep})\n";
51	    $ch{$sym} < $ch{$dep} and next;
52	    my $ch = splice @ch, $ch{$sym}, 1;
53	    splice @ch, $ch{$dep}, 0, $ch;
54	    $changed++;
55	    ch_index;
56	    }
57	}
58    } while ($changed);
59
60# 30327
61for (grep m{echo .Extracting \$CONFIG_H} => @ch) {
62    my $case = join "\n",
63	qq{case "\$CONFIG_H" in},
64	qq{already-done) echo "Not re-extracting config.h" ;;},
65	qq{*)}, "";
66    s{^(?=echo .Extracting)}{$case}m;
67    }
68push @ch, ";;\nesac\n";
69
70
71open  $ch, '>', $cSH or die "Cannot write $cSH: $!\n";
72print $ch <<EOW;
73#!/bin/sh
74#
75# THIS IS A GENERATED FILE
76# DO NOT HAND-EDIT
77#
78# See Porting/config_h.pl
79
80EOW
81
82print $ch @ch;
83close $ch;
84