summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-07-15 21:10:57 +0000
committerTed Kremenek <kremenek@apple.com>2009-07-15 21:10:57 +0000
commit722f6508a41d6670aff10ab374c85d59cc470970 (patch)
treeefa198b95baa9b8c1cee4320497e8f35b852c5bd
parent3e808edac9e5a795ba561046e63d241ab09dffaf (diff)
downloadbcm5719-llvm-722f6508a41d6670aff10ab374c85d59cc470970.tar.gz
bcm5719-llvm-722f6508a41d6670aff10ab374c85d59cc470970.zip
Add script 'UpdateCMakeLists.pl'. This script can be used (manually) to update
the list of files in the CMakeLists.txt files. It works by scanning (starting from the working directory from which it is run) all subdirectories containing CMakeLists.txt files. It then updates the list of C and C++ files in the 'add_llvm_library' and 'add_clang_library' lists. Sources file lists are emitted in lexical order. llvm-svn: 75833
-rwxr-xr-xllvm/utils/UpdateCMakeLists.pl118
1 files changed, 118 insertions, 0 deletions
diff --git a/llvm/utils/UpdateCMakeLists.pl b/llvm/utils/UpdateCMakeLists.pl
new file mode 100755
index 00000000000..94e69ce2556
--- /dev/null
+++ b/llvm/utils/UpdateCMakeLists.pl
@@ -0,0 +1,118 @@
+#!/usr/bin/env perl
+use strict;
+use File::Find;
+use File::Copy;
+use Digest::MD5;
+
+my @fileTypes = ("cpp", "c");
+my %dirFiles;
+my %dirCMake;
+
+sub GetFiles {
+ my $dir = shift;
+ my $x = $dirFiles{$dir};
+ if (!defined $x) {
+ $x = [];
+ $dirFiles{$dir} = $x;
+ }
+ return $x;
+}
+
+sub ProcessFile {
+ my $file = $_;
+ my $dir = $File::Find::dir;
+ # Record if a CMake file was found.
+ if ($file eq "CMakeLists.txt") {
+ $dirCMake{$dir} = $File::Find::name;
+ return 0;
+ }
+ # Grab the extension of the file.
+ $file =~ /\.([^.]+)$/;
+ my $ext = $1;
+ my $files;
+ foreach my $x (@fileTypes) {
+ if ($ext eq $x) {
+ if (!defined $files) {
+ $files = GetFiles($dir);
+ }
+ push @$files, $file;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+sub EmitCMakeList {
+ my $dir = shift;
+ my $files = $dirFiles{$dir};
+
+ if (!defined $files) {
+ return;
+ }
+
+ foreach my $file (sort @$files) {
+ print OUT " ";
+ print OUT $file;
+ print OUT "\n";
+ }
+}
+
+sub UpdateCMake {
+ my $cmakeList = shift;
+ my $dir = shift;
+ my $cmakeListNew = $cmakeList . ".new";
+ open(IN, $cmakeList);
+ open(OUT, ">", $cmakeListNew);
+ my $foundLibrary = 0;
+
+ while(<IN>) {
+ if (!$foundLibrary) {
+ print OUT $_;
+ if (/^add_clang_library\(/ || /^add_llvm_library\(/) {
+ $foundLibrary = 1;
+ EmitCMakeList($dir);
+ }
+ }
+ else {
+ if (/\)/) {
+ print OUT $_;
+ $foundLibrary = 0;
+ }
+ }
+ }
+
+ close(IN);
+ close(OUT);
+
+ open(FILE, $cmakeList) or
+ die("Cannot open $cmakeList when computing digest\n");
+ binmode FILE;
+ my $digestA = Digest::MD5->new->addfile(*FILE)->hexdigest;
+ close(FILE);
+
+ open(FILE, $cmakeListNew) or
+ die("Cannot open $cmakeListNew when computing digest\n");
+ binmode FILE;
+ my $digestB = Digest::MD5->new->addfile(*FILE)->hexdigest;
+ close(FILE);
+
+ if ($digestA != $digestB) {
+ move($cmakeListNew, $cmakeList);
+ return 1;
+ }
+
+ unlink($cmakeListNew);
+ return 0;
+}
+
+sub UpdateCMakeFiles {
+ foreach my $dir (sort keys %dirCMake) {
+ if (UpdateCMake($dirCMake{$dir}, $dir)) {
+ print "Updated: $dir\n";
+ }
+ }
+}
+
+find({ wanted => \&ProcessFile, follow => 1 }, '.');
+UpdateCMakeFiles();
+
OpenPOWER on IntegriCloud