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