[Bio] / FigCommon / bootstrap.pl Repository:
ViewVC logotype

Annotation of /FigCommon/bootstrap.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 #
2 :     # FIG bootstrap script.
3 :     #
4 :     # Control is passed here from the toplevel configure (or dists/releases/install depending
5 :     # on how far we've gotten in the process).
6 :     #
7 :     # The configure has set the following environment variables for our use:
8 :     #
9 :     # FIG_HOME Root of the FIGdisk tree we're setting up
10 :     # FIGCONFIG_ENV Name of the environment we're configuring for
11 :     # FIGCONFIG_ENV_DIR Directory in which the binary install tree for $FIGCONFIG_ENV lives
12 :     # FIGCONFIG_RELEASE Release number we're configuring
13 :     # FIGCONFIG_RELEASE_DIR Directory in which that release lives
14 :     #
15 :     # Important note: perl system libraries may not be available when this
16 :     # script is running, if the FIGCONFIG_ENV_DIR is different than it was
17 :     # when the binaries were created. Part of the task of this
18 :     # script is to recognize this case and configure the process
19 :     # environment correctly so that the post-install process as
20 :     # handled by the Makefiles can use perl properly, without concern for paths.
21 :     #
22 :    
23 :     #
24 :     # Look into the FIGCONFIG_ENV_DIR for the PREFIX that this
25 :     # environment was compiled on. If that directory is different
26 :     # than the one we're currently using, rewrite @INC accordingly.
27 :     #
28 :     # We put this into a BEGIN block so that we can later use "use"
29 :     # without worrying about paths.
30 :     #
31 :     # We also set the $perlenv_override to true if we've done this,
32 :     # so we can insert these fixes into the perl tool header.
33 :     #
34 :    
35 :     BEGIN {
36 :    
37 :     # print "Here in the perl bootstrap. inc is:\n" . join("\n", @INC), "\n";
38 :    
39 :     my $my_prefix, $prefix, $inc, @newInc;
40 :    
41 :     $my_prefix = $ENV{FIGCONFIG_ENV_DIR};
42 :     open(P, "<$my_prefix/PREFIX");
43 :     $prefix = <P>;
44 :     chomp $prefix;
45 :    
46 :    
47 :     # print "Prefix is $prefix myprefix=$my_prefix\n";
48 :    
49 :     if ($prefix ne $my_prefix)
50 :     {
51 :     @newInc = ();
52 :     for $inc (@INC)
53 :     {
54 :     $inc =~ s,^$prefix,$my_prefix,;
55 :     push(@newInc, $inc);
56 :     }
57 :    
58 :     $::perlenv_override = 1;
59 :     }
60 :    
61 :     # print "New inc is:\n" . join("\n", @newInc), "\n";
62 :    
63 :     @INC = @newInc;
64 :     }
65 :    
66 :    
67 :     use FileHandle;
68 :     use strict;
69 :    
70 :     #
71 :     # Environment definition
72 :     #
73 :     # This list contains triples
74 :     # ($name, $value, $appendFlag). $name is the name of the
75 :     # variable; $value is the value to set, and $appendFlag
76 :     # is nonzero if we need to append this value to an existing
77 :     # environment variable.
78 :     #
79 :    
80 :     our $Env = [];
81 :    
82 :     #
83 :     # FIG configuration information.
84 :     # This list contains tuples [$name, $value, $quote]
85 :     # which are to be set in the FIG_Config modules for
86 :     # both python and perl. $quote is 1 for things that need
87 :     # to be quoted, 0 otherwise.
88 :     #
89 :     our $Config = [];
90 :    
91 :     #
92 :     # Other key/value pairs of stuff we may need to pass
93 :     # to and from the environment-specific configuration modules.
94 :     #
95 :     # Known keys:
96 :     #
97 :     # pythonpath
98 :     #
99 :    
100 :     our $OtherConfig = {};
101 :    
102 :     #
103 :     # Cache values of the various places we may be installing things.
104 :     #
105 :    
106 :     our $fig_disk = $ENV{FIG_HOME};
107 :     our $env_name = $ENV{FIGCONFIG_ENV};
108 :     our $env_bin = "$ENV{FIGCONFIG_ENV_DIR}/bin";
109 :     our $env_lib = "$ENV{FIGCONFIG_ENV_DIR}/lib";
110 :     our $dist_bin = "$ENV{FIGCONFIG_RELEASE_DIR}/bin/$ENV{FIGCONFIG_ENV}";
111 :     our $dist_lib = "$ENV{FIGCONFIG_RELEASE_DIR}/lib/$ENV{FIGCONFIG_ENV}";
112 :    
113 :     #
114 :     # Location of start/stop servers scripts.
115 :     #
116 :     our $start_servers = "$fig_disk/bin/start-servers";
117 :     our $stop_servers = "$fig_disk/bin/stop-servers";
118 :    
119 :     sub configure_std_fig_environment
120 :     {
121 :     #
122 :     # Populate the Config with the usual stuff we need in FIG_Config.pm.
123 :     #
124 :    
125 :     my $fig = "$fig_disk/FIG";
126 :     my $data = "$fig/Data";
127 :    
128 :     my $hostname = `hostname`;
129 :     chomp $hostname;
130 :    
131 :     push(@$Config, ["fig_disk", $fig_disk, 1]);
132 :     push(@$Config, ["blastmast", "$fig_disk/BLASTMAT", 1]);
133 :     push(@$Config, ["fig", $fig, 1]);
134 :     push(@$Config, ["bin", $dist_bin, 1]);
135 :     push(@$Config, ["ext_bin", $env_bin, 1]);
136 :     push(@$Config, ["data", $data, 1]);
137 :     push(@$Config, ["global", "$data/Global", 1]);
138 :     push(@$Config, ["organisms", "$data/Organisms", 1]);
139 :     push(@$Config, ["RC", "$fig_disk/FIG/ResolutionCenter", 1]);
140 :     push(@$Config, ["NR", "$fig_disk/FIG/NR", 1]);
141 :     push(@$Config, ["temp", "$fig_disk/FIG/Tmp", 1]);
142 :     push(@$Config, ["temp_url", "http://$hostname/FIG-Tmp", 1]);
143 :     push(@$Config, ["cgi_url", "http://$hostname/FIG", 1]);
144 :     }
145 :    
146 :     sub compute_environment
147 :     {
148 :     #
149 :     # ReleaseTools configuration.
150 :     #
151 :    
152 :     push(@$Env, ["RTROOT", $ENV{FIG_HOME}, 0]);
153 :     push(@$Env, ["RTDIST", "\$RTROOT/dist", 0]);
154 :     push(@$Env, ["RTARCH", $ENV{FIGCONFIG_ENV}, 0]);
155 :     push(@$Env, ["RTCURRENT", $ENV{FIGCONFIG_RELEASE}, 0]);
156 :     push(@$Env, ["FIG_HOME", $ENV{FIG_HOME}, 0]);
157 :    
158 :     push(@$Env, ["BLASTMAT", "$ENV{FIG_HOME}/BLASTMAT", 0]);
159 :    
160 :     #
161 :     # Determine the path to use.
162 :     #
163 :     # This includes the path into the particular release we're configuring for,
164 :     # and to the environment's bin directory.
165 :     #
166 :    
167 :     my @path = ();
168 :     push(@path, $env_bin);
169 :     push(@path, $dist_bin);
170 :     push(@path, "$fig_disk/bin");
171 :    
172 :     push(@$Env, ["PATH", join(":", @path), 1]);
173 :    
174 :     push(@$Env, ["LD_LIBRARY_PATH", "${env_lib}:${dist_lib}", 1]);
175 :     }
176 :    
177 :     sub configure_python
178 :     {
179 :     #
180 :     # Determine the PYTHONPATH we're to use.
181 :     #
182 :     # Right now, we don't compute a replacement for the system path,
183 :     # but we're likely going to require that *if* python is
184 :     # distributed with the environment. We're currently not doing that.
185 :     #
186 :     # So we just need to point to any python packages in the release,
187 :     # and to packages that were installed in the environment dir.
188 :     #
189 :    
190 :     my $python = find_python();
191 :     print "Found python at $python\n";
192 :    
193 :     my $py_version = `$python -c 'import sys; print "%d.%d" % (sys.version_info[:2])'`;
194 :     chomp $py_version;
195 :     print "Python version $py_version\n";
196 :    
197 :     my @path = ();
198 :     push(@path, "$ENV{FIGCONFIG_ENV_DIR}/lib/python$py_version/site-packages");
199 :     push(@path, "$ENV{FIGCONFIG_RELEASE_DIR}/lib/$ENV{FIGCONFIG_ENV}");
200 :     push(@path, "$fig_disk/config");
201 :     push(@$Env, ["PYTHONPATH", join(":", @path), 1]);
202 :    
203 :     $OtherConfig->{pythonpath} = join(":", @path);
204 :     }
205 :    
206 :     sub find_in_path
207 :     {
208 :     my($file) = @_;
209 :     my(@path) = split(":", $ENV{PATH});
210 :    
211 :     for my $p (@path)
212 :     {
213 :     my $x = "$p/$file";
214 :     if (-x $x)
215 :     {
216 :     return $x;
217 :     }
218 :     }
219 :     return undef;
220 :     }
221 :    
222 :     #
223 :     # Find the name of the python executable we are to use.
224 :     #
225 :     sub find_python
226 :     {
227 :     my $python;
228 :    
229 :     #
230 :     # Special case for the mac.
231 :     #
232 :    
233 :     if ($ENV{FIGCONFIG_ENV} eq "mac")
234 :     {
235 :     if ($python = find_in_path("pythonw"))
236 :     {
237 :     return $python;
238 :     }
239 :    
240 :     #
241 :     # Didn't find it in the path; we require the
242 :     # MacPython build, and that installs into
243 :     # /usr/local/bin/pythonw by default.
244 :     #
245 :    
246 :     return "/usr/local/bin/pythonw";
247 :     }
248 :     else
249 :     {
250 :     #
251 :     # Non-mac, just look in the env dir or the path.
252 :     #
253 :    
254 :     $python = "$ENV{FIGCONFIG_ENV_DIR}/bin/python";
255 :     if (-x $python)
256 :     {
257 :     return $python;
258 :     }
259 :    
260 :     return find_in_path("python");
261 :     }
262 :     }
263 :    
264 :     #
265 :     # Find the name of the perl executable we are to use.
266 :     #
267 :     sub find_perl
268 :     {
269 :     my $perl;
270 :    
271 :     $perl = "$ENV{FIGCONFIG_ENV_DIR}/bin/perl";
272 :     if (-x $perl)
273 :     {
274 :     return $perl;
275 :     }
276 :    
277 :     warn "We did not find a perl executable in the SEED distribution; some modules may not be found\n";
278 :     return find_in_path("perl");
279 :     }
280 :    
281 :     sub write_bash_init
282 :     {
283 :     my($fh, $env) = @_;
284 :    
285 :     foreach my $item (@$env)
286 :     {
287 :     my($name, $value, $append) = @$item;
288 :    
289 :     if ($append)
290 :     {
291 :     #
292 :     # Write code to detect if the value is set, and act accordingly.
293 :     #
294 :    
295 :     print $fh <<END;
296 :     DELIM=
297 :     if [ -n "\$$name" ] ; then
298 :     DELIM=:
299 :     fi
300 :     $name=\${$name}\${DELIM}$value
301 :     export $name
302 :     END
303 :     }
304 :     else
305 :     {
306 :     print $fh "$name=\"$value\"\n";
307 :     print $fh "export $name\n";
308 :     }
309 :     }
310 :     }
311 :    
312 :     sub write_csh_init
313 :     {
314 :     my($fh, $env) = @_;
315 :    
316 :     foreach my $item (@$env)
317 :     {
318 :     my($name, $value, $append) = @$item;
319 :    
320 :     if ($append)
321 :     {
322 :     #
323 :     # Write code to detect if the value is set, and act accordingly.
324 :     #
325 :    
326 :     print $fh <<END;
327 :     if (\$?$name) then
328 :     setenv $name \${$name}:$value
329 :     else
330 :     setenv $name $value
331 :     endif
332 :     END
333 :     }
334 :     else
335 :     {
336 :     print $fh "setenv $name \"$value\"\n";
337 :     }
338 :     }
339 :    
340 :     }
341 :    
342 :     sub run_script
343 :     {
344 :     my($script) = @_;
345 :    
346 :    
347 :     unless (my $ret = do $script)
348 :     {
349 :     if ($@)
350 :     {
351 :     warn "Error parsing $script: $@\n";
352 :     }
353 :     elsif (!defined($ret))
354 :     {
355 :     warn "Couldn't do $script: $!\n";
356 :     }
357 :     else
358 :     {
359 :     warn "Counldn't run $script\n";
360 :     }
361 :     }
362 :    
363 :    
364 :     }
365 :    
366 :     sub configure_environment_specific
367 :     {
368 :     my $env_script = $ENV{FIGCONFIG_ENV_CONFIG};
369 :    
370 :     if (! -f $env_script)
371 :     {
372 :     warn "No environment-specific configuration file $env_script found, skipping\n";
373 :     return;
374 :     }
375 :    
376 :     run_script($env_script);
377 :     }
378 :    
379 :     #
380 :     # Create any directories that might be missing.
381 :     #
382 :    
383 :     sub setup_directories
384 :     {
385 :     my(@needed) = @_;
386 :    
387 :     for my $dir (@needed)
388 :     {
389 :     if (! -d $dir)
390 :     {
391 :     mkdir($dir) or warn "Could not create $dir: $!\n";
392 :     }
393 :     }
394 :     }
395 :    
396 :     sub setup_server_scripts
397 :     {
398 :     #
399 :     # Remove any start/stop servers scripts we might have, and write the stub
400 :     # start.
401 :     #
402 :    
403 :     unlink($start_servers);
404 :     unlink($stop_servers);
405 :    
406 :     open(F, ">$start_servers") or die "Cannot write $start_servers: $!";
407 :     print F "#!/bin/sh\n\n";
408 :     close(F);
409 :     chmod(0775, $start_servers);
410 :    
411 :     open(F, ">$stop_servers") or die "Cannot write $stop_servers: $!";
412 :     print F "#!/bin/sh\n\n";
413 :     close(F);
414 :     chmod(0775, $stop_servers);
415 :    
416 :     }
417 :    
418 :     sub write_config_pm
419 :     {
420 :     my($fh, $config) = @_;
421 :    
422 :     print $fh "package FIG_Config;\n\n";
423 :    
424 :     foreach my $item (@$config)
425 :     {
426 :     my($name, $value, $quote) = @$item;
427 :    
428 :     my $q = $quote ? '"' : '';
429 :     printf $fh "\$%-15s = $q$value$q;\n", $name
430 :     }
431 :    
432 :     print $fh "\n1;\n";
433 :     }
434 :    
435 :     sub write_config_py
436 :     {
437 :     my($fh, $config) = @_;
438 :    
439 :     foreach my $item (@$config)
440 :     {
441 :     my($name, $value, $quote) = @$item;
442 :    
443 :     #
444 :     # Ugh. "global" is a keyword in python.
445 :     #
446 :    
447 :     $name = "global_dir" if $name eq "global";
448 :    
449 :     my $q = $quote ? '"' : '';
450 :     printf $fh "%-15s = $q$value$q\n", $name
451 :     }
452 :     }
453 :    
454 :     sub write_tool_hdr_perl
455 :     {
456 :     my($fh) = @_;
457 :    
458 :     my $perl = find_perl();
459 :    
460 :     print $fh "#!$perl\n";
461 :     print $fh "\n";
462 :    
463 :     if ($::perlenv_override)
464 :     {
465 :     #
466 :     # Write the tool header BEGIN block to reset the environment.
467 :     #
468 :    
469 :     print $fh "BEGIN {\n";
470 :     print $fh " \@INC = qw(\n";
471 :     for my $inc (@INC)
472 :     {
473 :     next if $inc eq '.';
474 :     print $fh "\t$inc\n";
475 :     }
476 :     print $fh ")\n";
477 :     print $fh "}\n";
478 :     }
479 :    
480 :     print $fh "use Data::Dumper;\n";
481 :     print $fh "use Carp;\n";
482 :    
483 :     print $fh "use lib \"$dist_lib\";\n";
484 :     print $fh "use lib \"$dist_lib/FigKernelPackages\";\n";
485 :     print $fh "use lib \"$fig_disk/config\";\n";
486 :    
487 :     print $fh "use FIG_Config;\n";
488 :     print $fh "\n";
489 :     }
490 :    
491 :     sub write_tool_hdr_python
492 :     {
493 :     my($fh) = @_;
494 :    
495 :     my $python = find_python();
496 :    
497 :     print $fh "#!$python\n";
498 :     print $fh "\n";
499 :    
500 :     print $fh "import sys\n";
501 :     my $pp = join(", ", map({ '"' . $_ . '"'} split(":", $OtherConfig->{pythonpath})));
502 :     print $fh "sys.path.extend(($pp))\n";
503 :     print $fh "import FIG_Config\n";
504 :     print $fh "\n";
505 :     }
506 :    
507 :     setup_directories("$fig_disk/bin",
508 :     "$fig_disk/config");
509 :    
510 :     setup_server_scripts();
511 :    
512 :    
513 :     find_python();
514 :    
515 :     compute_environment();
516 :     configure_std_fig_environment();
517 :     configure_python();
518 :     configure_environment_specific();
519 :    
520 :     #
521 :     # Write the shell startup to the figdisk.
522 :     #
523 :     open(FH, ">$fig_disk/config/fig-user-env.sh") or die "Cannot write $fig_disk/config/fig-user-env.sh: $!";
524 :     write_bash_init(\*FH, $Env);
525 :     close(FH);
526 :    
527 :     open(FH, ">$fig_disk/config/fig-user-env.csh") or die "Cannot write $fig_disk/config/fig-user-env.csh: $!";
528 :     write_csh_init(\*FH, $Env);
529 :     close(FH);
530 :    
531 :     #
532 :     # Write the FIG_Config file.
533 :     #
534 :    
535 :     open(FH, ">$fig_disk/config/FIG_Config.pm") or die "Cannot write $fig_disk/config/FIG_Config.pm: $!";
536 :     write_config_pm(\*FH, $Config);
537 :     close(FH);
538 :    
539 :     open(FH, ">$fig_disk/config/FIG_Config.py") or die "Cannot write $fig_disk/config/FIG_Config.py: $!";
540 :     write_config_py(\*FH, $Config);
541 :     close(FH);
542 :    
543 :     #
544 :     # Write the tool headers
545 :     #
546 :    
547 :     open(FH, ">$fig_disk/config/tool_hdr") or die "Cannot write $fig_disk/config/tool_hdr: $!";
548 :     write_tool_hdr_perl(\*FH);
549 :     close(FH);
550 :    
551 :     open(FH, ">$fig_disk/config/tool_hdr_py") or die "Cannot write $fig_disk/config/tool_hdr_py: $!";
552 :     write_tool_hdr_python(\*FH);
553 :     close(FH);
554 :    
555 :     #
556 :     # We have enough environment configured now to do a make.
557 :     #
558 :     # We use system and manually load the environment config so that it will
559 :     # work properly despite any user settings.
560 :     #
561 :    
562 :     system("source $fig_disk/config/fig-user-env.sh; cd $ENV{FIGCONFIG_RELEASE_DIR}; make clean; make");

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3