996
|
1 package Language::INTERCAL::InstallModule;
|
|
2
|
|
3 # This package helps installing an optional component of CLC-INTERCAL.
|
|
4
|
|
5 # This file is part of CLC-INTERCAL
|
|
6
|
|
7 # Copyright (c) 2008 Claudio Calvelli, all rights reserved.
|
|
8
|
|
9 # CLC-INTERCAL is copyrighted software. However, permission to use, modify,
|
|
10 # and distribute it is granted provided that the conditions set out in the
|
|
11 # licence agreement are met. See files README and COPYING in the distribution.
|
|
12
|
|
13 require 5.005;
|
|
14 use strict;
|
|
15 use vars qw($VERSION $PERVERSION);
|
|
16 ($VERSION) = ($PERVERSION = "CLC-INTERCAL/Base INTERCAL/InstallModule.pm 1.-94.-2") =~ /\s(\S+)$/;
|
|
17
|
|
18 use Config qw(%Config);
|
|
19 use ExtUtils::MakeMaker;
|
|
20 use Carp;
|
|
21
|
|
22 import Language::INTERCAL::Exporter '1.-94.-2';
|
|
23
|
|
24 my $type = '';
|
|
25 my $has_distribute = 0;
|
|
26 my $pm_dir = 'INTERCAL';
|
|
27 my $iacc_dir = 'Include';
|
|
28 my $iacc_suffix = 'iacc';
|
|
29 my $sick_suffix = 'i';
|
|
30 my $iasm_suffix = 'iasm';
|
|
31 my $bin_dir = 'bin';
|
|
32 my $html_dir = 'doc/html';
|
|
33 my $html_suffix = 'html';
|
|
34 my $htmlgen_suffix = 'hgen';
|
|
35
|
|
36 my @iacc = ();
|
|
37 my @sick = ();
|
|
38 my @iasm = ();
|
|
39 my @bin = ();
|
|
40 my @htmlcopy = ();
|
|
41 my @htmlgen = ();
|
|
42
|
|
43 sub install {
|
|
44 @_ == 3 || @_ == 4
|
|
45 or croak "Usage: install Language::INTERCAL::InstallModule TYPE, HAS_DISTRIBUTE? [, PREREQ]";
|
|
46 my ($class, $req) = @_;
|
|
47 ($class, $type, $has_distribute, $req) = @_;
|
|
48
|
|
49 open(MANIFEST, "MANIFEST")
|
|
50 or die "Sorry, I can't function without file \"MANIFEST\"\n";
|
|
51
|
|
52 while (<MANIFEST>) {
|
|
53 chomp;
|
|
54 s/\s+\S+$//;
|
|
55 my $on = $_;
|
|
56 if (s#^$pm_dir/*##o) {
|
|
57 if (s#^$iacc_dir/*##o) {
|
|
58 push @iacc, $1 if /^(.*)\.$iacc_suffix$/o;
|
|
59 push @sick, $1 if /^(.*)\.$sick_suffix$/o;
|
|
60 push @iasm, $1 if /^(.*)\.$iasm_suffix$/o;
|
|
61 }
|
|
62 } elsif (m#^$bin_dir/#o) {
|
|
63 s/\s+\S+$//;
|
|
64 push @bin, $_;
|
|
65 } elsif (s#^$html_dir/##o) {
|
|
66 push @htmlcopy, $1 if /^(.*\.$html_suffix)$/o;
|
|
67 push @htmlgen, $1 if /^(.*)\.$htmlgen_suffix$/o;
|
|
68 }
|
|
69 }
|
|
70 close MANIFEST;
|
|
71
|
|
72 my %req = (
|
|
73 'Carp' => 0,
|
|
74 'Exporter' => 0,
|
|
75 );
|
|
76 if ($req) {
|
|
77 $req{$_} = $req->{$_} for keys %$req;
|
|
78 }
|
|
79
|
|
80 my @filter = ();
|
|
81 my $gpath = $ENV{CLC_INTERCAL_PATH} || '.';
|
|
82 if (-f "Generate") {
|
|
83 # that's correct - if Generate exists HERE, execute one THERE
|
|
84 # you are not supposed to understand that
|
|
85 @filter = (PM_FILTER => "\$(PERL) $gpath/Generate"),
|
|
86 }
|
|
87
|
|
88 WriteMakefile(NAME => "Language::INTERCAL",
|
|
89 DISTNAME => "CLC-INTERCAL-$type",
|
|
90 EXE_FILES => \@bin,
|
|
91 VERSION => $VERSION,
|
|
92 PERL_MALLOC_OK => 1,
|
|
93 @filter,
|
|
94 PREREQ_PM => \%req,
|
|
95 dist => {
|
|
96 COMPRESS => 'gzip',
|
|
97 SUFFIX => '.gz',
|
|
98 DIST_DEFAULT => 'ddsh_dist',
|
|
99 },
|
|
100 clean => { FILES => 'iacc_to_io sick_to_io' },
|
|
101 );
|
|
102 }
|
|
103
|
|
104 sub MY::constants {
|
|
105 package MY;
|
|
106 my $i = shift->SUPER::constants(@_);
|
|
107 if ($ENV{CLC_INTERCAL_PATH}) {
|
|
108 $i =~ s/^(PERL\s*=.*)$/$1 "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_ARCHLIB)" "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_LIB)"/gm;
|
|
109 $i =~ s/^(FULLPERL\s*=.*)$/$1 "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_ARCHLIB)" "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_LIB)"/gm;
|
|
110 }
|
|
111 $i .= "\n# Needed to run iacc\n";
|
|
112 $i .= "INST_IACC = \$(INST_LIB)/Language/INTERCAL/Include\n";
|
|
113 $i .= "INST_HTMLDOC = blib/htmldoc\n";
|
|
114 $i .= "SICK_OPTIONS = --nouserrc --batch --bug=0 --ubug=0 --stdtrace=/dev/null --notrace\n";
|
|
115 # $i .= "SICK_OPTIONS += -v\n";
|
|
116 $i .= "SICK = \$(FULLPERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) \\\n";
|
|
117 my $sick;
|
|
118 if ($has_distribute || $ENV{CLC_INTERCAL_PATH}) {
|
|
119 my $gpath = $ENV{CLC_INTERCAL_PATH} || '.';
|
|
120 $sick = "-I$gpath/\$(INST_ARCHLIB) -I$gpath/\$(INST_LIB) $gpath/\$(INST_SCRIPT)/sick";
|
|
121 } else {
|
|
122 $sick = "-S sick";
|
|
123 }
|
|
124 $i .= "\t-I\$(INST_ARCHLIB) -I\$(INST_LIB) $sick \\\n";
|
|
125 $i .= "\t\$(SICK_OPTIONS)\n";
|
|
126 $i .= "CLC_INTERCAL_TYPE = $type\n";
|
|
127 $i;
|
|
128 }
|
|
129
|
|
130 sub MY::test {
|
|
131 package MY;
|
|
132 my $i = shift->SUPER::test(@_);
|
|
133 if ($ENV{CLC_INTERCAL_PATH}) {
|
|
134 $i =~ s/('\$\(INST_ARCHLIB\)')/$1, '$ENV{CLC_INTERCAL_PATH}\/\$(INST_ARCHLIB)', '$ENV{CLC_INTERCAL_PATH}\/\$(INST_LIB)'/gm;
|
|
135 $i =~ s/("-I\$\(INST_ARCHLIB\)")/$1 "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_ARCHLIB)" "-I$ENV{CLC_INTERCAL_PATH}\/\$(INST_LIB)"/gm;
|
|
136 }
|
|
137 $i;
|
|
138 }
|
|
139
|
|
140 sub MY::postamble {
|
|
141 package MY;
|
|
142 my $i = shift->SUPER::postamble(@_);
|
|
143 $i .= <<EOI for @iacc;
|
|
144 pure_all :: pm_to_blib \$(INST_IACC)/$_.io
|
|
145 \$(NOECHO) \$(NOOP)
|
|
146
|
|
147 \$(INST_IACC)/$_.io : \$(INST_IACC)/$_.$iacc_suffix
|
|
148 \$(SICK) -lObject -piacc --output \$(INST_IACC)/$_.io \$(INST_IACC)/$_.$iacc_suffix
|
|
149
|
|
150 EOI
|
|
151
|
|
152 $i .= <<EOI for @sick;
|
|
153 pure_all :: \$(INST_IACC)/$_.io
|
|
154 \$(NOECHO) \$(NOOP)
|
|
155
|
|
156 \$(INST_IACC)/$_.io : \$(INST_IACC)/sick.io \\
|
|
157 \$(INST_IACC)/postpre.io \\
|
|
158 \$(INST_IACC)/$_.$sick_suffix
|
|
159 \$(SICK) -lObject -psick --output \$(INST_IACC)/$_.io \$(INST_IACC)/$_.$sick_suffix
|
|
160
|
|
161 EOI
|
|
162
|
|
163 $i .= <<EOI for @iasm;
|
|
164 pure_all :: \$(INST_IACC)/$_.io
|
|
165 \$(NOECHO) \$(NOOP)
|
|
166
|
|
167 \$(INST_IACC)/$_.io : \$(INST_IACC)/asm.io \\
|
|
168 \$(INST_IACC)/postpre.io \\
|
|
169 \$(INST_IACC)/$_.$iasm_suffix
|
|
170 \$(SICK) -lObject -pasm --output \$(INST_IACC)/$_.io \$(INST_IACC)/$_.$iasm_suffix
|
|
171
|
|
172 EOI
|
|
173
|
|
174 $i .= <<EOI for @htmlcopy;
|
|
175 all :: \$(INST_HTMLDOC)/$_
|
|
176 \$(NOECHO) \$(NOOP)
|
|
177
|
|
178 \$(INST_HTMLDOC)/$_ : \$(INST_HTMLDOC)/\$(DFSEP).exists $html_dir/$_
|
|
179 \$(CP) $html_dir/$_ \$(INST_HTMLDOC)/$_
|
|
180
|
|
181 EOI
|
|
182
|
|
183 my $gpath = $ENV{CLC_INTERCAL_PATH} || '.';
|
|
184
|
|
185 $i .= <<EOI for @htmlgen;
|
|
186 all :: \$(INST_HTMLDOC)/$_.$html_suffix
|
|
187 \$(NOECHO) \$(NOOP)
|
|
188
|
|
189 \$(INST_HTMLDOC)/$_.$html_suffix : \$(INST_HTMLDOC)/\$(DFSEP).exists $gpath/Generate $html_dir/$_.$htmlgen_suffix
|
|
190 CLC_INTERCAL_PATH=$gpath \$(PERL) $gpath/Generate $html_dir/$_.$htmlgen_suffix \$(INST_HTMLDOC)/$_.$html_suffix
|
|
191
|
|
192 EOI
|
|
193
|
|
194 $i .= "\$(INST_HTMLDOC)/\$(DFSEP).exists :: Makefile.PL\n"
|
|
195 . "\t\$(NOECHO) \$(MKPATH) \$(INST_HTMLDOC)\n"
|
|
196 . "\t\$(NOECHO) \$(CHMOD) 755 \$(INST_HTMLDOC)\n"
|
|
197 . "\t\$(NOECHO) \$(TOUCH) \$(INST_HTMLDOC)/\$(DFSEP).exists\n\n";
|
|
198
|
|
199 $i;
|
|
200 };
|
|
201
|
|
202 sub MY::dist_core {
|
|
203 package MY;
|
|
204 my $i = shift->SUPER::dist_core(@_);
|
|
205 my $D;
|
|
206 if ($has_distribute || $ENV{CLC_INTERCAL_PATH}) {
|
|
207 my $gpath = $ENV{CLC_INTERCAL_PATH} || '.';
|
|
208 $D ="-e 'require \"$gpath/INTERCAL/Distribute.pm\";'";
|
|
209 } else {
|
|
210 $D = '-MLanguage::INTERCAL::Distribute';
|
|
211 }
|
|
212 $i .= <<'EOF';
|
|
213
|
|
214 ddsh_dist :
|
|
215 $(RM_F) $(DISTVNAME).ddsh $(DISTVNAME).ddsh$(SUFFIX)
|
|
216 EOF
|
|
217 $i .= "\t\$(PERL) $D \\\n";
|
|
218 $i .= <<'EOF';
|
|
219 -e 'Language::INTERCAL::Distribute::makeddshdist()' \
|
|
220 '$(CLC_INTERCAL_TYPE)' MANIFEST '$(DISTVNAME).ddsh' '$(VERSION)'
|
|
221 $(COMPRESS) $(DISTVNAME).ddsh
|
|
222
|
|
223 EOF
|
|
224 $i;
|
|
225 }
|
|
226
|
|
227 1;
|