1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#!/usr/bin/env perl
2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaouse strict;
3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaouse File::Find;
4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaouse File::Copy;
5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaouse Digest::MD5;
6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomy @fileTypes = ("cpp", "c");
8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomy %dirFiles;
9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomy %dirCMake;
10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosub GetFiles {
12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $dir = shift;
13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $x = $dirFiles{$dir};
14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  if (!defined $x) {
15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    $x = [];
16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    $dirFiles{$dir} = $x;
17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return $x;
19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosub ProcessFile {
22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $file = $_;
23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $dir = $File::Find::dir;
24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  # Record if a CMake file was found.
25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  if ($file eq "CMakeLists.txt") {
26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    $dirCMake{$dir} = $File::Find::name;
27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    return 0;
28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  # Grab the extension of the file.
30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  $file =~ /\.([^.]+)$/;
31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $ext = $1;
32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $files;
33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  foreach my $x (@fileTypes) {
34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    if ($ext eq $x) {
35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      if (!defined $files) {
36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao        $files = GetFiles($dir);
37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      }
38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      push @$files, $file;
39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      return 0;
40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    }
41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return 0;
43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosub EmitCMakeList {
46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $dir = shift;
47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $files = $dirFiles{$dir};
48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  if (!defined $files) {
50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    return;
51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  foreach my $file (sort @$files) {
54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    print OUT "  ";
55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    print OUT $file;
56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    print OUT "\n";
57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosub UpdateCMake {
61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $cmakeList = shift;
62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $dir = shift;
63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $cmakeListNew = $cmakeList . ".new";
64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  open(IN, $cmakeList);
65e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  open(OUT, ">", $cmakeListNew);
66e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $foundLibrary = 0;
67e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
68e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  while(<IN>) {
69e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    if (!$foundLibrary) {
70e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      print OUT $_;
71e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      if (/^add_clang_library\(/ || /^add_llvm_library\(/ || /^add_llvm_target\(/
72e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao          || /^add_executable\(/) {
73e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao        $foundLibrary = 1;
74e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao        EmitCMakeList($dir);
75e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      }
76e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    }
77e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    else {
78e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      if (/\)/) {
79e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao        print OUT $_;
80e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao        $foundLibrary = 0;
81e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      }
82e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    }
83e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
84e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
85e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  close(IN);
86e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  close(OUT);
87e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
88e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  open(FILE, $cmakeList) or
89e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    die("Cannot open $cmakeList when computing digest\n");
90e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  binmode FILE;
91e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $digestA = Digest::MD5->new->addfile(*FILE)->hexdigest;
92e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  close(FILE);
93e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
94e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  open(FILE, $cmakeListNew) or
95e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    die("Cannot open $cmakeListNew when computing digest\n");
96e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  binmode FILE;
97e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  my $digestB = Digest::MD5->new->addfile(*FILE)->hexdigest;
98e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  close(FILE);
99e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
100e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  if ($digestA ne $digestB) {
101e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    move($cmakeListNew, $cmakeList);
102e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    return 1;
103e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
104e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
105e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  unlink($cmakeListNew);
106e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return 0;
107e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
108e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
109e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosub UpdateCMakeFiles {
110e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  foreach my $dir (sort keys %dirCMake) {
111e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    if (UpdateCMake($dirCMake{$dir}, $dir)) {
112e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao      print "Updated: $dir\n";
113e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    }
114e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  }
115e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
116e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
117e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaofind({ wanted => \&ProcessFile, follow => 1 }, '.');
118e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoUpdateCMakeFiles();
119e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
120