INET connector
[scpubgit/Object-Remote.git] / lib / Object / Remote / FatNode.pm
CommitLineData
eee9a548 1package Object::Remote::FatNode;
2
3use strictures 1;
4use Config;
5use B qw(perlstring);
6
f6ac5927 7my @exclude_mods = qw(XSLoader.pm DynaLoader.pm);
1bf55307 8#used by t/watchdog_fatnode
f1d70835 9our $INHIBIT_RUN_NODE = 0;
f6ac5927 10
eee9a548 11sub stripspace {
12 my ($text) = @_;
13 $text =~ /^(\s+)/ && $text =~ s/^$1//mg;
14 $text;
15}
16
17my %maybe_libs = map +($_ => 1), grep defined, (values %Config, '.');
18
668343cd 19my @extra_libs = grep not(ref($_) or $maybe_libs{$_}), @INC;
20my $extra_libs = join '', map {
21 my $lib = $_;
22 $lib =~ s{'}{'\\''}g;
23 " -I'$lib'\n";
24} @extra_libs;
eee9a548 25
26my $command = qq(
27 $^X
28 $extra_libs
29 -mObject::Remote
30 -mObject::Remote::Connector::STDIO
783105c4 31 -mFuture
8c81a0e5 32 -mMRO::Compat
eee9a548 33 -mClass::C3
8c81a0e5 34 -mClass::C3::next
35 -mAlgorithm::C3
eee9a548 36 -mObject::Remote::ModuleLoader
37 -mObject::Remote::Node
4c8c83d7 38 -mMethod::Generate::BuildAll
39 -mMethod::Generate::DemolishAll
dd6e1327 40 -mMoo::HandleMoose::_TypeMap
eee9a548 41 -mJSON::PP
df8e0ca6 42 -e 'print join "\\n", \%INC'
eee9a548 43);
44
45$command =~ s/\n/ /g;
46
df8e0ca6 47chomp(my @inc = qx($command));
48
1bf55307 49my %exclude = map { $_ => 1 } @exclude_mods;
e454581e 50
5e850e3e 51my %file_names = @inc;
eee9a548 52
e454581e 53# only include mods that match the filename,
54# ie ones that will succeed with a require $module
55# https://rt.cpan.org/Ticket/Display.html?id=100478
56my %mods =
57 map { $file_names{$_} => $_ }
58 grep { $file_names{$_} =~ /\Q$_\E$/ } keys %file_names;
59
f6ac5927 60foreach(keys(%mods)) {
61 if ($exclude{ $mods{$_} }) {
55c0d020 62 delete($mods{$_});
f6ac5927 63 }
64}
65
5e850e3e 66my @non_core_non_arch = ( $file_names{'Devel/GlobalDestruction.pm'} );
15b847bb 67push @non_core_non_arch, grep +(
61c6bba7 68 not (
15b847bb 69 #some of the config variables can be empty which will eval as a matching regex
55c0d020 70 $Config{privlibexp} ne '' && /^\Q$Config{privlibexp}/
15b847bb 71 or $Config{archlibexp} ne '' && /^\Q$Config{archlibexp}/
72 or $Config{vendorarchexp} ne '' && /^\Q$Config{vendorarchexp}/
73 or $Config{sitearchexp} ne '' && /^\Q$Config{sitearchexp}/
74 )
75), grep !/\Q$Config{archname}/, grep !/\Q$Config{myarchname}/, keys %mods;
76
77my @core_non_arch = grep +(
78 $Config{privlibexp} ne '' && /^\Q$Config{privlibexp}/
79 and not($Config{archlibexp} ne '' && /^\Q$Config{archlibexp}/
80 or /\Q$Config{archname}/ or /\Q$Config{myarchname}/)
81), keys %mods;
82
eee9a548 83my $start = stripspace <<'END_START';
84 # This chunk of stuff was generated by Object::Remote::FatNode. To find
85 # the original file's code, look for the end of this BEGIN block or the
86 # string 'FATPACK'
87 BEGIN {
1ef3d225 88 my (%fatpacked,%fatpacked_extra);
eee9a548 89END_START
f6ac5927 90
cc62b744 91$start .= 'my %exclude = map { $_ => 1 } (\'' . join("','", @exclude_mods) . "');\n";
f6ac5927 92
eee9a548 93my $end = stripspace <<'END_END';
1ef3d225 94 s/^ //mg for values %fatpacked, values %fatpacked_extra;
eee9a548 95
1ef3d225 96 sub load_from_hash {
97 if (my $fat = $_[0]->{$_[1]}) {
f6ac5927 98 if ($exclude{$_[1]}) {
99 warn "Will not pre-load '$_[1]'";
55c0d020 100 return undef;
f6ac5927 101 }
55c0d020 102
cc62b744 103 #warn "Handling $_[1]";
eee9a548 104 open my $fh, '<', \$fat;
105 return $fh;
106 }
55c0d020 107
8c81a0e5 108 #Uncomment this to find brokenness
109 #warn "Missing $_[1]";
f6ac5927 110 return;
1ef3d225 111 }
112
113 unshift @INC, sub { load_from_hash(\%fatpacked, $_[1]) };
114 push @INC, sub { load_from_hash(\%fatpacked_extra, $_[1]) };
eee9a548 115
116 } # END OF FATPACK CODE
117
118 use strictures 1;
119 use Object::Remote::Node;
55c0d020 120
f129bfaf 121 unless ($Object::Remote::FatNode::INHIBIT_RUN_NODE) {
55c0d020 122 Object::Remote::Node->run(watchdog_timeout => $WATCHDOG_TIMEOUT);
f129bfaf 123 }
55c0d020 124
eee9a548 125END_END
126
127my %files = map +($mods{$_} => scalar do { local (@ARGV, $/) = ($_); <> }),
15b847bb 128 @non_core_non_arch, @core_non_arch;
eee9a548 129
1ef3d225 130sub generate_fatpack_hash {
131 my ($hash_name, $orig) = @_;
132 (my $stub = $orig) =~ s/\.pm$//;
eee9a548 133 my $name = uc join '_', split '/', $stub;
1ef3d225 134 my $data = $files{$orig} or die $orig; $data =~ s/^/ /mg;
3ab6f7e2 135 $data .= "\n" unless $data =~ m/\n$/;
136 my $ret = '$'.$hash_name.'{'.perlstring($orig).qq!} = <<'${name}';\n!
137 .qq!${data}${name}\n!;
138# warn $ret;
139 return $ret;
1ef3d225 140}
141
142my @segments = (
15b847bb 143 map(generate_fatpack_hash('fatpacked', $_), sort map $mods{$_}, @non_core_non_arch),
144 map(generate_fatpack_hash('fatpacked_extra', $_), sort map $mods{$_}, @core_non_arch),
1ef3d225 145);
eee9a548 146
90f5193d 147#print STDERR Dumper(\@segments);
148our $DATA = join "\n", $start, @segments, $end;
eee9a548 149
1501;