Fixed bugs due to ckfutures declarations in c++interface.h
[charm.git] / src / charmc
1 #!/bin/csh -f
2 ############################################################################
3 # RCS INFORMATION:
4 #
5 #       $RCSfile$
6 #       $Author$      $Locker$              $State$
7 #       $Revision$        $Date$
8 #
9 ############################################################################
10 # DESCRIPTION:
11 #
12 ############################################################################
13 # REVISION HISTORY:
14 #
15 ############################################################################
16
17
18
19 ##############################################################################
20 #
21 # Initialize the main controlling variables, setup error handler
22 #
23 # ALL variables used by this script should be initialized here.
24 #
25 ##############################################################################
26
27 unsetenv MACHTYPE
28 unsetenv SEQUENTIAL
29 unsetenv LANGUAGE
30 unsetenv BALANCE
31 unsetenv MEMORY
32 unsetenv TRACEMODE
33 unsetenv VERBOSE
34 unsetenv SAVE
35 unsetenv PURIFY
36 unsetenv OVERRIDE_CC
37 unsetenv OVERRIDE_CXX
38 unsetenv OVERRIDE_LD
39 unsetenv OVERRIDE_LDXX
40 unsetenv OPTS_CPP       ; set OPTS_CPP = ()
41 unsetenv OPTS_LDRO      ; set OPTS_LDRO = ()
42 unsetenv OPTS_CC        ; set OPTS_CC = ()
43 unsetenv OPTS_CXX       ; set OPTS_CXX = ()
44 unsetenv OPTS_LD        ; set OPTS_LD = ()
45 unsetenv OPTS_LDXX      ; set OPTS_LDXX = ()
46 unsetenv OBJECT
47 unsetenv COPIES         ; set COPIES = ()
48 unsetenv LIBRARIES      ; set LIBRARIES = ()
49 unsetenv FILES          ; set FILES = ()
50 unsetenv OBJECTFILES    ; set OBJECTFILES = ()
51 unsetenv DELETE         ; set DELETE = ()
52 unsetenv MAINOBJ        ; set MAINOBJ = ()
53 unsetenv GENCPM         ; set GENCPM = ()
54 unsetenv DEBUG_MODE
55 unsetenv OPTIMIZE_MODE
56 unsetenv USE_RELIABLE_CC
57 unsetenv USE_FASTEST_CC
58 unsetenv ECHOCMD        ; set ECHOCMD=(unset echo)
59
60 ##############################################################################
61 #
62 # Parse the arguments
63 #
64 # Don't do any analysis in here, just the parsing.
65 #
66 ##############################################################################
67
68
69 set argindex=1
70 while ($argindex <= $#argv)
71     set arg=$argv[$argindex]
72     @ argindex = $argindex + 1
73
74     switch ($arg)
75         case "-machine"
76             set MACHTYPE=$argv[$argindex]
77             @ argindex = $argindex + 1
78             breaksw
79
80         case "-seq"
81             set SEQUENTIAL=yes
82             breaksw
83
84         case "-language"
85             set LANGUAGE=$argv[$argindex]
86             @ argindex = $argindex + 1
87             breaksw
88
89         case "-balance"
90             set BALANCE=$argv[$argindex]
91             @ argindex = $argindex + 1
92             breaksw
93
94         case "-queue"
95             echo "Warning: -queue currently being ignored."
96             @ argindex = $argindex + 1
97             breaksw
98
99         case "-memory"
100             echo "Warning: -memory currently being ignored."
101             @ argindex = $argindex + 1
102             breaksw
103
104         case "-tracemode"
105             set TRACEMODE=$argv[$argindex]
106             @ argindex = $argindex + 1
107             breaksw
108
109         case "-verbose"
110             set VERBOSE=1
111             set ECHOCMD=(set echo)
112             breaksw
113
114         case "-save"
115             set SAVE=1
116             breaksw
117
118         case "-purify"
119             set PURIFY=1
120             breaksw
121
122         case "-use-reliable-cc"
123             set USE_RELIABLE_CC=1
124             breaksw
125
126         case "-use-fastest-cc"
127             set USE_FASTEST_CC=1
128             breaksw
129  
130         case "-cc"
131             set OVERRIDE_CC=( $argv[$argindex] )
132             @ argindex = $argindex + 1
133             breaksw
134
135         case "-c++"
136             set OVERRIDE_CXX=( $argv[$argindex] )
137             @ argindex = $argindex + 1
138             breaksw
139
140         case "-ld"
141             set OVERRIDE_LD=( $argv[$argindex] )
142             @ argindex = $argindex + 1
143             breaksw
144
145         case "-ld++"
146             set OVERRIDE_LDXX=( $argv[$argindex] )
147             @ argindex = $argindex + 1
148             breaksw
149
150         case "-cpp-option"
151             set OPTS_CPP=( $OPTS_CPP $argv[$argindex] )
152             @ argindex = $argindex + 1
153             breaksw
154
155         case "-ldro-option"
156             set OPTS_LDRO=( $OPTS_LDRO $argv[$argindex] )
157             @ argindex = $argindex + 1
158             breaksw
159
160         case "-cc-option"
161             set OPTS_CC=( $OPTS_CC $argv[$argindex] )
162             @ argindex = $argindex + 1
163             breaksw
164
165         case "-c++-option"
166             set OPTS_CXX=( $OPTS_CXX $argv[$argindex] )
167             @ argindex = $argindex + 1
168             breaksw
169
170         case "-ld-option"
171             set OPTS_LD=( $OPTS_LD $argv[$argindex] )
172             @ argindex = $argindex + 1
173             breaksw
174
175         case "-ld++-option"
176             set OPTS_LDXX=( $OPTS_LDXX $argv[$argindex] )
177             @ argindex = $argindex + 1
178             breaksw
179             
180         case "-c":
181             # This is ignored.
182             breaksw
183
184         case "-o":
185             set OBJECT=$argv[$argindex]
186             @ argindex = $argindex + 1
187             breaksw
188
189         case "-cp"
190             set COPIES=($argv[$argindex] $COPIES)
191             @ argindex = $argindex + 1
192             breaksw
193
194         case "-gen-cpm"
195             set GENCPM=($GENCPM $argv[$argindex])
196             @ argindex = $argindex + 1
197             breaksw
198
199         case "-D*"
200             set OPTS_CPP=( $OPTS_CPP "$arg" )
201             set OPTS_CC= ( $OPTS_CC  "$arg" )
202             set OPTS_CXX=( $OPTS_CXX "$arg" )
203             breaksw
204
205         case "-I*"
206             set OPTS_CPP=( $OPTS_CPP "$arg" )
207             set OPTS_CC= ( $OPTS_CC  "$arg" )
208             set OPTS_CXX=( $OPTS_CXX "$arg" )
209             breaksw
210
211         case "-L*"
212             set OPTS_LDRO=( $OPTS_LDRO "$arg" )
213             set OPTS_LD=  ( $OPTS_LD   "$arg" )
214             set OPTS_LDXX=( $OPTS_LDXX "$arg" )
215             breaksw
216
217         case "-g"
218             set DEBUG_MODE=1
219             breaksw
220
221         case "-O"
222             set OPTIMIZE_MODE=1
223             breaksw
224
225         case "-NO"
226             unset OPTIMIZE_MODE
227             breaksw
228
229         case "-pg"
230             set OPTS_CC= ( $OPTS_CC $arg )
231             set OPTS_CXX= ( $OPTS_CC $arg )
232             set OPTS_LD= ( $OPTS_CC $arg )
233             set OPTS_LDXX= ( $OPTS_CC $arg )
234             breaksw
235
236         case "-O*"
237             set OPTS_CC= ( $OPTS_CC $arg )
238             set OPTS_CXX=( $OPTS_CXX $arg )
239             breaksw
240
241         case "-l*"
242             set LIBRARIES=( $LIBRARIES $arg )
243             breaksw
244
245         case "-s"
246             set OPTS_LD=  ( $OPTS_LD   $arg )
247             set OPTS_LDXX=( $OPTS_LDXX $arg )
248             breaksw
249
250         case "-*"
251             echo "passing unrecognized option $arg to all compilers and linkers"
252             set OPTS_CPP= ( $OPTS_CPP  $arg )
253             set OPTS_CC=  ( $OPTS_CC   $arg )
254             set OPTS_CXX= ( $OPTS_CXX  $arg )
255             set OPTS_LD=  ( $OPTS_LD   $arg )
256             set OPTS_LDXX=( $OPTS_LDXX $arg )
257             set OPTS_LDRO=( $OPTS_LDRO $arg )
258             breaksw
259
260         case "*.*"
261             set FILES=( $FILES "$arg" )
262             breaksw
263         
264         default:
265             echo "Unrecognized argument $arg"
266             exit 1
267
268     endsw
269 end
270
271 ##############################################################################
272 #
273 # The following section identifies CHARMBIN, the charm binary-directory.
274 #
275 ##############################################################################
276
277 set ORIGDIR=`pwd`
278
279 # Try to find CHARMBIN by looking in directory where charmc is
280
281 if ($?CHARMBIN == 0) then
282     set SCRIPT=$0
283     if ($SCRIPT:h != $SCRIPT:t) then
284         cd $SCRIPT:h
285         set SCRIPT=$SCRIPT:t
286     else
287         foreach dir ($path)
288             if (-x $dir/$SCRIPT && ! -d $dir/$SCRIPT) then
289                 cd $dir
290                 break
291             endif
292         end
293     endif
294     while (x`find $SCRIPT -type l -print` == x$SCRIPT)
295         set SCRIPT=`ls -al ./$SCRIPT:t | sed -e "s@.*-> @@"`
296         if ($SCRIPT:h != $SCRIPT:t) then
297             cd $SCRIPT:h
298             set SCRIPT=$SCRIPT:t
299         endif
300     end
301     set CHARMBIN=`pwd`
302 endif
303
304 # Give an error message
305
306 if ($?CHARMBIN == 0) then
307     echo ''
308     echo 'Error - cannot find the charm binary directory.'
309     echo ''
310     echo 'Normally, charmc and the other charm scripts automatically'
311     echo 'locate the charm binary directory, using the following strategy:'
312     echo ''
313     echo '  Step 1. It looks in the directory specified in $CHARMBIN'
314     echo ''
315     echo '  Step 2. It looks in the directory from which charmc was run.'
316     echo ''
317     echo 'If it searches both these places, and doesnt find the charm'
318     echo 'files, it will give up.'
319     echo ''
320     exit 1
321     endif
322 endif
323
324 if ($?MACHTYPE) then
325     if (-d $CHARMBIN/../../$MACHTYPE/bin) then
326         cd $CHARMBIN/../../$MACHTYPE/bin
327         set CHARMBIN=`pwd`
328     else
329         echo 'error - there is no installed charm for "'$MACHTYPE'"'
330         exit 1
331     endif
332 endif
333
334 if ($?CHARMLIB == 0) then
335     cd $CHARMBIN/../lib
336     set CHARMLIB=`pwd`
337 endif
338 if ($?CHARMINC == 0) then
339     cd $CHARMBIN/../include
340     set CHARMINC=`pwd`
341 endif
342
343 ##############################################################################
344 #
345 # Load machine-specific configuration data, then handle overrides to it.
346 #
347 ##############################################################################
348
349 source $CHARMINC/conv-mach.csh
350
351 if ( $?USE_RELIABLE_CC ) then
352     set CMK_CC=( $CMK_CC_RELIABLE )
353 endif
354
355 if ( $?USE_FASTEST_CC ) then
356     set CMK_CC=( $CMK_CC_FASTEST )
357 endif
358
359 if ($?SEQUENTIAL) then
360     set CMK_CC=( $CMK_SEQ_CC )
361     set CMK_LD=( $CMK_SEQ_LD )
362     set CMK_CXX=( $CMK_SEQ_CXX )
363     set CMK_LDXX=( $CMK_SEQ_LDXX )
364 endif
365
366 if ($?OVERRIDE_CC) then
367     set CMK_CC[1]=""
368     set CMK_CC = ( $OVERRIDE_CC $CMK_CC )
369 endif
370
371 if ($?OVERRIDE_CXX) then
372     set CMK_CXX[1]=""
373     set CMK_CXX = ( $OVERRIDE_CXX $CMK_CXX )
374 endif
375
376 if ($?OVERRIDE_LD) then
377     set CMK_LD[1]=""
378     set CMK_LD = ( $OVERRIDE_LD $CMK_LD )
379 endif
380
381 if ($?PURIFY == 1) then
382     set CMK_LD = ( purify $CMK_LD )
383     set CMK_LDXX = ( purify $CMK_LDXX )
384 endif
385
386 if ($?OVERRIDE_LDXX) then
387     set CMK_LDXX[1]=""
388     set CMK_LDXX = ( $OVERRIDE_LDXX $CMK_LDXX )
389 endif
390
391 if ($?DEBUG_MODE) then
392     set OPTS_CC  = ( $CMK_C_DEBUG $OPTS_CC )
393     set OPTS_CXX = ( $CMK_CXX_DEBUG $OPTS_CXX )
394     set OPTS_LD  = ( $CMK_C_DEBUG $OPTS_LD )
395     set OPTS_LDXX = ( $CMK_CXX_DEBUG $OPTS_LDXX )
396 endif
397
398 if ($?OPTIMIZE_MODE) then
399     set OPTS_CC  = ( $CMK_C_OPTIMIZE $OPTS_CC )
400     set OPTS_CXX = ( $CMK_CXX_OPTIMIZE $OPTS_CXX )
401     set OPTS_LD  = ( $CMK_C_OPTIMIZE $OPTS_LD )
402     set OPTS_LDXX = ( $CMK_CXX_OPTIMIZE $OPTS_LDXX )
403 endif
404
405 onintr failure
406
407 ##############################################################################
408 #
409 # Check for valid choice of LANGUAGE
410 #
411 ##############################################################################
412
413 if ($?LANGUAGE == 0) then
414     set LANGUAGE=charm
415     if ($?SEQUENTIAL) set LANGUAGE=c
416 endif
417
418 switch ($LANGUAGE)
419     case "c"
420     case "C"
421     case "c++"
422     case "C++"
423         if ($?SEQUENTIAL == 0) then
424             echo "Language $LANGUAGE is for sequential programs"
425             goto failure
426         endif
427         breaksw
428     case "charm" 
429     case "charm++" 
430     case "converse"
431     case "converse++"
432         if ($?SEQUENTIAL == 1) then
433             echo "Language $LANGUAGE is for parallel programs"
434             goto failure
435         endif
436         breaksw
437     default:
438         echo "charmc: Unrecognized choice of language $LANGUAGE"
439         goto failure
440 endsw
441
442 cd $ORIGDIR
443
444 ##############################################################################
445 #
446 # Preprocess the GEN-CPM files
447 #
448 ##############################################################################
449
450 foreach FILE ($GENCPM)
451     set BASE=$FILE:r
452     set TMP=$BASE:t.TMP
453     set DELETE=($DELETE $TMP.c $TMP.i)
454     ($ECHOCMD ; /bin/rm -f $BASE.cpm.h $TMP.c)
455     ($ECHOCMD ; touch $BASE.cpm.h)
456     ($ECHOCMD ; /bin/ln -s $FILE $TMP.c)
457     ($ECHOCMD ; $CMK_CPP_C $OPTS_CPP -I$CHARMINC $TMP.c > $TMP.i)
458     if ($status) goto failure
459     ($ECHOCMD ; $CHARMBIN/conv-cpm $TMP.i $BASE.cpm.h)
460     if ($status) goto failure
461 end
462
463 ##############################################################################
464 #
465 # Compile all specified files
466 #
467 # All temporary files named *.TMP.* for easy cleanup.
468 #
469 ##############################################################################
470
471 foreach FILE ($FILES)
472   set BASE=$FILE:r
473   set TMP=$BASE:t.TMP
474   if (${BASE}.o != $FILE) then
475       if ($?VERBOSE) echo "compiling $FILE."
476       /bin/rm -f $BASE.o $BASE.f.o
477   endif
478   switch ($FILE)
479     case "*.p"
480       set DELETE=($DELETE $BASE.headers)
481       ($ECHOCMD ; $CMK_CPP_CHARM $OPTS_CPP -I$CHARMINC $BASE.p > $TMP.cpp)
482       ($ECHOCMD ; $CHARMBIN/charmfilter < $TMP.cpp | $CMK_M4 > $TMP.space)
483       ($ECHOCMD ; $CHARMBIN/charmxlat $TMP.space $TMP.c)
484       if ($status) goto failure
485       ($ECHOCMD ; $CMK_CC $OPTS_CC -I$CHARMINC -c $TMP.c -o $TMP.o)
486       if ($status) goto failure
487       if ($?OBJECT == 0) then
488           ($ECHOCMD ; /bin/mv $TMP.o $BASE.o)
489       else
490           set OBJECTFILES=( $OBJECTFILES $TMP.o )
491       endif
492       breaksw
493     case "*.P"
494       # Put pgm.P into pgm.TMP.P.C because CC needs source files to end with .C
495       echo '#include "ckdefs.h"' > $TMP.P.C
496       echo '#include "chare.h"' >> $TMP.P.C
497       echo '#include "c++interface.h"' >> $TMP.P.C
498       echo '#line 1 "'$BASE.P'"' >> $TMP.P.C
499       /bin/cat $BASE.P >> $TMP.P.C
500       ($ECHOCMD ; $CMK_CXXPP $OPTS_CPP -I$CHARMINC $TMP.P.C > $TMP.cpp)
501       ($ECHOCMD ; $CHARMBIN/$CMK_XLATPP $TMP.cpp $TMP.xlat)
502       if ($status) goto failure
503       ($ECHOCMD ; /bin/cat $BASE.headers > $TMP.$CMK_CPP_SUFFIX)
504       ($ECHOCMD ; /bin/cat $TMP.xlat >> $TMP.$CMK_CPP_SUFFIX)
505       ($ECHOCMD ; $CMK_CXX $OPTS_CXX -I$CHARMINC -c $TMP.$CMK_CPP_SUFFIX -o $TMP.o)
506       if ($status) goto failure
507       if ($?OBJECT == 0) then
508         ($ECHOCMD ; /bin/mv $TMP.o $BASE.o)
509       else
510         set OBJECTFILES=( $OBJECTFILES $TMP.o )
511       endif
512       breaksw
513     case "*.ci"
514       ($ECHOCMD ; $CHARMBIN/charmxi $BASE.ci)
515       if ($status) goto failure
516       breaksw
517     case "*.c"
518       ($ECHOCMD ; $CMK_CC $OPTS_CC -I$CHARMINC -c $BASE.c -o $BASE.o)
519       if ($status) goto failure
520       if ($?OBJECT) then
521         if ($OBJECT != $BASE.o) set DELETE=( $DELETE $BASE.o )
522         set OBJECTFILES=( $OBJECTFILES $BASE.o )
523       endif
524       breaksw
525     case "*.c"
526       ($ECHOCMD ; $CMK_CC $OPTS_CC -I$CHARMINC -c $BASE.c -o $BASE.o)
527       if ($status) goto failure
528       if ($?OBJECT) then
529         if ($OBJECT != $BASE.o) set DELETE=( $DELETE $BASE.o )
530         set OBJECTFILES=( $OBJECTFILES $BASE.o )
531       endif
532       breaksw
533     case "*.s"
534       ($ECHOCMD ; $CMK_CC $OPTS_CC -I$CHARMINC -c $BASE.s -o $BASE.o)
535       if ($status) goto failure
536       if ($?OBJECT) then
537         if ($OBJECT != $BASE.o) set DELETE=( $DELETE $BASE.o )
538         set OBJECTFILES=( $OBJECTFILES $BASE.o )
539       endif
540       breaksw
541     case "*.C"
542       ($ECHOCMD ; $CMK_CXX $OPTS_CXX -I$CHARMINC -c $BASE.C -o $BASE.o)
543       if ($status) goto failure
544       if ($?OBJECT) then
545         if ($OBJECT != $BASE.o) set DELETE=( $DELETE $BASE.o )
546         set OBJECTFILES=( $OBJECTFILES $BASE.o )
547       endif
548       breaksw
549     case "*.cxx"
550       ($ECHOCMD ; $CMK_CXX $OPTS_CXX -I$CHARMINC -c $BASE.cxx -o $BASE.o)
551       if ($status) goto failure
552       if ($?OBJECT) then
553         if ($OBJECT != $BASE.o) set DELETE=( $DELETE $BASE.o )
554         set OBJECTFILES=( $OBJECTFILES $BASE.o )
555       endif
556       breaksw
557     case "*.f"
558     case "*.F"
559     case "*.fc"
560     case "*.FC"
561       echo "charmc: I'm not yet smart enough to compile $FILE"
562       goto failure
563     case "*.o"
564     case "*.a"
565       set OBJECTFILES=( $OBJECTFILES $BASE.o )
566       breaksw
567     default:
568       echo "file with unrecognized extension $FILE"
569       goto failure
570   endsw
571 end
572
573 ##############################################################################
574 #
575 #                        POSSIBLY, SKIP LINK-STEP
576 #
577 # 1. No $OBJECT may be specified at all --- its just a compilation.
578 # 2. If $OBJECT is a ".a" file, a library is created from $OBJECTFILES.
579 # 3. If $OBJECT is a ".o" file, then an "LDRO" is created from $OBJECTFILES.
580 # 4. Language may be sequential.  Do a quick and easy linkage.
581 #
582 #               in any of these cases, the full link step is skipped.
583 #
584 ##############################################################################
585
586 if ($?OBJECT == 0) goto success
587
588 switch ($OBJECT)
589   case "*.o":
590     if (($#FILES == 1)&&($#OBJECTFILES == 1)) then
591         if ($OBJECT != $OBJECTFILES) then
592             rm -f $OBJECT
593             ($ECHOCMD ; /bin/mv $OBJECTFILES $OBJECT)
594             if ($status) goto failure
595         endif
596     else
597         rm -f $OBJECT
598         ($ECHOCMD ; $CMK_LDRO $OBJECT $OPTS_LDRO $OBJECTFILES)
599         if ($status) goto failure
600     endif
601     goto copyobj
602
603   case "*.a":
604     ($ECHOCMD ; rm -f $OBJECT)
605     ($ECHOCMD ; $CMK_AR $OBJECT $OBJECTFILES)
606     if ($status) goto failure
607     ($ECHOCMD ; $CMK_RANLIB $OBJECT)
608     if ($status) goto failure
609     goto copyobj
610 endsw
611
612 switch ($LANGUAGE)
613     case "c"
614     case "C"
615         ($ECHOCMD ; $CMK_SEQ_LD $OPTS_LD -o $OBJECT $OBJECTFILES -L$CHARMLIB $LIBRARIES $CMK_SEQ_LIBS)
616         if ($status) goto failure
617         goto copyobj
618         breaksw
619     case "c++"
620     case "C++"    
621         ($ECHOCMD ; $CMK_SEQ_LDXX $OPTS_LD -o $OBJECT $OBJECTFILES -L$CHARMLIB $LIBRARIES $CMK_SEQ_LIBS)
622         if ($status) goto failure
623         goto copyobj
624         breaksw
625 endsw
626
627 ##############################################################################
628 #
629 # Some quick consistency checks prior to full link-step
630 #
631 # Check for valid choice of TRACEMODE
632 # Check for valid choice of BALANCE
633 # Check for compatibility among BALANCE and TRACEMODE
634 #
635 ##############################################################################
636
637 # Check for valid choice of TRACEMODE
638
639 if (($LANGUAGE == charm) || ($LANGUAGE == charm++)) then
640
641     if (! -e $CHARMLIB/libck-trace-none.a) then
642         echo "charmc: charm libraries not installed."
643         goto failure
644     endif
645     
646     if ($?TRACEMODE == 0) set TRACEMODE=none
647
648     if (! -e $CHARMLIB/libck-trace-$TRACEMODE.a) then
649        echo "charmc : No such tracemode $TRACEMODE"
650        (cd $CHARMLIB ; ls -al libck-trace-*)
651        goto failure
652     endif
653
654 endif
655
656 # Check for valid choice of BALANCE
657
658 if (($LANGUAGE == charm) || ($LANGUAGE == charm++)) then
659
660     if ($?BALANCE == 0) set BALANCE=rand
661
662     # Check that TRACEMODE is compatible with BALANCE
663
664     if ($TRACEMODE == replay) then
665         if ($?BALANCE == 0) set BALANCE=replay
666         if ($BALANCE != replay) then
667             echo "Ignoring -balance $BALANCE, incompatible with -tracemode replay"
668         endif
669         set BALANCE=replay
670     endif
671
672 endif
673
674 # Check that the BAL_OBJ exists
675
676 if (($LANGUAGE == charm) || ($LANGUAGE == charm++)) then
677
678     if ($BALANCE:h == $BALANCE) then
679        set BAL_OBJ = $CHARMLIB/libck-ldb-$BALANCE.o
680     else
681        set BAL_OBJ = $BALANCE
682     endif
683     
684     if (! -e $BAL_OBJ) then
685        if ($BALANCE == $BAL_OBJ) then
686         echo "charmc : Could not find load balancer object $BAL_OBJ"
687        else
688         echo "charmc : Unknown load balancer $BALANCE"
689         (cd $CHARMLIB ; ls -al libck-ldb-*)
690        endif
691        goto failure
692     endif
693
694 endif
695
696 ###############################################################################
697
698 # Make sure all temp-files created during linkage get deleted.
699 #
700 ###############################################################################
701
702 set DELETE=(CHARMC-PRE.TMP.xxx CHARMC-PRE.TMP.nm $DELETE)
703 set DELETE=(CHARMC-MOD.TMP.dat CHARMC-MOD.TMP.c CHARMC-MOD.TMP.o $DELETE)
704 rm -f CHARMC-PRE.TMP.xxx CHARMC-PRE.TMP.nm
705 rm -f CHARMC-MOD.TMP.dat CHARMC-MOD.TMP.c CHARMC-MOD.TMP.o
706
707 ###############################################################################
708 #
709 #                       Create CHARMC-MOD.TMP.c
710 #
711 # This file contains the function _CK_module_init_fn, which
712 # initializes each charm or charm++ module in turn.   Its creation
713 # is highly system-dependent, which is why I have all these
714 # nested if-statements here.
715 #
716 ###############################################################################
717
718 if (($LANGUAGE == charm) || ($LANGUAGE == charm++)) then
719     if ($LANGUAGE == charm) then
720         echo '_CK_module_init_fn() {}' > CHARMC-MOD.TMP.c
721         ($ECHOCMD ; $CMK_CC $OPTS_CC -c -o CHARMC-MOD.TMP.o CHARMC-MOD.TMP.c)
722         ($ECHOCMD ; $CMK_LD $OPTS_LD -o CHARMC-PRE.TMP.xxx -L$CHARMLIB \
723                       $BAL_OBJ $OBJECTFILES $LIBRARIES \
724                       CHARMC-MOD.TMP.o -lck-core -lcharm -lck-trace-$TRACEMODE \
725                       -lck-cplus-n -lconv-cplus-n -lconv-core -lck-defmain-std\
726                       $CMK_LIBS -lm)
727     else if ($LANGUAGE == charm++) then
728         echo '_CK_module_init_fn() {}' > CHARMC-MOD.TMP.c
729         ($ECHOCMD ; $CMK_CC $OPTS_CC -c -o CHARMC-MOD.TMP.o CHARMC-MOD.TMP.c)
730         ($ECHOCMD ; $CMK_LDXX $OPTS_LDXX -o CHARMC-PRE.TMP.xxx -L$CHARMLIB \
731                       $BAL_OBJ $OBJECTFILES $LIBRARIES \
732                       CHARMC-MOD.TMP.o -lck-core -lcharm -lck-trace-$TRACEMODE \
733                       -lck-cplus-y -lconv-cplus-y -lconv-core -lck-defmain-cpp\
734                       $CMK_LIBS -lm)
735     endif
736     rm -f CHARMC-PRE.TMP.nm
737     strings -a CHARMC-PRE.TMP.xxx | awk '/^charmc autoinit / { print $3; }' > CHARMC-PRE.TMP.nm
738     sort < CHARMC-PRE.TMP.nm | uniq > CHARMC-MOD.TMP.dat
739     echo 'Charm Modules: '`cat CHARMC-MOD.TMP.dat`
740     rm -f CHARMC-MOD.TMP.c
741     awk '{print "extern void _CK_"$1"_init();";}' < CHARMC-MOD.TMP.dat >> CHARMC-MOD.TMP.c
742     echo '_CK_module_init_fn()' >> CHARMC-MOD.TMP.c
743     echo '{' >> CHARMC-MOD.TMP.c
744     awk '{print "_CK_"$1"_init();";}' < CHARMC-MOD.TMP.dat >> CHARMC-MOD.TMP.c
745     echo '}' >> CHARMC-MOD.TMP.c
746     ($ECHOCMD ; $CMK_CC $OPTS_CC -c CHARMC-MOD.TMP.c)
747     if ($status) goto failure
748 endif
749
750 ###############################################################################
751 #
752 #                               Finally, LINK
753 #
754 ###############################################################################
755
756 switch ($LANGUAGE)
757     case "charm"
758         ($ECHOCMD ; $CMK_LD $OPTS_LD -o $OBJECT -L$CHARMLIB \
759                       CHARMC-MOD.TMP.o $BAL_OBJ $OBJECTFILES \
760                       $LIBRARIES -lck-core -lcharm -lck-trace-$TRACEMODE \
761                       -lck-cplus-n -lconv-cplus-n -lconv-core -lck-defmain-std\
762                       $CMK_LIBS -lm)
763         breaksw
764     case "charm++"
765         ($ECHOCMD ; $CMK_LDXX $OPTS_LDXX -o $OBJECT -L$CHARMLIB \
766                       CHARMC-MOD.TMP.o $BAL_OBJ $OBJECTFILES \
767                       $LIBRARIES -lck-core -lcharm -lck-trace-$TRACEMODE \
768                       -lck-cplus-y -lconv-cplus-y -lconv-core -lck-defmain-cpp\
769                       $CMK_LIBS -lm)
770         breaksw
771     case "converse"
772         ($ECHOCMD ; $CMK_LD $OPTS_LD -o $OBJECT -L$CHARMLIB \
773                       $OBJECTFILES $LIBRARIES -lconv-cplus-n -lconv-core\
774                       $CMK_LIBS -lm)
775         breaksw
776     case "converse++"
777         ($ECHOCMD ; $CMK_LDXX $OPTS_LDXX -o $OBJECT -L$CHARMLIB \
778                       $OBJECTFILES $LIBRARIES -lconv-cplus-y -lconv-core \
779                       $CMK_LIBS -lm)
780         breaksw
781 endsw
782
783 ########################################################################
784 #
785 # Copy conv-host to user directory if it is present in installation.
786 #
787 ########################################################################
788
789 if (-e $CHARMBIN/conv-host) then
790     /bin/rm -f conv-host
791     /bin/ln -s $CHARMBIN/conv-host conv-host
792 endif
793
794 ########################################################################
795 #
796 # copyobj: if -cp specified, copy the resulting output file.
797 #
798 ########################################################################
799
800 copyobj:
801
802 foreach x ($COPIES)
803     if ($x != $OBJECT) then
804         set COPY=$x
805         if (-d $COPY) set COPY=$COPY/$OBJECT
806         ($ECHOCMD ; /bin/rm -f $COPY ; /bin/cp $OBJECT $COPY)
807     endif
808 end
809
810 goto success
811
812 ########################################################################
813 #
814 # Clean up files and exit
815 #
816 ########################################################################
817
818 success:
819
820     set STATUS=0
821     goto end
822
823 failure:
824
825     echo 'charmc: aborting.'
826     set STATUS=1
827     goto end
828
829 end:
830
831     if ($?SAVE == 0) then
832         foreach FILE ($FILES)
833             set BASE=$FILE:r
834             set TMP=$BASE:t.TMP
835             /bin/rm -f $TMP.P.C $TMP.cpp $TMP.space $TMP.xlat $TMP.o
836             /bin/rm -f $TMP.c $TMP.c.0.h $TMP.c.1.h $TMP.c.2.h
837             /bin/rm -f $TMP.i $TMP.$CMK_CPP_SUFFIX
838         end
839         rm -f core $DELETE
840     endif
841     exit ($STATUS)