-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75833 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
1 changed file
with
118 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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(); | ||
|