Avoid building user-driven-interop example on non-LRTS layers
[charm.git] / build
1 #!/bin/sh
2
3 # Silly shorthand, used for source reorganization
4 if [ $(dirname $0) = "." ]
5 then
6   srcbaseabs="./src"
7   srcbase="../../src"
8 else
9   srcbaseabs="$(cd $(dirname $0)/src/; pwd)"
10   srcbase=$srcbaseabs
11 fi
12 src="$srcbaseabs/arch/"
13
14 more=0
15
16 syntax() {
17   echo ''
18   echo 'Usage: build <target> <version> <options> [charmc-options ...]'
19   echo ''
20   echo '<targets>: converse charm++ LIBS AMPI charm4py bigemulator msa'
21   echo '<targets>: doc ps-doc pdf-doc html-doc'
22   if test $more = 1
23   then
24   echo ''
25   echo '  charm++         compile Charm++ core only'
26   echo '  AMPI            compile Adaptive MPI on top of Charm++'
27   echo '  LIBS            compile additional parallel libraries with Charm++ core'
28   echo '  charm4py        compile shared library version of Charm++ for charm4py'
29   echo '  bigemulator     build additional BigSim libraries'
30   echo '  msa             build Multiphase Shared Arrays(MSA) library'
31   echo '  Tau             build the TAU tracing library for generating TAU performance data' 
32   echo '  ChaNGa          compile Charm++ core and necessary libraries for ChaNGa'
33   echo '  everylb         compile EveryLB suite of load balancing strategies'
34   echo ''
35   fi
36   echo '<versions>: ' 
37   ( cd $src ; ls -1 | egrep -v '(^shmem$)|(^mpi$)|(^sim$)|(^netlrts?$)|(^multicore$)|(^util$)|(^common$)|(^uth$)|(^conv-mach-fix.sh$)|(^win64$)|(^(gemini_)?gni$)|(^pami(lrts)?$)|(^verbs$)|(^ofi$)|(^template$)|(^cuda$)' | pr -3 -t )
38   echo ''
39   echo '<options>: compiler and platform specific options'
40   echo 'icc iccstatic xlc xlc64 gcc clang pgcc cc mpicxx'
41   echo 'help smp omp tcp bigemulator ooc syncft mlogft causalft papi pthreads'
42   echo '--incdir --libdir --basedir --build-shared --destination --suffix -j'
43   if test $more = 1
44   then
45   echo ''
46   echo 'For platform specific options, use help option:'
47   echo '  help            platform specific help, e.g. ./build charm++ netlrts-linux-x86_64 help'
48   echo ''
49   echo 'Choose a compiler (only one option is allowed from this section):'
50   echo '  icc, iccstatic  Intel compilers (default or static linking)'
51   echo '  xlc, xlc64      IBM XL compilers (with 64-bit option on architectures with 32-bit modes)'
52   echo '  gcc             GNU compiler collection (on platforms where the default differs)'
53   echo '  clang           Clang C/C++ compiler (including bgclang)'
54   echo '  pgcc            Portland Group compilers'
55   echo ''
56   echo 'Choose an alternative fortran compiler (only one option is allowed from this section):'
57   echo '  gfortran        GNU Fortran compiler'
58   echo '  flang           Flang Fortran compiler'
59   echo '  xlf             IBM XL Fortran compiler'
60   echo '  ifort           Intel Fortran compiler'
61   echo "  pgf90           Portland Group Fortran compiler"
62   echo ''
63   echo 'Platform specific options (choose multiple if apply):'
64   echo '  smp             support for SMP, multithreaded charm on each node'
65   echo '  omp             support for the integrated LLVM OpenMP runtime'
66   echo '  tcp             use TCP sockets for communication (only for netlrts)'
67   echo '  pthreads        compile with pthreads Converse threads'
68   echo ''
69   echo 'Advanced options:'
70   echo '  bigemulator     compile for BigSim simulator'
71   echo '  ooc             compile with out of core support'
72   echo '  syncft          compile with Charm++ fault tolerance support'
73   echo '  mlogft          compile with Charm++ message logging fault tolerance support'
74   echo '  papi            compile with PAPI performance counter support (if any)'
75   echo ''
76   echo "Charm++ dynamic libraries:"
77   echo "  --no-build-shared  don't build Charm++'s shared libraries (default)"
78   echo "  --build-shared     build Charm++ dynamic libraries (.so) "
79   echo ''
80
81
82   echo 'Enable/disable features:'
83   configure_ac="$srcbaseabs/scripts/configure.ac"
84   parameter_regex='\([-A-Za-z0-9_=/ ]*\)'
85   description_regex='\([-A-Za-z0-9_=/ ()\\]*\)'
86
87   # Isolate the sections of configure.ac on which we want to operate. This command uses sed's p command which gives a result similar to grep.
88   # This is because grep cannot operate on multiple lines. GNU grep can do this using "-z", but it is not portable to BSD grep as found on macOS.
89   help_string_source="$(sed -n "/AS_HELP_STRING(\[${parameter_regex}\],/,/ *\[${description_regex}\])/p" "$configure_ac")"
90
91   # This regex matches the AS_HELP_STRING entries in configure.ac.
92   # It looks messy at the end due to matching square brackets (which must be escaped), commas, and an unrelated token on the same line (a BSD sed concession).
93   help_item_regex=" *\[AS_HELP_STRING(\[${parameter_regex}\],\n *\[${description_regex}\]) *\]*[, []*[a-z=_]*\]*[, ]*"
94   # "\1" is the parameter and "\2" is the description; use printf to left-justify the parameter.
95   help_output_print='printf "  %-30s \2\\\\n" "\1"'
96   # The remaining sed syntax allows us to perform a substitution over two successive lines instead of only one.
97   help_items="$(echo "$help_string_source" | sed -n "1h; 1!H; \${ g; s:${help_item_regex}:${help_output_print}:g p; }")"
98   # With the AS_HELP_STRING entries replaced with printf commands, evaluate the result.
99   eval "$help_items"
100   printf "  %-30s %s\n" "--with-production" "build Charm++ with all optimizations for maximum performance, and disabling all above features"
101
102   # Test that the above regular expressions are sufficient to capture all help strings.
103   num_help_strings="$(grep -c AS_HELP_STRING "$configure_ac")"
104   num_help_items="$(echo "$help_items" | wc -l)"
105   if [ $num_help_strings != $num_help_items ]; then
106     echo '<Warning>: Not all parameters were able to be displayed. Please notify the Charm++ developers at charm@cs.illinois.edu.'
107   fi
108
109
110   echo ''
111   echo 'Miscellaneous options:'
112   echo '  --incdir=DIR        specify additional include path for compiler'
113   echo '  --libdir=DIR        specify additional lib path for compiler'
114   echo '  --basedir=DIR       shortcut for the above two - DIR/include and DIR/lib'
115   echo '  -j[N]               parallel make, N is the number of parallel make jobs'
116   echo "  --with-lbtime-type  specify real type for the load balancing timers"
117   echo "  --destination=DIR   build Charm++ inside DIR, by default the destination is <version>"
118   echo "  --suffix=DIR        append DIR to the destination directory of the Charm++ build"
119   echo "  --tau-makefile=FILE Specify which TAU stub makefile to use"
120   fi
121   echo ''
122   echo '<charmc-options>: normal compiler options e.g. -g -optimize -save -verbose'
123   if test $more = 1
124   then
125   echo ''
126   echo 'Examples:'
127   echo "1. display all supported options for netlrts-linux-x86_64 using 'help':"
128   echo '  ./build charm++ netlrts-linux-x86_64 help'
129   echo '2. compile Charm++ on Linux with all available tuning:'
130   echo '  ./build charm++ netlrts-linux-x86_64 --with-production'
131   echo '3. compile Charm++ for Linux with Intel compiler and optimizations:'
132   echo '  ./build charm++ netlrts-linux-x86_64 icc -optimize'
133   echo '4. compile Charm++ for Windows with VC++:'
134   echo '  ./build charm++ netlrts-win-x86_64 -optimize'
135   echo '5. compile Charm++ with MPI that is installed at /usr/local/mpich:'
136   echo '  ./build charm++ mpi-linux-x86_64 --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -optimize'
137   echo '   or in short,'
138   echo '  ./build charm++ mpi-linux-x86_64 --basedir /usr/local/mpich -optimize'
139   echo '  ./build Tau --tau-makefile=/usr/local/packages/TAU/x86_64/lib/Makefile.tau-mpi'
140   echo ''
141   echo 'Note: This script:'
142   echo ' 1. Creates directories <destination> and <destination>/tmp'
143   echo ' 2. Copies src/scripts/Makefile into <destination>/tmp'
144   echo ' 3. Does a "make basics" in <destination>/tmp.'
145   echo ' 3. Does a "make -jN <target> <version> OPTS=<charmc-options>" in <destination>/tmp.'
146   echo "That's all build does.  The rest is handled by the Makefile."
147   echo ''
148   echo 'Thank you for using Charm++, please send questions or comments to '
149   echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
150   echo '(email: charm@cs.illinois.edu).'
151
152   else
153   echo ''
154   echo "To get more detailed help, run ./build --help"
155   fi
156 }
157
158 Echo() {
159     [ "x$QUIET" = "x--quiet" ] || echo $*
160 }
161
162 printOption() {
163   for prefix in cc conv-mach
164   do
165     str="Supported compilers:"
166     [ "$prefix" = "conv-mach" ] && str="Supported options:"
167     opts=""
168     for dir in $OPT_DIRS
169     do
170 #         echo "Checking for $prefix in $dir"
171           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
172           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
173     done 
174     tmp=.tmp.$$
175     rm -f $tmp; touch $tmp
176     for o in $opts
177     do
178       echo $o >> $tmp
179     done
180     opts=`sort $tmp | uniq`
181     rm -f $tmp
182     echo $str $opts
183   done
184   exit 1
185 }
186
187 CheckDir() {
188   for d in $*
189   do
190     if test ! -d $d
191     then
192       echo Error: cannot find $d!
193       exit 1
194     fi
195   done
196 }
197
198 TestIfCompiler() {
199   compilerName=`echo $1 | sed 's/-[0-9\.][0-9\.]*$//'`
200   for dir in $OPT_DIRS
201   do
202     [ -f $dir/cc-$compilerName.sh ] && return 1
203   done  
204   return 0
205 }
206
207 TestIfOption() {
208   for dir in $OPT_DIRS
209   do
210     [ -f $dir/conv-mach-$1.h ] && return 1 
211   done
212   
213   echo "Error> option: $1 is not supported in this version!"; 
214   printOption
215 }
216
217
218 # start
219
220 BUILD_CUDA=0
221 MAKEOPTS=""
222 OPTS=""
223 BOPTS=""
224 MORE=""
225 COMPILER=""
226 BASEDIR=
227 LIBDIR=
228 INCDIR=
229 ARCH=
230 BUILD_SHARED=""             # default no shared lib
231 WITH_ROMIO="true"           # default to building ROMIO on AMPI
232 WITH_PRODUCTION=
233 BUILD_EMULATOR=0
234 DESTINATION=""
235 DESTINATION_SUFFIX=""
236 TAU_MAKEFILE=""
237 QUIET=""
238 BUILD_OMP=0
239 ONLY_CONFIGURE=
240
241 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | ( less || more ) && exit 1
242 [ $# -lt 2 ] && $(dirname "$0")/smart-build.pl && exit 1
243 PROGRAM=$1
244 shift
245
246 # find longest prefix of version argument that exists as a directory in $src
247 VERSION="$1"
248 VERSOPTS=""
249 testversion=""
250 oldifs="$IFS"
251 IFS="-"
252 for w in $1; do
253   IFS="$oldifs"
254   if [ -z "$testversion" ]; then
255     testversion="$w"
256   else
257     testversion="$testversion-$w"
258   fi
259   if [ -d $src/$testversion ]; then
260     VERSION="$testversion"
261     VERSOPTS=""
262   else
263     VERSOPTS="$VERSOPTS $w"
264   fi
265 done
266 if [ "$VERSION" = "$1" ]; then VERSOPTS=""; fi
267
268 BASEVERSION="$VERSION"
269 if test -f $src/$BASEVERSION/vdir_link
270 then
271   BASEVERSION=`cat $src/$BASEVERSION/vdir_link`
272 fi
273 ARCH=`echo $BASEVERSION | sed -e 's@-.*@@'`
274 shift
275
276 #echo $src
277 #echo $BASEVERSION
278 #echo $ARCH
279
280 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
281
282 # process remainder of version argument as options, copied from below
283 for w in $VERSOPTS; do
284   # This has to be a build-time option (like "smp")
285         TestIfCompiler $w
286         if [ $? -eq 1 ] 
287         then
288   # It specifies a compiler:
289           if [ ! -z "$COMPILER" ] 
290           then
291               echo "Error> Tried to specify two compilers: $COMPILER and $w"
292               printOption
293           fi
294           COMPILER=$w
295         else
296   # It specifies some other option:
297           TestIfOption $w
298           BOPTS="$BOPTS $w"
299           [ $w =  "bigemulator" ] && BUILD_EMULATOR=1
300           [ $w =  "bigsim" ] && BUILD_EMULATOR=1
301           [ $w =  "cuda"   ] && BUILD_CUDA=1
302         fi
303 done
304
305 while [ ! $# -eq 0 ]
306 do
307   case "$1" in
308     "--basedir")
309                 shift; 
310                 for dir in $1
311                 do
312                   CheckDir $dir/include $dir/lib
313                   LIBDIR="$LIBDIR -L$dir/lib";
314                   INCDIR="$INCDIR -I$dir/include"
315                 done
316                 shift
317                 ;;
318     --basedir=*)
319                 basedir=`echo $1 | awk -F= '{print $2}'`
320                 for dir in $basedir
321                 do
322                   CheckDir $dir/include $dir/lib
323                   LIBDIR="$LIBDIR -L$dir/lib";
324                   INCDIR="$INCDIR -I$dir/include"
325                 done
326                 shift
327                 ;;
328     "--libdir")
329                 shift; CheckDir $1
330                 for dir in $1
331                 do
332                   LIBDIR="$LIBDIR -L$dir"; 
333                 done
334                 shift
335                 ;;
336     --libdir=*)
337                 libdir=`echo $1 | awk -F= '{print $2}'`
338                 CheckDir $libdir
339                 for dir in $libdir
340                 do
341                   LIBDIR="$LIBDIR -L$dir"; 
342                 done
343                 shift
344                 ;;
345     "--incdir")
346                 shift; CheckDir $1
347                 for dir in $1
348                 do
349                   INCDIR="$INCDIR -I$dir"; 
350                 done
351                 shift
352                 ;;
353     --incdir=*)
354                 incdir=`echo $1 | awk -F= '{print $2}'`
355                 CheckDir $incdir
356                 for dir in $incdir
357                 do
358                   INCDIR="$INCDIR -I$dir"; 
359                 done
360                 shift
361                 ;;
362     --no-build-shared|--no-shared)
363                 BUILD_SHARED='';
364                 shift
365                 ;;
366     --build-shared)
367                 BUILD_SHARED="-build-shared"; 
368                 shift
369                 ;;
370     --with-romio)
371                 WITH_ROMIO="true"; shift
372                 ;;
373     --without-romio)
374                 WITH_ROMIO=""; shift
375                 ;;
376     --with-production)
377                 WITH_PRODUCTION="true" 
378                 shift
379                 ;;
380     --with-*)
381                 CONFIG_OPTS="$CONFIG_OPTS $1"
382                 shift
383                 ;;
384     --without-*)
385                 CONFIG_OPTS="$CONFIG_OPTS $1"
386                 shift
387                 ;;
388     --destination)
389                 shift
390                 DESTINATION="$1"
391                 shift
392                 ;;
393     --destination=*)
394                 DESTINATION="`echo $1 | awk -F= '{print $2}'`"
395                 shift
396                 ;;
397     --suffix)
398                 shift
399                 DESTINATION_SUFFIX="$1"
400                 shift
401                 ;;
402     --suffix=*)
403                 DESTINATION_SUFFIX="`echo $1 | awk -F= '{print $2}'`"
404                 shift
405                 ;;
406     --tau-makefile)
407                 TAU_MAKEFILE=$1
408                 shift
409                 ;;
410     --tau-makefile=*)
411                 TAU_MAKEFILE=`echo $1 | awk -F= '{print $2}'`
412                 shift
413                 ;;
414     --quiet)
415                 MAKEOPTS="$MAKEOPTS --quiet"
416                 QUIET="--quiet"
417                 shift;
418                 ;;
419     --only-configure)
420                 ONLY_CONFIGURE="true"
421                 shift
422                 ;;
423     --enable-tracing|--enable-tracing=*)
424                 CONFIG_OPTS="$CONFIG_OPTS $1"
425                 ENABLE_TRACING=yes
426                 shift
427                 ;;
428     --enable-*)
429                 CONFIG_OPTS="$CONFIG_OPTS $1"
430                 shift
431                 ;;
432     --disable-*)
433                 CONFIG_OPTS="$CONFIG_OPTS $1"
434                 shift
435                 ;;
436     -j*)
437                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
438                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
439                 shift;
440                 ;;
441     -k|--keep-going)
442                 MAKEOPTS="$MAKEOPTS $1"
443                 shift;
444                 ;;
445     -*) 
446         # Compiler option (like -g or -Dfoo), copy it over
447         OPTS="$OPTS $1"
448         shift
449           ;;
450     "help")
451         printOption
452         ;;
453     *)
454 # This has to be a build-time option (like "smp")
455         TestIfCompiler $1
456         if [ $? -eq 1 ] 
457         then
458 # It specifies a compiler:
459           if [ ! -z "$COMPILER" ] 
460           then
461               echo "Error> Tried to specify two compilers: $COMPILER and $1"
462               printOption
463           fi
464           COMPILER=$1
465         else
466 # It specifies some other option:
467           TestIfOption $1
468           BOPTS="$BOPTS $1"
469           [ $1 =  "bigemulator" ] && BUILD_EMULATOR=1
470           [ $1 =  "bigsim" ] && BUILD_EMULATOR=1
471           [ $1 =  "cuda"   ] && BUILD_CUDA=1
472         fi
473         shift
474         ;;
475   esac
476 done
477
478 if [ $BUILD_CUDA -eq 1 ]; then
479   HAVE_CUDA="no"
480   echo "checking for CUDA toolkit directory"
481   CUDA_PRESET_DIRS="/usr/local/cuda /usr/lib/nvidia-cuda-toolkit"
482   CUDA_CANDIDATE_DIRS="$CUDATOOLKIT_HOME $CUDA_PRESET_DIRS"
483   for dir in $CUDA_CANDIDATE_DIRS; do
484     if test -d "$dir"; then
485       CUDA_DIR="$dir"
486       HAVE_CUDA="yes"
487       echo "CUDA_DIR=$CUDA_DIR"
488       break
489     fi
490   done
491   if [ "$HAVE_CUDA" = "no" ]; then
492     echo "Error> no CUDA toolkit found, searched \$CUDATOOLKIT_HOME $CUDA_PRESET_DIRS"
493     exit 1
494   fi
495 fi
496
497 [ "x$VERSION" = "x" ] && syntax && exit 1
498
499 if [ "x_$ARCH" = "x_net" ]; then
500   echo "Error: net-* has been removed, please use netlrts or verbs.";
501   exit 1;
502 fi
503
504 #Check if building verbs on Omni-Path 
505 if [ "x_$ARCH" = "x_verbs" ] && type /usr/sbin/opafabricinfo >/dev/null 2>&1; then
506   echo "WARNING: Detected Omni-Path diagnostic tools.";
507   echo "Verbs on Omni-Path architectures is not well supported: please use an OFI build instead.";
508 fi 
509
510 if test -n "$WITH_PRODUCTION" -a $BUILD_EMULATOR -eq 1 -a -z "$ENABLE_TRACING"
511 then
512   echo "Error: bigemulator requires tracing modules, --with-production must be used with --enable-tracing"
513   exit 1
514 fi
515
516 if [ -z "$MAKE" ] 
517 then
518   # prefer gmake
519   MAKE=`which gmake 2>/dev/null`
520   [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE='make'
521 fi
522
523 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
524 then
525   echo "Error> build can not find arch: $BASEVERSION!"
526   exit 1
527 fi
528
529 if [ ! -f "$srcbaseabs/scripts/configure" ]
530 then
531   if ! command -v autoreconf >/dev/null 2>&1 || ! command -v aclocal >/dev/null 2>&1
532   then
533     echo "Error> autoconf and automake are not installed."
534     exit 1
535   fi
536 fi
537
538 #generate header for uFcontext for the target VERSION
539 UFCONTEXT_HEADER_NAME=
540 if test `echo "$BASEVERSION" | grep -c "darwin"` -gt 0
541 then
542   UFCONTEXT_HEADER_NAME="macho_gas"
543 elif test `echo "$BASEVERSION" | grep -c "win"` -gt 0
544 then
545   UFCONTEXT_HEADER_NAME="windows"
546 else
547   UFCONTEXT_HEADER_NAME="elf_gas"
548 fi
549
550 if test `echo "$BASEVERSION" | grep -c "arm7"` -gt 0
551 then
552   UFCONTEXT_HEADER_NAME="arm_aapcs_${UFCONTEXT_HEADER_NAME}"
553 elif test `echo "$BASEVERSION" | grep -c "arm8"` -gt 0
554 then
555   UFCONTEXT_HEADER_NAME="arm64_aapcs_${UFCONTEXT_HEADER_NAME}"
556 elif test `echo "$BASEVERSION" | grep -c "mips"` -gt 0
557 then
558   UFCONTEXT_HEADER_NAME="mips32_o32_${UFCONTEXT_HEADER_NAME}"
559 elif test `echo "$BASEVERSION" | grep -c "bluegene\|pami\|ppc"` -gt 0
560 then
561   UFCONTEXT_HEADER_NAME="ppc64_sysv_${UFCONTEXT_HEADER_NAME}"
562 elif test `echo "$BASEVERSION" | grep -c "cray\|x86_64\|linux64\|amd64"` -gt 0
563 then
564   UFCONTEXT_HEADER_NAME="x86_64_sysv_${UFCONTEXT_HEADER_NAME}"
565 else
566   UFCONTEXT_HEADER_NAME="i386_sysv_${UFCONTEXT_HEADER_NAME}"
567 fi
568
569 #generate VERSION name combining all the build-time options.
570 if [ -n "$BOPTS" -o -n "$COMPILER" ]
571 then
572   echo "Selected Compiler: $COMPILER"
573
574   if test -n "$COMPILER" -a `echo "$BASEVERSION" | grep -c "cray\|gni\|gemini"` -gt 0
575   then
576     echo "Inserted explicit compiler options on Cray systems. Use compiler wrappers by loading PrgEnv-*"
577     echo "e.g.) module load PrgEnv-* (e.g. cray for cce, gnu for gcc, intel for icc, and pgi for pgcc)"
578     echo "      ./build charm++ $BASEVERSION <other build options>"
579     echo "Charm++ uses the compiler wrapper 'CC' specified by the Cray system. Don't use explicit compiler options on Cray systems."
580     exit 1
581   fi
582
583   if test `echo "$BOPTS" | grep -c "omp"` -gt 0 -a `echo "$BASEVERSION" | grep -c "darwin"` -gt 0
584   then
585     if test -z "$COMPILER" -o "$COMPILER" != "gcc"
586     then
587       echo "The integrated OpenMP runtime library is supported on Mac only with the normal gcc"
588       echo "You need to install this normal (non-clang) gcc via MacPorts or Homebrew"
589       echo "Read the instructions on the Charm++ manual."
590       exit 1
591     fi
592   fi
593   echo "Selected Options: $BOPTS"
594   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
595   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
596   for i in $BOPTS_WITHCOMPILER
597   do
598     VERSION=$VERSION-$i
599   done
600 fi
601
602 #echo "|$DESTINATION|$DESTINATION_SUFFIX|"
603
604 if [ -z "$DESTINATION" ]
605 then
606   DESTINATION="$VERSION"
607 fi
608
609 if [ $(dirname $DESTINATION) != "." ]
610 then
611   srcbaseabs="$(cd $srcbaseabs; pwd)"
612   srcbase=$srcbaseabs
613   src="$srcbaseabs/arch/"
614 fi
615
616 if [ -n "$DESTINATION_SUFFIX" ]
617 then
618   DESTINATION="$DESTINATION-$DESTINATION_SUFFIX"
619 fi
620
621 # make sure $DESTINATION is more than '/' characters, because we `rm -rf` it
622 if [ -z "${DESTINATION#"${DESTINATION%%[!/]*}"}" ]
623 then
624   echo 'Error: $DESTINATION is the filesystem root.'
625   exit 1
626 fi
627
628 if test -n "$BOPTS"
629 then
630     # pxshm+smp note: When combining the 'smp' and 'pxshm' directives, it is
631     #                 important that they be included in $ConvHeader in that
632     #                 exact order. See bug #717.
633     MYTMP=""
634     HAS_PXSHM=0
635     HAS_SMP=0
636     for i in $BOPTS; do
637       if [ "$i" = "smp" ]; then
638         HAS_SMP=1
639       elif [ "$i" = "pxshm" ]; then
640         HAS_PXSHM=1
641       elif [ "$i" = "omp" ]; then
642         BUILD_OMP=1
643         MYTMP="$MYTMP $i"
644       else
645         MYTMP="$MYTMP $i"
646       fi
647     done
648     if [ $HAS_PXSHM -eq 1 ]; then
649       MYTMP="pxshm $MYTMP"
650     fi
651     if [ $HAS_SMP -eq 1 ]; then
652       MYTMP="smp $MYTMP"
653       if [ $BUILD_OMP -eq 1 ]; then
654         CONFIG_OPTS="--enable-task-queue $CONFIG_OPTS"
655       fi
656     elif [ $BUILD_OMP -eq 1 ]; then
657       BUILD_OMP=2 #this means omp keyword inserted without smp keyword"
658     fi
659 fi
660
661 # build for Charm4py
662 if [ "$PROGRAM" = "charmpy" ] || [ "$PROGRAM" = "charm4py" ]; then
663
664     if [ -n "$BOPTS" ] && [ "$HAS_SMP" -eq 1 ]; then
665         echo "Error: SMP mode is currently not supported with charm4py. Choose a non-smp version."
666         exit 1
667     fi
668
669     if [ `echo "$BASEVERSION" | grep -c "multicore"` -gt 0 ]; then
670         echo "Error: multicore is currently not supported with charm4py. Choose a non-smp version."
671         exit 1
672     fi
673
674     if test `echo "$CONFIG_OPTS" | grep -c "\--enable-charmpy"` -eq 0
675     then
676         CONFIG_OPTS="$CONFIG_OPTS --enable-charmpy"
677     fi
678
679     if test `echo "$BASEVERSION" | grep -c "win"` -gt 0
680     then
681         BUILD_SHARED=""
682     else
683         BUILD_SHARED="-build-shared"
684     fi
685 fi
686
687 if test -n "$WITH_PRODUCTION"
688 then
689     # Prepend optimize so that an explicit -no-optimize still works
690     OPTS="-optimize -production $OPTS"
691     CONFIG_OPTS="--disable-controlpoint --disable-tracing --disable-tracing-commthread --disable-charmdebug --disable-replay --disable-error-checking --disable-stats $CONFIG_OPTS"
692 fi
693
694 # build with Tau
695 WITH_TAU=0
696 if [ "$PROGRAM" = "Tau" ]
697 then
698         Echo "TAU>>>> makefile config option: $TAU_MAKEFILE"
699         if [ -n "$TAU_MAKEFILE" -a -f $TAU_MAKEFILE ]
700         then
701           #Setting up TAU trace library:
702           Echo "TAU>>>> configuring with this TAU makefile: $TAU_MAKEFILE"
703
704           WITH_TAU=1
705         else
706           Echo "TAU>>>> ERROR could not find Makefile: $TAU_MAKEFILE, ignored"
707           TAU_MAKEFILE=""
708         fi
709 fi
710
711 if [ "$PROGRAM" = "ChaNGa" ]
712 then
713   #Setting lbuserdata when the build is ChaNGa
714   CONFIG_OPTS="--enable-lbuserdata $CONFIG_OPTS"
715 fi
716
717 if test $BUILD_EMULATOR = 1
718 then
719   # export BIGSIM so that make targets can depend on it
720   MAKEOPTS="$MAKEOPTS BIGSIM=bigsim"
721   PROGRAM="$PROGRAM bigsim"
722 fi
723
724 if [ $BUILD_OMP = 2 ]
725 then
726   case $DESTINATION in
727     "multicore"*)
728       BUILD_OMP=1
729       ;;
730     *)
731       echo "OpenMP support should be built in SMP mode"
732       exit 1
733       ;;
734   esac
735 fi
736
737 # ===================================================
738 # ---------- begin file structure creation ----------
739 # ===================================================
740
741 if [ -f "$DESTINATION/tmp/basics" ]
742 then
743   Echo "File structure already created; skipping directly to make"
744 else
745
746 for d in bin doc examples include lib lib_so tests tmp; do
747   rm -rf "$DESTINATION/$d"
748 done
749
750 Echo "Creating dir: $DESTINATION"
751 Echo "Creating dir: $DESTINATION/tmp"
752 mkdir -p "$DESTINATION/tmp"
753
754 echo "TARGET=${UFCONTEXT_HEADER_NAME}" > $DESTINATION/tmp/uFcontext.mk
755
756 # Create the bin, lib, include, etc. links:
757 WINNAME=`echo $VERSION | awk -F- '{print $2}'`
758 if [ "x_$WINNAME" = "x_win64" -o "x_$WINNAME" = "x_win" ]
759 then
760 #Win64 version needs special compilers and *copied* (not linked)
761 # source files.
762         cp $src/win/system_ln $DESTINATION/tmp
763         cp $src/win/unistd.h $DESTINATION/tmp
764         echo "Compiling createlink.cpp ..."
765         case "$COMPILER" in
766                 gcc*|clang*)
767                         createlinkcc="$COMPILER"
768                         ;;
769                 *)
770                         createlinkcc="./unix2nt_cc"
771                         ;;
772         esac
773         (cd $src/win; $createlinkcc -c createlink.cpp -o createlink.o -D_WIN32_WINNT=0x0500; $createlinkcc createlink.o -o createlink.exe)
774
775         if test ! -x $src/win/createlink.exe
776         then
777                 echo "VC++ is not properly installed!"
778                 exit 1
779         fi
780         chmod +x $DESTINATION/tmp/system_ln
781         cp $src/win/gathertree.local   $DESTINATION/tmp
782         cp $src/win/gatherflat.local   $DESTINATION/tmp
783 else
784         cat > $DESTINATION/tmp/system_ln <<EOF
785 #!/bin/sh
786 ln -f -s \$@
787 EOF
788   chmod +x $DESTINATION/tmp/system_ln
789   newdirlist='bin lib'
790   [ -n "$BUILD_SHARED" ] && newdirlist="$newdirlist lib_so"
791   newdirlist="$newdirlist include tmp"
792   for newdir in $newdirlist
793   do
794     Echo "Soft-linking over $newdir"
795     if [ -r $newdir ]
796     then
797       rm -fr $newdir || exit 1
798     fi
799     $DESTINATION/tmp/system_ln $DESTINATION/$newdir $newdir
800   done
801   rm -f VERSION
802   $DESTINATION/tmp/system_ln $DESTINATION/include/VERSION VERSION
803 fi
804
805 Echo "Copying src/scripts/Makefile to $DESTINATION/tmp"
806 $DESTINATION/tmp/system_ln "$srcbase/scripts/Make.depends" $DESTINATION/tmp/Make.depends
807 $DESTINATION/tmp/system_ln "$srcbase/scripts/Make.cidepends" $DESTINATION/tmp/Make.cidepends
808 if test -f "$srcbaseabs/ck-ldb/Make.lb"
809 then
810 $DESTINATION/tmp/system_ln "$srcbase/ck-ldb/Make.lb" $DESTINATION/tmp/Make.lb
811 else
812 touch $DESTINATION/tmp/Make.lb
813 fi
814 $DESTINATION/tmp/system_ln "$srcbase/scripts/Makefile" $DESTINATION/tmp/Makefile
815 $DESTINATION/tmp/system_ln "$srcbase/scripts/Make.tau" $DESTINATION/tmp/Make.tau
816 $DESTINATION/tmp/system_ln "$srcbase/scripts/Make.gpu" $DESTINATION/tmp/Make.gpu
817 touch $DESTINATION/tmp/Makefile.machine
818 touch $DESTINATION/tmp/Make.extlib
819
820 ConvUsr="$DESTINATION/tmp/conv-mach-pre.sh"
821 Echo "Generating $ConvUsr"
822 echo > $ConvUsr
823 if test -n "$LIBDIR" 
824 then
825   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
826 fi
827 if test -n "$INCDIR" 
828 then
829   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
830   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
831 fi
832 chmod +x $ConvUsr
833
834 # Create conv-mach-opt headers with special build-time options
835 ConvHeader="$DESTINATION/tmp/conv-mach-opt.h"
836 ConvSh="$DESTINATION/tmp/conv-mach-opt.sh"
837 ConvMak="$DESTINATION/tmp/conv-mach-opt.mak"
838 if [ ! -f "$ConvSh" -o ! -f "$ConvHeader" -o ! -f "$ConvMak" ]
839 then
840   Echo "Generating $ConvHeader, conv-mach-opt.sh, conv-mach-opt.mak"
841   echo '/* Build-time options header, automatically generated by charm/build */' > $ConvHeader
842   echo '# Build-time options header, automatically generated by charm/build' > $ConvSh
843   echo '# Build-time options header, automatically generated by charm/build' > $ConvMak
844   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
845 fi
846 if test -n "$COMPILER"
847 then
848       i=`echo $COMPILER | sed 's/-[0-9\.][0-9\.]*$//'`
849       echo "CMK_COMPILER_SUFFIX=${COMPILER#$i}" >> $ConvSh
850       echo '#include "'cc-$i.h'"' >> $ConvHeader
851       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
852 elif test `echo "$BASEVERSION" | grep -c "bluegeneq"` -gt 0
853 then
854       i="clang"
855       bgclang++11 --version
856       if [ $? -ne 0 ]; then
857          echo "ERROR: bgclang C/C++ compiler missing. Please load bgclang compilers, i.e. 'soft add +mpiwrapper-bgclang'."
858          exit 1
859       fi
860       echo '#include "'cc-$i.h'"' >> $ConvHeader
861       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
862 fi
863 if test -n "$MYTMP"
864 then
865     BOPTS=$MYTMP
866     for i in $BOPTS
867     do
868       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
869       if [ $BUILD_CUDA -eq 1 ]; then
870         echo 'CUDA_DIR="'$CUDA_DIR'"'>>$ConvSh
871         echo "CUDA_DIR:=$CUDA_DIR" >> $ConvMak
872       fi
873       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
874     done
875 fi
876
877 if test  "$BUILD_SHARED"  = "-build-shared"
878 then
879     echo "CMK_NO_BUILD_SHARED=false" >> $ConvSh
880     echo "CMK_NO_BUILD_SHARED:=false" >> $ConvMak
881 else
882     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
883     echo "CMK_NO_BUILD_SHARED:=true" >> $ConvMak
884 fi
885
886 if test  -n "$WITH_ROMIO" 
887 then
888     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
889     echo "CMK_AMPI_WITH_ROMIO:=true" >> $ConvMak
890 fi
891
892 if test -n "$WITH_PRODUCTION"
893 then
894     echo '#define CMK_OPTIMIZE 1' >> $ConvHeader
895 fi
896
897 if test $WITH_TAU -eq 1
898 then
899     [ -z "$TAU_MAKEFILE" ] && TAU_MAKEFILE="Make.tau"
900     SED_CHARMC="s@TAU_MAKEFILE=\(.*\)@TAU_MAKEFILE=$TAU_MAKEFILE@"
901
902     sed -e $SED_CHARMC $srcbaseabs/scripts/Makefile > .Makefile.$$ && cp .Makefile.$$ $srcbaseabs/scripts/Makefile && rm -f  .Makefile.$$
903     sed -e $SED_CHARMC $srcbaseabs/scripts/charmc > .charmc.$$ && cp .charmc.$$ $srcbaseabs/scripts/charmc && rm -f .charmc.$$
904
905     echo "#define CMK_WITH_TAU               1" >> $ConvHeader
906     echo "#define pthread_create             tau_pthread_create" >> $ConvHeader
907     echo "#define pthread_exit               tau_pthread_exit" >> $ConvHeader
908
909     echo "CMK_WITH_TAU=\"true\"" >> $ConvSh
910 fi
911
912 CMK_VDIR="$BASEVERSION"
913 echo "$CMK_VDIR" > $DESTINATION/tmp/.vdir
914 echo 'CMK_VDIR="'$CMK_VDIR'"' >> $ConvSh
915 echo "CMK_VDIR:=$CMK_VDIR" >> $ConvMak
916 CMK_GDIR="`echo $BASEVERSION | sed -e 's@-.*@@'`"
917 echo "$CMK_GDIR" > $DESTINATION/tmp/.gdir
918 echo 'CMK_GDIR="'$CMK_GDIR'"' >> $ConvSh
919 echo "CMK_GDIR:=$CMK_GDIR" >> $ConvMak
920
921 echo 'BUILDOPTS="'$OPTS'"'  >> $ConvSh
922 echo "SRCBASE=$srcbase" > $DESTINATION/tmp/charmpath.mk
923
924 echo "CONFIG_OPTS=\"$CONFIG_OPTS\"" > "$DESTINATION/tmp/config_opts.sh"
925 chmod +x "$DESTINATION/tmp/config_opts.sh"
926 echo "OPTSATBUILDTIME:=$OPTS" >> $ConvMak
927
928 fi
929
930 # ===================================================
931 # ----------- end file structure creation -----------
932 # ===================================================
933
934 printError()
935 {
936         Echo "-------------------------------------------------"
937         Echo "Charm++ NOT BUILT. Either cd into $DESTINATION/tmp and try"
938         Echo "to resolve the problems yourself, visit"
939         Echo "    http://charm.cs.illinois.edu/"
940         Echo "for more information. Otherwise, email the developers at charm@cs.illinois.edu"
941         exit $MAKEEXIT
942 }
943
944 Echo "Performing '$MAKE $MAKEOPTS basics OPTS="$OPTS" QUIET="$QUIET" CONFIG_OPTS="$CONFIG_OPTS"' in $DESTINATION/tmp"
945 cd $DESTINATION/tmp 
946 $MAKE $MAKEOPTS basics OPTS="$OPTS $BUILD_SHARED" QUIET="$QUIET"
947 MAKEEXIT=$?
948 [ $MAKEEXIT -ne 0 ] && printError
949
950 if test -n "$ONLY_CONFIGURE"
951 then
952     exit 0
953 fi
954
955 Echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS" QUIET="$QUIET"' in $DESTINATION/tmp"
956 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED" QUIET="$QUIET"
957 MAKEEXIT=$?
958 if [ $MAKEEXIT -eq 0 ]
959 then
960   if [ $BUILD_OMP = 1 ];
961   then
962     $MAKE MFLAGS="$MAKEOPTS" openmp_llvm OPTS="$OPTS $BUILD_SHARED" QUIET="$QUIET"
963   fi
964   Echo "-------------------------------------------------"
965         Echo "$PROGRAM built successfully."
966         Echo "Next, try out a sample program like" \
967              "$DESTINATION/tests/charm++/simplearrayhello"
968 else
969         printError
970 fi