mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
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
This commit is contained in:
parent
1ebb7e72fa
commit
28b149a6c8
118
utils/UpdateCMakeLists.pl
Executable file
118
utils/UpdateCMakeLists.pl
Executable file
@ -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();
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user