1 arta 1.1 #!/usr/bin/perl -w
2
3 # These are mutually exclusive
4 # -e - an EXE with a main (CEXE, FEXE, or SERVEREXE)
5 # -m - a C module (MODEXE, MODEXE_SOCK, MODEXE_USEF, MODEXE_USEF_SOCK)
6 # -M - a Fortran module (FMODEXE_SOCK)
7
8 # -c - links with C compiler (CEXE, SERVEREXE, MODEXE, MODEXE_SOCK)
9 # -f - links with Fortran compiler (FEXE, FMODEXE_SOCK, MODEXE_USEF, MODEXE_USEF_SOCK)
10
11 # -s - socket connect (which also means client version of the DRMS library)
12 # (CEXE, FEXE, MODEXE_SOCK, FMODEXE_SOCK, MODEXE_USEF_SOCK)
13 # -d - direct connect (which also means server version of the DRMS library) (SERVEREXE, MODEXE, MODEXE_USEF)
14
15 # CEXE ==> -ecs
16 # FEXE ==> -efs
17 # SERVEREXE ==> -ecd
18 # MODEXE ==> -mcd
19 # MODEXE_SOCK ==> -mcs
20 # FMODEXE_SOCK ==> -Mfs
21 # MODEXE_USEF ==> -mfd
22 arta 1.1 # MODEXE_USEF_SOCK ==> -msf
23
24 use Switch;
25
26 # Default locations for third-party libraries are specified with a configuration file. The file can
27 # be edited to customize the locations
28 use constant kJCCCONF ==> "jcc.conf";
29
30 use constant kCEXE ==> 1;
31 use constant kFEXE ==> 2;
32 use constant kSERVEXE ==> 3;
33 use constant kCMOD ==> 4;
34 use constant kCMOD_SOCK ==> 5;
35 use constant kFMOD_SOCK ==> 6;
36 use constant kCMOD_USEF ==> 7;
37 use constant kCMOD_USEF_SOCK ==> 8;
38
39 use constant kCompType_icc ==> 0;
40 use constant kCompType_gcc ==> 1;
41 use constant kCompType_none ==> 2;
42 use constant kFCompType_ifort ==> 0;
43 arta 1.1 use constant kFCompType_gfort ==> 1;
44 use constant kFCompType_none ==> 2;
45
46 use constant kDRMSBinRoot ==> "/home/jsoc/cvs/JSOC/";
47 use constant kDRMSBinRoot_x86_64 ==> "/home/jsoc/cvs/JSOC/_linux_x86_64";
48 use constant kDRMSBinRoot_ia32 ==> "/home/jsoc/cvs/JSOC/_linux_ia32";
49
50 use constant kLinux_X86_64 ==> 0;
51 use constant kLinux_IA32 ==> 1;
52
53 use constant kICCMAJOR => 9;
54 use constant kICCMINOR => 0;
55 use constant kIFORTMAJOR => 9;
56 use constant kIFORTMINOR => 0;
57 use constant kGCCMAJOR => 3;
58 use constant kGCCMINOR => 0;
59 use constant kGFORTMAJOR => 4;
60 use constant kGFORTMINOR => 2;
61
62 use constant kCFAll_icc ==> "";
63 use constant kLFAll_icc ==> "";
64 arta 1.1
65 my($arg);
66 my($pos);
67 my($flagstr);
68 my($aflag);
69 my(@flags);
70 my(@sortedflags);
71 my($progtype);
72 my($src);
73 my($cf);
74 my($lf);
75
76 my($overrideDbg);
77 my($overrideWrn);
78 my($overrideWrnICC);
79 my($overrideCComp);
80 my($overrideFComp);
81
82 my($line);
83 my($cvsmod);
84
85 arta 1.1 my($conf);
86 my(@comps);
87 my($platenv);
88 my($plat);
89 my($useccomp);
90 my($debug);
91 my($warn);
92 my($warnmore);
93 my($comp);
94 my($pgipath);
95 my($pglpath);
96 my($cfitsioipath);
97 my($cfitsiolpath);
98
99 SetArgs(\$progtype, \$useccomp, \$src, \$cf, \$lf, \$warnmore, \$debug, \$warn);
100
101 # check arguments as necessary
102
103 if (defined($src))
104 {
105 if ($src !~ /\.c$/ && $src !~ /\.f$/)
106 arta 1.1 {
107 if (-e "$src\.c")
108 {
109 $src = "$src\.c";
110 }
111 elsif (-e "$src\.f")
112 {
113 $src = "$src\.f";
114 }
115 else
116 {
117 die "Cannot find source file $src\.c or $src\.f.\nGood bye.\n";
118 }
119 }
120 else
121 {
122 # Verify file exists
123 if (!(-e $src))
124 {
125 die "Cannot find source file $src.\nGood bye.\n";
126 }
127 arta 1.1 }
128 }
129 else
130 {
131 die "Missing source file name.\nGood bye.\n";
132 }
133
134 # sort flags
135 #@sortedflags = sort({$a cmp $b}, @flags);
136
137 # find out what platform
138 $platenv = $ENV{'JSOC_MACHINE'};
139
140 if (!defined($platenv))
141 {
142 die "Must define environment variable JSOC_MACHINE.\nGood bye.\n";
143 }
144 elsif ($platenv eq "linux_x86_64")
145 {
146 $plat = kLinux_X86_64;
147 }
148 arta 1.1 elsif ($platenv eq "linux_ia32")
149 {
150 $plat = kLinux_IA32;
151 }
152 else
153 {
154 die "Invalid value ($platenv) for environment variable JSOC_MACHINE";
155 }
156
157 # look for environment variables that override compiler, debugging symbols, etc.
158 $overrideDbg = $ENV{'JSOC_DEBUG'};
159 $overrideWrn = $ENV{'JSOC_WARN'};
160 $overrideWrnICC = $ENV{'JSOC_WARNICC'};
161 $overrideComp = $ENV{'JSOC_COMPILER'};
162 $overrideFComp = $ENV{'JSOC_FCOMPILER'};
163
164 # autoconfigure compilers
165 @comps = ChooseComps();
166
167 if (defined($overrideComp))
168 {
169 arta 1.1 if ($overrideComp =~ /icc/ && comps[0] == 1)
170 {
171 $comp = "icc";
172 }
173 elsif ($overrideComp =~ /gcc/ && comps[1] == 1)
174 {
175 $comp = "gcc";
176 }
177 elsif ($useccomp)
178 {
179 die "Compiler $overrideComp not available.\nGood bye.\n";
180 }
181 }
182
183 if (defined($overrideFComp))
184 {
185 if ($overrideFComp =~ /ifort/ && comps[2] == 1)
186 {
187 $comp = "ifort";
188 }
189 elsif ($overrideFComp =~ /gfort/ && comps[3] == 1)
190 arta 1.1 {
191 $comp = "gfort";
192 }
193 elsif (!$useccomp)
194 {
195 die "Compiler $overrideFComp not available.\nGood bye.\n";
196 }
197 }
198
199 # set up debugging and warnings
200 if (!defined($debug))
201 {
202 if (defined($overrideDbg))
203 {
204 $debug = $overrideDbg;
205 }
206 else
207 {
208 $debug = 0;
209 }
210 }
211 arta 1.1
212 if (!defined($warn))
213 {
214 if (defined($overrideDbg))
215 {
216 $warn = $overrideDbg;
217 }
218 else
219 {
220 $warn = 0;
221 }
222 }
223
224 if (defined($warn) && !defined($warnmore))
225 {
226 if (defined($overrideWrnICC))
227 {
228 $warnmore = $overrideWrnICC;
229 }
230 else
231 {
232 arta 1.1 $warnmore = "";
233 }
234 }
235
236 # set up third-party library paths
237 $conf = kJCCCONF;
238 open(JCCCONF, "<$conf");
239
240 while (defined($line = <JCCCONF>))
241 {
242 chomp($line);
243
244 if ($line !~ /^#/ && length($line) > 0)
245 {
246 if ($line =~ /(.+)\s+(.+)/)
247 {
248 $key = $1;
249 $value = $2;
250
251 if ($key =~ /PGIPATH/i)
252 {
253 arta 1.1 $pgipath = $value;
254 }
255 elsif ($key =~ /CFITSIOIPATH/i)
256 {
257 $cfitioipath = $value;
258 }
259 elsif ($plat == kLinux_IA32 && $key =~ /CFITSIOLPATH32/i)
260 {
261 $cfitsiolpath = $value;
262 }
263 elsif ($plat == kLinux_X86_64 && $key =~ /CFITSIOLPATH64/i)
264 {
265 $cfitsiolpath = $value;
266 }
267 }
268 }
269 }
270
271 close(JCCCONF);
272
273
274 arta 1.1
275
276 if (!$debug)
277 {
278
279 }
280 else
281 {
282
283 }
284
285 switch ($progtype)
286 {
287 case kCMOD
288 {
289
290 }
291
292 }
293
294 sub SetArgs
295 arta 1.1 {
296 my($progtype) = $_[0];
297 my($useccomp) = $_[1];
298 my($src) = $_[2];
299 my($cf) = $_[3];
300 my($lf) = $_[4];
301 my($warnmore) = $_[5];
302 my($debug) = $_[6];
303 my($warn) = $_[7];
304
305 $$useccomp = 1;
306
307 while ($arg = shift(@ARGV))
308 {
309 if ($arg =~ /t=(.+)/)
310 {
311 # module type
312 my($ptype);
313
314 $ptype = $1;
315 if ($ptype =~ /CEXE/i)
316 arta 1.1 {
317 $$progtype = kCEXE;
318 }
319 elsif ($ptype =~ /FEXE/i)
320 {
321 $$progtype = kFEXE;
322 $$useccomp = 0;
323 }
324 elsif ($ptype =~ /SERVEXE/i)
325 {
326 $$progtype = kSERVEXE;
327 }
328 elsif ($ptype =~ /CMOD/i)
329 {
330 $$progtype = kCMOD;
331 }
332 elsif ($ptype =~ /CMODSOCK/i)
333 {
334 $$progtype = kCMOD_SOCK;
335 }
336 elsif ($ptype =~ /FMODSOCK/i)
337 arta 1.1 {
338 $$progtype = kFMOD_SOCK;
339 }
340 elsif ($ptype =~ /CMODUSEF/i)
341 {
342 $$progtype = kCMOD_USEF;
343 }
344 elsif ($ptype =~ /CMODUSEFSOCK/i)
345 {
346 $$progtype = kCMOD_USEF_SOCK;
347 }
348 else
349 {
350 print STDERR "Unsupported binary type.\n";
351 die;
352 }
353 }
354 elsif ($arg =~ /src=(.+)/)
355 {
356 $$src = $1;
357 }
358 arta 1.1 elsif ($arg !~ /=/)
359 {
360 $$src = $arg;
361 }
362 elsif ($arg =~ /cf=(.+)/)
363 {
364 # compile flags
365 $$cf = $1;
366 }
367 elsif ($arg =~ /lf=(.+)/)
368 {
369 # link flags
370 $$lf = $1;
371 }
372 elsif ($arg =~ /wm=(.+)/)
373 {
374 $$warnmore = $1;
375 }
376 elsif ($arg eq "-d")
377 {
378 $$debug = 1;
379 arta 1.1 }
380 elsif ($arg eq "-w")
381 {
382 $$warn = 1;
383 }
384 }
385 }
386
387 sub IsVersion
388 {
389 my($maj1) = $_[0];
390 my($min1) = $_[1];
391 my($maj2) = $_[2];
392 my($min2) = $_[3];
393
394 my($res) = 0;
395
396 if ($maj1 > $maj2 || ($maj1 == $maj2 && $min1 >= $min2))
397 {
398 $res = 1;
399 }
400 arta 1.1
401 return $res;
402 }
403
404 sub ChooseComps
405 {
406 my(@ret);
407 my($ans);
408 my($major);
409 my($minor);
410
411 my($hasicc);
412 my($hasifort);
413 my($hasgcc);
414 my($hasgfort);
415
416 # Try icc
417 $ans = `icc -V 2>&1`;
418
419 if (defined($ans) && $ans =~ /Version\s+(\d+)\.(\d+)/)
420 {
421 arta 1.1 $major = $1;
422 $minor = $2;
423
424 if (IsVersion($major, $minor, kICCMAJOR, kICCMINOR))
425 {
426 $hasicc = 1;
427 }
428 }
429
430 # Try gcc
431 if (!$hasicc)
432 {
433 $ans = `gcc -v 2>&1`;
434 if (defined($ans) && $ans =~ /gcc\s+version\s+(\d+)\.(\d+)/)
435 {
436 $major = $1;
437 $minor = $2;
438
439 if (IsVersion($major, $minor, kGCCMAJOR, kGCCMINOR))
440 {
441 $hasgcc = 1;
442 arta 1.1 }
443 }
444 }
445
446 # Try ifort
447 $ans = `ifort -V 2>&1`;
448 if (defined($ans) && $ans =~ /Version\s+(\d+)\.(\d+)/)
449 {
450 $major = $1;
451 $minor = $2;
452
453 if (IsVersion($major, $minor, kIFORTMAJOR, kIFORTMINOR))
454 {
455 $hasifort = 1;
456 }
457 }
458
459 # Try gfortran
460 if (!$hasifort)
461 {
462 $ans = `gfortran -v 2>&1`;
463 arta 1.1 if (defined($ans) && $ans =~ /gcc\s+version\s+(\d+)\.(\d+)/)
464 {
465 $major = $1;
466 $minor = $2;
467
468 if (IsVersion($major, $minor, kGFORTMAJOR, kGFORTMINOR))
469 {
470 $hasgfort = 1;
471 }
472 }
473 }
474
475 $ret[0] = $hasicc;
476 $ret[1] = $hasgcc;
477 $ret[2] = $hasifort;
478 $ret[3] = $hasgfort;
479
480 return @ret;
481 }
|