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