On Tue, 30 Oct 2001 00:21:10 +0100, Axel Rose wrote:
>This step is necessary for a standalone builder where all modules are
>put into the TEXT resource of a standalone program. The current
>RuntimeBuilder, originally written by Michael Ziege and greatly enhanced
>by Keitarou Miyazaki, lacks this ability. Now standalone MacPerl
>programs may therefore stop with messages about missing modules.
I'll look into it later; but just for now, I can only say "me too!". I
made such a script myself; or better: I made modifications to the
RuntimeBuilder droplet, so it included this functionality. I've attached
my additions, so you can compare.
>The idea is to go through the source file, find its "use" and "require"
>lines, eval them and fill %INC. In a second loop I go through every
>entry of %INC search for further "require" statements, check if the then
>required files containes another "require" and so on and on until %INC
>doesn't grow anymore.
That's pretty much how I did it , too. However: my stuff is pretty
compact. I wonder if you haven't worked much too hard. ;-)
Here's it all, the whole BEGIN block, replacing the one that was there.
BEGIN {
exit unless @ARGV;
#suppress warnings about redefining subroutines
#by 'eval(use...)':
local $^W;
print "Checking for imported modules...\n";
# START OF BART'S MODIFICATIONS
my @modules = $ARGV[0];
my %inc;
while(my $source = shift @modules) {
open FILE, $source or die "Couldn't open file $source: $!";
while (<FILE>) {
if(/^\s*(use|require)\b.*;/){
eval($_); #read the %INC
}
}
close FILE;
foreach my $path (values %INC) {
$inc{$path}++ or push @modules, $path;
}
}
# END OF BART'S MODIFICATIONS
%MyINC = %INC;
@dynaLoaderModules = @DynaLoader::dl_modules;
}
--
Bart.