问题
我们项目开发过程中,会建立很多不同的子目录,子目录下面有很多头文件, 大家一般会在编译的时候用-I 选项来包含这些子目录,然后在源文件中直接include这个目录, 如下所示
- root
- sub1
- foo.h
- foo.cpp
- sub2
- bar.cpp
- sub1
//in bar.cpp
#include "foo.h"
这样做的坏处是随着目录的增加,编译的时候会引用很多头文件,延长了编译时间。
解决方案
下面这个脚本是把所有头文件改成基于根目录的相对路径,这样就不用加很多-I选项。
#!/usr/bin/perl
use warnings;
use File::Find;
use File::Basename;
use Data::Dumper;
my $data = `find . -name "*.h"`;
# print "$data";
my @headers = split('\n', $data);
my @hppheard2 = split('\n',`find . -name "*.hpp"`);
push(@headers, @hppheard2);
my %newheaders;
foreach my $val (@headers) {
$file1 = substr($val, 2);
$basename = basename($file1);
$newheaders{$basename} = '<'.$file1.'>';
# print "$file1, $basename\n";
}
print Dumper(\%newheaders);
my @headerKeys = keys %newheaders;
sub process_file {
next if (($_ eq '.') || ($_ eq '..'));
my $file = $File::Find::name;
if (/\.h$/ || /\.cpp$/ || /\.hpp$/)
{
print "$file\n" if -f;
rename($file, $file.'.bak');
open(IN, '<'.$file.'.bak') or die $!;
open(OUT, '>'.$file) or die $!;
while(<IN>)
{
for my $key (@headerKeys) {
# print "The color of '$fruit' is $color_of{$fruit}\n";
$_ =~ s/"$key"/$newheaders{$key}/g;
}
print OUT $_;
}
close(IN);
close(OUT);
`rm $file.bak`;
}
}
find({ wanted => \&process_file, no_chdir => 1 }, "./");