| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | #!perl | 
					
						
							|  |  |  | use strict; | 
					
						
							|  |  |  | my %deploy; | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:40 -07:00
										 |  |  | my $objdump = $ENV{objdump} ? $ENV{objdump} : "objdump"; | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:41 -07:00
										 |  |  | my @searchdirs; | 
					
						
							| 
									
										
										
										
											2014-08-02 15:06:10 -07:00
										 |  |  | my @systemdirs; | 
					
						
							|  |  |  | if ($ENV{PATH} =~ "x86_64") { | 
					
						
							|  |  |  | 	@systemdirs = (qr|^c:/windows|i, qr|^c:/winnt|i, qr|^/c/windows|i, qr|^/c/winnt|, qr|^/usr/i686|); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  | 	@systemdirs = (qr|^c:/windows|i, qr|^c:/winnt|i, qr|^/c/windows|i, qr|^/c/winnt|); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | sub addDependenciesFor($) { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	open OBJDUMP, "-|", $objdump, "-p", $_[0] or die; | 
					
						
							|  |  |  | 	while (<OBJDUMP>) { | 
					
						
							|  |  |  | 		last if /^The Import Tables/; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	while (<OBJDUMP>) { | 
					
						
							|  |  |  | 		next unless /DLL Name: (.*)/; | 
					
						
							|  |  |  | 		$deploy{$1} = 0 unless defined($deploy{$1}); | 
					
						
							|  |  |  | 		last if /^\w/; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	close OBJDUMP; | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sub findMissingDependencies { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	for my $name (keys %deploy) { | 
					
						
							|  |  |  | 		next if $deploy{$name}; | 
					
						
							|  |  |  | 		my $path; | 
					
						
							|  |  |  | 		for my $dir (@searchdirs) { | 
					
						
							|  |  |  | 			my $fpath = "$dir/$name"; | 
					
						
							|  |  |  | 			my $lcfpath = "$dir/" . lc($name); | 
					
						
							|  |  |  | 			if (-e $fpath) { | 
					
						
							|  |  |  | 				$path = $fpath; | 
					
						
							|  |  |  | 			} elsif (-e $lcfpath) { | 
					
						
							|  |  |  | 				$path = $lcfpath; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				next; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			addDependenciesFor($path); | 
					
						
							|  |  |  | 			last; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 		$path = "/missing/file" unless $path; | 
					
						
							|  |  |  | 		$deploy{$name} = $path; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for (@ARGV) { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	s/^-L//; | 
					
						
							|  |  |  | 	next if /^-/; | 
					
						
							|  |  |  | 	if (-d $_) { | 
					
						
							|  |  |  | 		push @searchdirs, $_; | 
					
						
							| 
									
										
										
										
											2014-09-25 20:50:14 -07:00
										 |  |  | 	} elsif (-f $_ && ! /\.a$/) { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 		# Add $_'s path to the search list too | 
					
						
							|  |  |  | 		my $dirname = $_; | 
					
						
							|  |  |  | 		$dirname =~ s,/[^/]+$,,; | 
					
						
							| 
									
										
										
										
											2013-10-11 20:39:56 -07:00
										 |  |  | 		unshift @searchdirs, $dirname; | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 		$deploy{$_} = $_; | 
					
						
							|  |  |  | 		addDependenciesFor($_); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:41 -07:00
										 |  |  | # Append PATH to @searchdirs | 
					
						
							|  |  |  | @searchdirs = (@searchdirs, split(/:/, $ENV{PATH})); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:42 -07:00
										 |  |  | # Remove system dirs from @searchdirs | 
					
						
							|  |  |  | @searchdirs = grep { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	my $sys = 0; | 
					
						
							|  |  |  | 	for my $rx (@systemdirs) { | 
					
						
							|  |  |  | 		if ($_ =~ $rx) { | 
					
						
							|  |  |  | 			$sys = 1; | 
					
						
							|  |  |  | 			last; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	!$sys; | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:42 -07:00
										 |  |  | } @searchdirs; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | while (1) { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	findMissingDependencies(); | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	my $i = 0; | 
					
						
							|  |  |  | 	while (my ($name, $path) = each(%deploy)) { | 
					
						
							|  |  |  | 		next if $path; | 
					
						
							|  |  |  | 		++$i; | 
					
						
							|  |  |  | 		last; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	last if $i == 0; | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for (sort values %deploy) { | 
					
						
							| 
									
										
										
										
											2013-10-11 11:05:43 -07:00
										 |  |  | 	next if $_ eq "/missing/file"; | 
					
						
							|  |  |  | 	print "$_\n"; | 
					
						
							| 
									
										
										
										
											2013-10-08 17:47:25 -07:00
										 |  |  | } |