3 # Silly shorthand, used for source reorganization
4 if [ $
(dirname $0) = "." ]
9 srcbaseabs
="$(cd $(dirname $0)/src/; pwd)"
12 src
="$srcbaseabs/arch/"
18 echo 'Usage: build <target> <version> <options> [charmc-options ...]'
20 echo '<targets>: converse charm++ LIBS AMPI FEM bigemulator pose msa'
21 echo '<targets>: doc ps-doc pdf-doc html-doc'
25 echo ' charm++ compile Charm++ core only'
26 echo ' AMPI compile Adaptive MPI on top of Charm++'
27 echo ' FEM compile FEM framework'
28 echo ' LIBS compile additional parallel libraries with Charm++ core'
29 echo ' bigemulator build additional BigSim libraries'
30 echo ' pose build POSE parallel discrete event simulator'
31 echo ' msa build Multiphase Shared Arrays(MSA) library'
32 echo ' Tau build the TAU tracing library for generating TAU performance data'
33 echo ' ChaNGa compile Charm++ core and necessary libraries for ChaNGa'
34 echo ' everylb compile EveryLB suite of load balancing strategies'
38 ( cd $src ; ls -1 |
egrep -v '(^shmem$)|(^mpi$)|(^sim$)|(^net(lrts)?$)|(^multicore$)|(^util$)|(^common$)|(^uth$)|(^conv-mach-fix.sh$)|(^win64$)|(^(gemini_)?gni$)|(^pami(lrts)?$)|(^verbs$)|(^template$)|(^cuda$)' |
pr -3 -t )
40 echo '<options>: compiler and platform specific options'
41 echo 'icc iccstatic xlc xlc64 gcc clang craycc pgcc pathscale cc cc64 mpcc gcc64 gcc3 mpicxx'
42 echo 'help smp gm tcp scyld clustermatic bigemulator ooc syncft mlogft causalft'
43 echo 'papi pthreads lam'
44 echo '--incdir --libdir --basedir --build-shared --destination --suffix -j'
48 echo 'For platform specific options, use help option:'
49 echo ' help platform specific help, e.g. ./build charm++ net-linux-x86_64 help'
51 echo 'Choose a compiler (only one option is allowed from this section):'
52 echo ' icc, iccstatic Intel compilers (default or static linking)'
53 echo ' xlc, xlc64 IBM XL compilers (with 64-bit option on architectures with 32-bit modes)'
54 echo ' gcc GNU compiler collection (on platforms where the default differs)'
55 echo ' clang Clang C/C++ compiler'
56 echo ' craycc Cray compilers'
57 echo ' pgcc Portland Group compilers'
58 echo ' pathscale Pathscale compiler suite'
59 echo ' cc, cc64 For Sun WorkShop C++ 32/64 bit compilers'
60 echo ' mpcc SUN Solaris C++ compiler for MPI'
61 echo ' gcc3 GNU GCC/G++ version 3'
63 echo 'Choose an alternative fortran compiler (only one option is allowed from this section):'
64 echo ' g95 G95 at http://ww.g95.org'
65 echo " pgf90 Portland Group Fortran compiler"
66 echo ' ifort Intel Fortran compiler'
68 echo 'Platform specific options (choose multiple if apply):'
69 echo ' smp support for SMP, multithreaded charm on each node'
70 echo ' ibverbs use Infiniband Verbs for communication (only for net-linux-x86_64; prefer verbs-*)'
71 echo ' lam Use LAM MPI'
72 echo ' mpt use SGI Message Passing Toolkit (only for mpi version)'
73 echo ' gm use Myrinet for communication'
74 echo ' tcp use TCP sockets for communication (only for net version)'
75 echo ' scyld compile for Scyld Beowulf cluster based on bproc'
76 echo ' clustermatic compile for Clustermatic (support version 3 and 4) '
77 echo ' pthreads compile with pthreads Converse threads'
79 echo 'Advanced options:'
80 echo ' bigemulator compile for BigSim simulator'
81 echo ' ooc compile with out of core support'
82 echo ' syncft compile with Charm++ fault tolerance support'
83 echo ' mlogft compile with Charm++ message logging fault tolerance support'
84 echo ' papi compile with PAPI performance counter support (if any)'
86 echo "Charm++ dynamic libraries:"
87 echo " --no-build-shared don't build Charm++'s shared libraries (default)"
88 echo " --build-shared build Charm++ dynamic libraries (.so) "
90 echo 'Enable/disable features:'
91 $srcbaseabs/scripts
/configure
--help |
grep enable-
92 $srcbaseabs/scripts
/configure
--help |
grep with-
93 echo " --with-production build Charm++ with all optimizations for maximum performance, and disabling all above features"
95 echo 'Miscellaneous options:'
96 echo ' --incdir=DIR specify additional include path for compiler'
97 echo ' --libdir=DIR specify additional lib path for compiler'
98 echo ' --basedir=DIR shortcut for the above two - DIR/include and DIR/lib'
99 echo ' -j[N] parallel make, N is the number of paralle make jobs'
100 echo " --with-romio build AMPI with ROMIO library"
101 echo " --with-lbtime-type specify real type for the load balancing timers"
102 echo " --destination=DIR build Charm++ inside DIR, by default the destination is <version>"
103 echo " --suffix=DIR append DIR to the destination directory of the Charm++ build"
104 echo " --tau-makefile=FILE Specify which TAU stub makefile to use"
107 echo '<charmc-options>: normal compiler options e.g. -g -optimize -save -verbose'
112 echo "1. display all supported options for net-linux-x86_64 using 'help':"
113 echo ' ./build charm++ net-linux-x86_64 help'
114 echo '2. compile Charm++ on Linux with all available tuning:'
115 echo ' ./build charm++ net-linux-x86_64 --with-production'
116 echo '3. compile Charm++ for Linux (32bit) clustermatic Beowulf cluster with Intel compiler and optimizations:'
117 echo ' ./build charm++ net-linux clustermatic icc -optimize'
118 echo '4. compile Charm++ for Windows with VC++ (Cygwin required):'
119 echo ' ./build charm++ net-win64 -optimize'
120 echo '5. compile Charm++ with MPI that is installed at /usr/local/mpich:'
121 echo ' ./build charm++ mpi-linux --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -optimize'
123 echo ' ./build charm++ mpi-linux --basedir /usr/local/mpich -optimize'
124 echo ' ./build Tau --tau-makefile=/usr/local/packages/TAU/x86_64/lib/Makefile.tau-mpi'
126 echo 'Note: This script:'
127 echo ' 1. Creates directories <destination> and <destination>/tmp'
128 echo ' 2. Copies src/scripts/Makefile into <destination>/tmp'
129 echo ' 3. Does a "make basics" in <destination>/tmp.'
130 echo ' 3. Does a "make -jN <target> <version> OPTS=<charmc-options>" in <destination>/tmp.'
131 echo "That's all build does. The rest is handled by the Makefile."
133 echo 'Thank you for using Charm++, please send questions or comments to '
134 echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
135 echo '(email: charm@cs.illinois.edu).'
139 echo "To get more detailed help, run ./build --help"
144 [ "x$QUIET" = "x--quiet" ] ||
echo $
*
148 for prefix
in cc conv-mach
150 str
="Supported compilers:"
151 [ "$prefix" = "conv-mach" ] && str
="Supported options:"
155 # echo "Checking for $prefix in $dir"
156 files
=`cd $dir; ls $prefix-*.h 2>/dev/null`
157 opts
="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
160 rm -f $tmp; touch $tmp
165 opts
=`sort $tmp | uniq`
177 echo Error
: cannot
find $d!
186 [ -f $dir/cc-
$1.sh
] && return 1
194 [ -f $dir/conv-mach-
$1.h
] && return 1
197 echo "Error> option: $1 is not supported in this version!";
214 BUILD_SHARED
="" # default no shared lib
219 DESTINATION_SUFFIX
=""
223 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax |
( less ||
more ) && exit 1
224 [ $# -lt 2 ] && .
/smart-build.pl
&& exit 1
228 # find longest prefix of version argument that exists as a directory in $src
236 if [ -z "$testversion" ]; then
239 testversion
="$testversion-$w"
241 if [ -d $src/$testversion ]; then
245 VERSOPTS
="$VERSOPTS $w"
248 if [ $VERSION = $1 ]; then VERSOPTS
=""; fi
250 BASEVERSION
=$VERSION;
251 if test -f $src/$BASEVERSION/vdir_link
253 BASEVERSION
=`cat $src/$BASEVERSION/vdir_link`
255 ARCH
=`echo $BASEVERSION | sed -e 's@-.*@@'`
262 OPT_DIRS
="$src/$BASEVERSION $src/$ARCH $src/common"
264 # process remainder of version argument as options, copied from below
265 for w
in $VERSOPTS; do
266 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
270 # It specifies a compiler:
271 if [ ! -z "$COMPILER" ]
273 echo "Error> Tried to specify two compilers: $COMPILER and $w"
278 # It specifies some other option:
281 [ $w = "bigemulator" ] && BUILD_EMULATOR
=1
282 [ $w = "bigsim" ] && BUILD_EMULATOR
=1
283 [ $w = "cuda" ] && BUILD_CUDA
=1
294 CheckDir
$dir/include
$dir/lib
295 LIBDIR
="$LIBDIR -L$dir/lib";
296 INCDIR
="$INCDIR -I$dir/include"
301 basedir
=`echo $1 | awk -F= '{print $2}'`
304 CheckDir
$dir/include
$dir/lib
305 LIBDIR
="$LIBDIR -L$dir/lib";
306 INCDIR
="$INCDIR -I$dir/include"
314 LIBDIR
="$LIBDIR -L$dir";
319 libdir
=`echo $1 | awk -F= '{print $2}'`
323 LIBDIR
="$LIBDIR -L$dir";
331 INCDIR
="$INCDIR -I$dir";
336 incdir
=`echo $1 | awk -F= '{print $2}'`
340 INCDIR
="$INCDIR -I$dir";
344 --no-build-shared|
--no-shared)
345 #BUILD_SHARED="-no-build-shared";
349 BUILD_SHARED
="-build-shared";
353 WITH_ROMIO
="true"; shift
356 WITH_PRODUCTION
="true"
360 CONFIG_OPTS
="$CONFIG_OPTS $1"
364 CONFIG_OPTS
="$CONFIG_OPTS $1"
373 DESTINATION
="`echo $1 | awk -F= '{print $2}'`"
378 DESTINATION_SUFFIX
="$1"
382 DESTINATION_SUFFIX
="`echo $1 | awk -F= '{print $2}'`"
390 TAU_MAKEFILE
=`echo $1 | awk -F= '{print $2}'`
394 MAKEOPTS
="$MAKEOPTS --quiet"
398 --enable-tracing|
--enable-tracing=*)
399 CONFIG_OPTS
="$CONFIG_OPTS $1"
404 CONFIG_OPTS
="$CONFIG_OPTS $1"
408 CONFIG_OPTS
="$CONFIG_OPTS $1"
412 PMAKENUM
=`echo $1 | awk -Fj '{print $2}'`
413 MAKEOPTS
="$MAKEOPTS -j $PMAKENUM"
417 # We hit a real compiler option (like -g, or -Dfoo),
418 # so just copy over all remaining options
421 OPTS
="$OPTS $1"; shift
428 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
432 # It specifies a compiler:
433 if [ ! -z "$COMPILER" ]
435 echo "Error> Tried to specify two compilers: $COMPILER and $1"
440 # It specifies some other option:
443 [ $1 = "bigemulator" ] && BUILD_EMULATOR
=1
444 [ $1 = "bigsim" ] && BUILD_EMULATOR
=1
445 [ $1 = "cuda" ] && BUILD_CUDA
=1
452 if [ $BUILD_CUDA -eq 1 ]; then
453 echo "checking for CUDA toolkit directory"
454 CUDA_CANDIDATE_DIRS
="$CUDATOOLKIT_HOME /usr/local/cuda /usr/lib/nvidia-cuda-toolkit"
455 for dir
in $CUDA_CANDIDATE_DIRS; do
456 if test -d "$dir"; then
459 echo "CUDA_DIR=$CUDA_DIR"
465 [ "x$VERSION" = "x" ] && syntax
&& exit 1
467 if test -n "$WITH_PRODUCTION" -a $BUILD_EMULATOR -eq 1 -a -z "$ENABLE_TRACING"
469 echo "Error: bigemulator requires tracing modules, --with-production must be used with --enable-tracing"
476 MAKE
=`which gmake 2>/dev/null`
477 [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE
='make'
480 if [ ! -f $src/$BASEVERSION/conv-mach.h
]
482 echo "Error> build can not find arch: $BASEVERSION!"
486 #generate VERSION name combining all the build-time options.
487 if [ -n "$BOPTS" -o -n "$COMPILER" ]
489 echo "Selected Compiler: $COMPILER"
490 echo "Selected Options: $BOPTS"
491 SORTED
=`echo $BOPTS | awk '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
492 BOPTS_WITHCOMPILER
=`echo $SORTED $COMPILER`
493 for i
in $BOPTS_WITHCOMPILER
499 #echo "|$DESTINATION|$DESTINATION_SUFFIX|"
501 if [ -z "$DESTINATION" ]
503 DESTINATION
="$VERSION"
506 if [ $
(dirname $DESTINATION) != "." ]
508 srcbaseabs
="$(cd $srcbaseabs; pwd)"
510 src
="$srcbaseabs/arch/"
513 if [ -n "$DESTINATION_SUFFIX" ]
515 DESTINATION
="$DESTINATION-$DESTINATION_SUFFIX"
518 [ -d $DESTINATION ] || Echo
"Creating dir: $DESTINATION"
519 [ -d $DESTINATION ] || mkdir
$DESTINATION
520 [ -d $DESTINATION/tmp
] || Echo
"Creating dir: $DESTINATION/tmp"
521 [ -d $DESTINATION/tmp
] || mkdir
$DESTINATION/tmp
523 Echo
"Copying src/scripts/Makefile to $DESTINATION/tmp"
524 rm -f $DESTINATION/tmp
/Makefile
525 rm -f $DESTINATION/tmp
/Make.depends
526 rm -f $DESTINATION/tmp
/Make.cidepends
527 rm -f $DESTINATION/tmp
/Make.lb
528 rm -f $DESTINATION/tmp
/Make.machine
529 rm -f $DESTINATION/tmp
/Make.extlib
532 # Create the bin, lib, include, etc. links:
533 WINNAME
=`echo $VERSION | awk -F- '{print $2}'`
534 if [ "x_$WINNAME" = "x_win32" -o "x_$WINNAME" = "x_win64" ]
536 #Win32/64 version needs special compilers and *copied* (not linked)
538 cp $src/win32
/system_ln
$DESTINATION/tmp
539 cp $src/win32
/unistd.h
$DESTINATION/tmp
540 echo "Compiling createlink.cpp ..."
541 (cd $src/win32
; ..
/$WINNAME/unix2nt_cc
-c createlink.cpp
-o createlink.o
-D_WIN32_WINNT=0x0500; ..
/$WINNAME/unix2nt_cc createlink.o
)
543 if test ! -x $src/win32
/createlink.exe
545 echo "VC++ is not properly installed!"
548 chmod +x
$DESTINATION/tmp
/system_ln
549 cp $src/win32
/gathertree.
local $DESTINATION/tmp
550 cp $src/win32
/gatherflat.
local $DESTINATION/tmp
552 cat > $DESTINATION/tmp
/system_ln
<<EOF
556 chmod +x
$DESTINATION/tmp
/system_ln
557 for newdir
in `echo bin lib lib_so include tmp`
559 Echo
"Soft-linking over $newdir"
562 rm -fr $newdir ||
exit 1
564 $DESTINATION/tmp
/system_ln
$DESTINATION/$newdir $newdir
567 $DESTINATION/tmp
/system_ln
$DESTINATION/include
/VERSION VERSION
570 $DESTINATION/tmp
/system_ln
"$srcbase/scripts/Make.depends" $DESTINATION/tmp
/Make.depends
571 $DESTINATION/tmp
/system_ln
"$srcbase/scripts/Make.cidepends" $DESTINATION/tmp
/Make.cidepends
572 if test -f "$srcbaseabs/ck-ldb/Make.lb"
574 $DESTINATION/tmp
/system_ln
"$srcbase/ck-ldb/Make.lb" $DESTINATION/tmp
/Make.lb
576 touch $DESTINATION/tmp
/Make.lb
578 $DESTINATION/tmp
/system_ln
"$srcbase/scripts/Makefile" $DESTINATION/tmp
/Makefile
579 $DESTINATION/tmp
/system_ln
"$srcbase/scripts/Make.tau" $DESTINATION/tmp
/Make.tau
580 touch $DESTINATION/tmp
/Makefile.machine
581 touch $DESTINATION/tmp
/Make.extlib
583 ConvUsr
="$DESTINATION/tmp/conv-mach-pre.sh"
584 Echo
"Generating $ConvUsr"
588 echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
589 echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
593 echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
594 echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
598 # Create conv-mach-opt headers with special build-time options
599 ConvHeader
="$DESTINATION/tmp/conv-mach-opt.h"
600 ConvSh
="$DESTINATION/tmp/conv-mach-opt.sh"
601 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
603 Echo
"Generating $ConvHeader, conv-mach-opt.sh"
604 echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
605 echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
606 echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
608 if test -n "$COMPILER"
611 echo '#include "'cc-
$i.h
'"' >> $ConvHeader
612 echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
616 # pxshm+smp note: When combining the 'smp' and 'pxshm' directives, it is
617 # important that they be included in $ConvHeader in that
618 # exact order. See bug #717.
623 if [ "$i" = "smp" ]; then
625 elif [ "$i" = "pxshm" ]; then
631 if [ $HAS_PXSHM -eq 1 ]; then
634 if [ $HAS_SMP -eq 1 ]; then
641 echo '#include "'conv-mach-
$i.h
'"' >> $ConvHeader
642 if [ $BUILD_CUDA -eq 1 ]; then
643 echo 'CUDA_DIR="'$CUDA_DIR'"'>>$ConvSh
645 echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
649 if test "$BUILD_SHARED" = "-build-shared"
651 echo "CMK_NO_BUILD_SHARED=false" >> $ConvSh
653 echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
656 if test -n "$WITH_ROMIO"
658 echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
661 if test -n "$WITH_PRODUCTION"
663 echo '#define CMK_OPTIMIZE 1' >> $ConvHeader
664 # Prepend optimize so that an explicit -no-optimize still works
665 OPTS
="-optimize -production $OPTS"
666 CONFIG_OPTS
="--disable-controlpoint --disable-tracing --disable-tracing-commthread --disable-charmdebug --disable-replay --disable-error-checking --disable-stats $CONFIG_OPTS"
671 if [ "$PROGRAM" = "Tau" ]
673 Echo
"TAU>>>> makefile config option: $TAU_MAKEFILE"
674 if [ -n "$TAU_MAKEFILE" -a -f $TAU_MAKEFILE ]
676 #Setting up TAU trace library:
677 Echo
"TAU>>>> configuring with this TAU makefile: $TAU_MAKEFILE"
681 Echo
"TAU>>>> ERROR could not find Makefile: $TAU_MAKEFILE, ignored"
686 if test $WITH_TAU -eq 1
688 [ -z "$TAU_MAKEFILE" ] && TAU_MAKEFILE
="Make.tau"
689 SED_CHARMC
="s@TAU_MAKEFILE=\(.*\)@TAU_MAKEFILE=$TAU_MAKEFILE@"
691 sed -e $SED_CHARMC $srcbaseabs/scripts
/Makefile
> .Makefile.$$
&& cp .Makefile.$$
$srcbaseabs/scripts
/Makefile
&& rm -f .Makefile.$$
692 sed -e $SED_CHARMC $srcbaseabs/scripts
/charmc
> .charmc.$$
&& cp .charmc.$$
$srcbaseabs/scripts
/charmc
&& rm -f .charmc.$$
694 echo "#define CMK_WITH_TAU 1" >> $ConvHeader
695 echo "#define pthread_create tau_pthread_create" >> $ConvHeader
696 echo "#define pthread_exit tau_pthread_exit" >> $ConvHeader
698 echo "CMK_WITH_TAU=\"true\"" >> $ConvSh
701 if [ "$PROGRAM" = "ChaNGa" ]
703 #Setting lbuserdata when the build is ChaNGa
704 CONFIG_OPTS
="--enable-lbuserdata $CONFIG_OPTS"
707 echo $BASEVERSION > $DESTINATION/tmp
/.
vdir
708 echo $BASEVERSION |
sed -e 's@-.*@@' > $DESTINATION/tmp
/.gdir
710 if test $BUILD_EMULATOR = 1
712 PROGRAM
="$PROGRAM bigsim"
713 # CONFIG_OPTS="--disable-charmdebug $CONFIG_OPTS"
718 Echo
"-------------------------------------------------"
719 Echo
"Charm++ NOT BUILT. Either cd into $DESTINATION/tmp and try"
720 Echo
"to resolve the problems yourself, visit"
721 Echo
" http://charm.cs.illinois.edu/"
722 Echo
"for more information. Otherwise, email the developers at charm@cs.illinois.edu"
726 echo 'BUILDOPTS="'$OPTS'"' >> $ConvSh
727 echo "SRCBASE=$srcbase" > $DESTINATION/tmp
/charmpath.mk
729 Echo
"Performing '$MAKE $MAKEOPTS basics OPTS="$OPTS" QUIET="$QUIET" CONFIG_OPTS="$CONFIG_OPTS"' in $DESTINATION/tmp"
731 echo "CONFIG_OPTS=\"$CONFIG_OPTS\"" > config_opts.sh
732 chmod +x config_opts.sh
733 echo "OPTSATBUILDTIME += $OPTS" > buildopts.mk
734 $MAKE $MAKEOPTS basics OPTS
="$OPTS $BUILD_SHARED" QUIET
="$QUIET"
736 [ $MAKEEXIT -ne 0 ] && printError
738 Echo
"Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS" QUIET="$QUIET"' in $DESTINATION/tmp"
739 $MAKE $MAKEOPTS $PROGRAM OPTS
="$OPTS $BUILD_SHARED" QUIET
="$QUIET"
741 if [ $MAKEEXIT -eq 0 ]
743 Echo
"-------------------------------------------------"
744 Echo
"$PROGRAM built successfully."
745 Echo
"Next, try out a sample program like" \
746 "$DESTINATION/tests/charm++/simplearrayhello"