package DependencyGenerator; # ************************************************************ # Description : Runs the correct dependency generator on the file. # Author : Chad Elliott # Create Date : 2/10/2002 # ************************************************************ # ************************************************************ # Pragmas # ************************************************************ use strict; use Preprocessor; use DependencyWriterFactory; use ObjectGeneratorFactory; # ************************************************************ # Subroutine Section # ************************************************************ sub new { my($class) = shift; my($macros) = shift; my($ipaths) = shift; my($replace) = shift; my($type) = shift; my($noinline) = shift; my($exclude) = shift; my($self) = bless {'pre' => new Preprocessor($macros, $ipaths, $exclude), 'replace' => $replace, 'dwrite' => DependencyWriterFactory::create($type), 'objgen' => ObjectGeneratorFactory::create($type), 'noinline' => $noinline, }, $class; ## Set the current working directory, but ## escape regular expression special characters $self->{'cwd'} = Cwd::getcwd() . '/'; $self->{'cwd'} =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g; ## Sort the replace keys to get the longest key first. This way ## when we are replacing portions of the file path, we replace the ## most we can. my(@repkeys) = sort { length($b) <=> length($a) } keys %$replace; $self->{'repkeys'} = \@repkeys; return $self; } sub process { my($self) = shift; my($file) = shift; ## Generate the dependency string my($depstr) = $self->{'dwrite'}->process( $self->{'objgen'}->process($file), $self->{'pre'}->process($file, $self->{'noinline'})); ## Perform the replacements on the dependency string if ($depstr =~ s/$self->{'cwd'}//go) { } else { my($replace) = $self->{'replace'}; foreach my $rep (@{$self->{'repkeys'}}) { $depstr =~ s/$rep/$$replace{$rep}/g; } } return $depstr; } 1;