[Bio] / FigKernelScripts / build_sas_distro.pl Repository:
ViewVC logotype

Annotation of /FigKernelScripts/build_sas_distro.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (view) (download) (as text)

1 : olson 1.1 #
2 :     # Build the SEED Access Scripts distribution from the code in the current checkout
3 :     # of the SEED code.
4 :     #
5 :     #
6 :     #
7 :     #
8 :     #
9 :     # We walk the FigKernelScripts and FigKernelPackages directories looking for
10 :     # scripts that have a comment
11 :     #
12 :     # SAS Component
13 :     #
14 :     # in the first 10 lines. These are copied to the destination directory.
15 :     #
16 :     # We create a shell-script wrapper for each .pl script from FigKernelScripts that is installed.
17 :     # This wrapper determines the installation directory and sets up the perl runtime environment
18 :     # appropriately, then executes the script.
19 :     #
20 :    
21 :     use File::Copy;
22 : devoid 1.11 use File::Path qw(make_path);
23 : olson 1.1 use File::Basename;
24 :     use strict;
25 :     use FIG_Config;
26 : olson 1.6 use Getopt::Long;
27 : olson 1.1
28 : olson 1.6 my $source_dir = "$FIG_Config::fig_disk/dist/releases/current";
29 :    
30 :     my $usage = "Usage: $0 [--source source-dir] destination-dir [module-dir]\n";
31 :    
32 :     if (!GetOptions("source=s" => \$source_dir))
33 :     {
34 :     die $usage;
35 :     }
36 :    
37 :     @ARGV == 1 or @ARGV == 2 or die $usage;
38 : olson 1.1
39 :     my $dest_dir = shift;
40 :    
41 :     -d $dest_dir or die "Destination directory $dest_dir does not exist\n";
42 :    
43 :     my $module_dir = shift;
44 :    
45 :     #
46 :     # Find the CPAN modules we need, from the cache in $module_dir.
47 :     #
48 : olson 1.4 #my @required_module_names = qw(YAML);
49 : olson 1.7 my @required_module_names = qw(YAML URI HTML-Tagset HTML-Parser libwww-perl Task-Weaken SOAP-Lite
50 :     File-HomeDir);
51 : olson 1.5
52 :    
53 : olson 1.1 my @required_modules;
54 :     my $err = 0;
55 :     if ($module_dir)
56 :     {
57 :     my @avail = <$module_dir/*>;
58 :     for my $n (@required_module_names)
59 :     {
60 :     my @have = grep { m,/$n-\d+, } @avail;
61 :     if (@have == 0)
62 :     {
63 :     warn "Missing required module $n\n";
64 :     $err++;
65 :     next;
66 :     }
67 :     elsif (@have > 1)
68 :     {
69 :     warn "multiple modules available for $n: @have\n";
70 :     $err++;
71 :     next;
72 :     }
73 :     push(@required_modules, $have[0]);
74 :     }
75 :     }
76 :     print "Modules:\n";
77 :     print " $_\n" for @required_modules;
78 :    
79 :     my $bin_dir = "$dest_dir/bin";
80 :     my $plbin_dir = "$dest_dir/plbin";
81 :     my $lib_dir = "$dest_dir/lib";
82 :     my $mod_dir = "$dest_dir/modules";
83 :     my $modsrc_dir = "$dest_dir/modules/sources";
84 :    
85 :     -d $bin_dir or mkdir $bin_dir or die "Cannot mkdir $bin_dir: $!";
86 :     -d $plbin_dir or mkdir $plbin_dir or die "Cannot mkdir $plbin_dir: $!";
87 :     -d $lib_dir or mkdir $lib_dir or die "Cannot mkdir $lib_dir: $!";
88 :     -d $mod_dir or mkdir $mod_dir or die "Cannot mkdir $mod_dir: $!";
89 :     if (-d $modsrc_dir)
90 :     {
91 : olson 1.3 system("rm", "-rf", $modsrc_dir);
92 : olson 1.1 }
93 :     mkdir $modsrc_dir or die "Cannot mkdir $modsrc_dir: $!";
94 : devoid 1.11
95 :     my @libs_preserve_dir_structure;
96 : olson 1.9 my @libs = find_sas_files("$source_dir/FigKernelPackages", ".pm");
97 :     push(@libs, find_sas_files("$source_dir/DesktopRast", ".pm", 1));
98 : devoid 1.11 push(@libs_preserve_dir_structure, find_sas_files({dir => "$source_dir/ModelSEED", regex => qr/\.pm/, recursive => 1}));
99 : olson 1.1 print "Libs:\n";
100 :     print " $_\n" for @libs;
101 : olson 1.7
102 : olson 1.9 my @bins = find_sas_files("$source_dir/FigKernelScripts", ".pl");
103 :     push(@bins, find_sas_files("$source_dir/DesktopRast", ".pl", 1));
104 :     push(@bins, find_sas_files("$source_dir/ModelSEED", ".pl", 1));
105 : olson 1.3
106 :     #
107 :     # We also include the sgv.cgi from FigWebServices as a special case.
108 :     #
109 : olson 1.6 push(@bins, "$source_dir/FigWebServices/sgv.cgi");
110 : olson 1.3
111 : olson 1.1 print "Bins:\n";
112 :     print " $_\n" for @bins;
113 :    
114 : devoid 1.11
115 :     for my $lib (@libs_preserve_dir_structure) {
116 :     my $path = dirname($lib);
117 :     my $base = basename($lib);
118 :     $path =~ s/$source_dir//;
119 :     make_path("$lib_dir/$path");
120 :     copy($lib, "$lib_dir/$path/$base");
121 : devoid 1.8 }
122 :    
123 : olson 1.1 for my $lib (@libs)
124 :     {
125 :     my $base = basename($lib);
126 :     my $dest = "$lib_dir/$base";
127 :     copy($lib, $dest) or die "Error copying $base to $dest: $!";
128 :     }
129 :    
130 :     for my $bin (@bins)
131 :     {
132 :     my $base = basename($bin);
133 :     my $dest = "$plbin_dir/$base";
134 :     copy($bin, $dest) or die "Error copying $base to $dest: $!";
135 :    
136 :     create_wrapper($base);
137 :     }
138 :    
139 :     my @mod_dirs;
140 :     for my $mod (@required_modules)
141 :     {
142 :     opendir(D, $modsrc_dir);
143 :     my %dirs = map { $_ => 1 } readdir(D);
144 :     closedir(D);
145 :     my $rc = system("tar", "-C", $modsrc_dir, "-x", "-z", "-f", $mod);
146 :     $rc == 0 or die "Error untarring $mod\n";
147 :    
148 :     opendir(D, $modsrc_dir);
149 :     my @new = grep { !$dirs{$_} } readdir(D);
150 :     closedir(D);
151 :     push(@mod_dirs, @new);
152 :     }
153 :     #
154 :     # Create a script for building the modules.
155 :     #
156 :     if (@mod_dirs)
157 :     {
158 :     my $script = "$mod_dir/BUILD_MODULES";
159 :     open(F, ">", $script) or die "Cannot write $script: $!";
160 :     print F <<END;
161 :     #!/bin/sh
162 :     dir=\`dirname \$0\`
163 :     dir=\`cd \$dir; pwd\`
164 :     END
165 : olson 1.5 for my $mod (@mod_dirs)
166 :     {
167 :     my $pre;
168 :     if ($mod =~ /^HTML-Parser/)
169 :     {
170 :     $pre = "echo no |";
171 :     }
172 :     print F <<END;
173 :     echo "Build $mod"
174 :     (cd \$dir/sources/$mod; $pre perl Makefile.PL PREFIX=\$dir LIB=\$dir/lib; make; make install)
175 :     END
176 :     }
177 : olson 1.1 chmod 0755, $script;
178 :     }
179 :    
180 :     #
181 :     # Create the shell-script wrapper for this perl script.
182 :     #
183 :     sub create_wrapper
184 :     {
185 :     my($name) = @_;
186 :    
187 :     my $base = basename($name, ".pl");
188 :    
189 :     my $fh;
190 :     my $out = "$bin_dir/$base";
191 :     print "name=$name base=$base out=$out\n";
192 :    
193 :     open($fh, ">", $out) or die "Cannot open $out for writing: $!";
194 :    
195 :     print $fh <<END;
196 :     #!/bin/sh
197 :     dir=\`dirname \$0\`
198 :     dir=\`cd \$dir/..; pwd\`
199 : olson 1.3 export SAS_HOME=\$dir
200 :     export DYLD_FALLBACK_LIBRARY_PATH=\$dir/lib
201 :     export PATH=\${PATH}:\$dir/bin
202 : olson 1.1 export PERL5LIB=\$dir/lib:\$dir/modules/lib
203 :     perl \$dir/plbin/$name "\$@"
204 :     END
205 :     close($fh);
206 :     chmod 0755, $out;
207 :     }
208 :    
209 : olson 1.10 sub find_sas_files
210 : olson 1.1 {
211 : devoid 1.11 my($dir_stack, $dir, $regex, $recursive, $all_are_sas);
212 :     my ($args) = shift @_;
213 :     # old call method is find_sas_files(dir, suffix, all_are_sas)
214 :     if(ref($args) ne 'HASH') {
215 :     $dir = $args;
216 :     my $suffix = shift @_;
217 :     $regex = qr/$suffix$/;
218 :     $all_are_sas = shift @_;
219 :     $recursive = 0;
220 :     $dir_stack = [$dir];
221 :     } else {
222 :     $dir_stack = [$args->{dir}];
223 :     $regex = $args->{regex};
224 :     $recursive = $args->{recursive} || 0;
225 :     $all_are_sas = $args->{all_are_sas} || 0;
226 :     }
227 : olson 1.1 my @out;
228 : devoid 1.11 while(@$dir_stack > 0) {
229 :     $dir = shift @$dir_stack;
230 :     opendir(D, $dir) or warn "Cannot opendir $dir: $!";
231 :     # prevent . and .. from getting in files list
232 :     my @files = grep { !/^\.\.?$/ } readdir(D);
233 :     while (my $f = shift @files) {
234 :     my $path = "$dir/$f";
235 :     if($recursive && -d $path) {
236 :     push(@$dir_stack, $path);
237 :     next;
238 :     }
239 :     next unless $f =~ $regex and -f $path;
240 :    
241 :     if ($all_are_sas) {
242 :     push(@out, $path);
243 :     next;
244 :     }
245 :     #
246 :     # svr*.pl files are always SAS components.
247 :     #
248 :     if ($f =~ /^svr.*\.pl$/)
249 :     {
250 :     push(@out, $path);
251 :     next;
252 :     }
253 :    
254 :     if (!open(F, "<", $path))
255 :     {
256 :     warn "Cannot open $path: $!";
257 :     next;
258 :     }
259 :    
260 :     while (<F>)
261 :     {
262 :     last if $. > 10;
263 :     if (/SAS\s+Component/i)
264 :     {
265 :     push(@out, $path);
266 :     last;
267 :     }
268 :     }
269 :     close(F);
270 :     }
271 :     closedir(D);
272 : olson 1.1 }
273 :     return @out;
274 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3