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