Blame view

misc/maintenance/reorder_addlibs.sh 3.2 KB
8dcb6dfcb   Yannick Estève   first commit
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
  #!/usr/bin/env bash
  
  # run this from ../..
  
  if [ "$1" == "--really" ]; then
    really_do_it=true
  else
    really_do_it=false
    echo "$0: this will not really do anything, use --really for that."
  fi
  
  
  cd src
  
  cat Makefile | perl -e ' @libdirs = ();  while(<>){ if ($x && m/(\S+)\:/) { push @libdirs, $1; chop; print "$_ .phony
  "; } if (m/have inter-dependencies/) {$x=1;}} print("all: " . join(" ", @libdirs) . "
  "); print(".phony:
  ")' > Makefile.temp
  
  # for each directory this automatic rule says, just print its name.
  echo '%:' >> Makefile.temp
  printf '\techo ${@F}
  ' >> Makefile.temp
  
  # the following prints out the directory names in the order we want to
  # have them in the ADDLIBS in the individual Makefiles; note, 'tac' reverses
  # the order of its input lines.
  make -s -f Makefile.temp all | grep -v all | grep -v .phony | tac > library_order
  
  echo "Library order is:"
  cat library_order
  
  for f in */Makefile; do
    echo "$0: processing $f"
    cat $f | perl -e '
      open(F, "<library_order") || die "opening file library_order";
      $n = 1;
      while (<F>) { chop; $library_name_to_order{$_} = $n; $order_to_library_name{$n} = $_; $n++; }
      while(<>) {
        if (m/^ADDLIBS = (.+)/) {
          @addlibs = ();
          $cur_line = $1;
          while (1) {
             if ($cur_line =~ s/\\$//) { $had_backslash = 1; } else { $had_backslash = 0; }
             @A = split(" ", $cur_line);
             push @addlibs, @A;
             if (!$had_backslash) { last; }  # break from the while loop.
             if (!($cur_line = <>)) { last; }
          }
          @weird_libs = ();
          %normal_lib_names = {};
          foreach $lib (@addlibs) {
            if ($lib =~ m|^\.\./(.+)/kaldi-(.+)\.a$| && $1 == $2 && defined $library_name_to_order{$1}) {
               $normal_lib_names{$1} = 1;
            } else { push @weird_libs, $lib; }
          }
          @normalized_addlibs = ();
          for ($k = 1; $k < $n; $k++) {
             $test_name = $order_to_library_name{$k};
              if (defined $normal_lib_names{$test_name}) {
                 push @normalized_addlibs, "../$test_name/kaldi-$test_name.a";
              }
           }
          if (@weird_libs > 0) {  print STDERR "Unexpected libraries: " . join(":", @weird_libs) . "
  "; }
          # unexpected libraries that aren not part of the normal list will go last.
          push @normalized_addlibs, @weird_libs;
          @rearranged_lines = ();
          $cur_line = "";
          $max_partial_line_size = 70; # after the initial "ADDLIBS = " or spaces.
          foreach $lib (@normalized_addlibs) {
              if (length($cur_line . $lib . " ") > $max_partial_line_size) {
                  push @rearranged_lines, $cur_line; $cur_line = "";
              }
              $cur_line .= ($lib . " ");
          }
          if ($cur_line ne "") { push @rearranged_lines, $cur_line; }
          $num_lines = @rearranged_lines;
          for ($k = 0; $k < $num_lines; $k++) {
             if ($k == 0) { print "ADDLIBS = "; } else { print "          "; }
             print $rearranged_lines[$k];
             if ($k + 1 < $num_lines) { print "\\
  "; } else { print "
  "; }
          }
        } else {
          print;
        }
      } ' > temp_makefile
     diff $f temp_makefile
     if $really_do_it; then
       cp temp_makefile $f
     fi
  done
  
  rm library_order Makefile.temp