--- MITgcm/tools/genmake2 2010/11/02 00:51:11 1.210 +++ MITgcm/tools/genmake2 2010/12/06 17:16:06 1.215 @@ -1,6 +1,7 @@ #! /usr/bin/env bash # -# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.210 2010/11/02 00:51:11 jmc Exp $ +# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.215 2010/12/06 17:16:06 jmc Exp $ +# $Name: $ # # Makefile generator for MITgcm UV codes # created by cnh 03/98 @@ -8,6 +9,167 @@ # modified by aja 01/00 # rewritten in bash by eh3 08/03 +# Explain usage +usage() { +cat < /dev/null 2>&1 && PLATFORM=cygwin_ia32 - OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")` - echo " The platform appears to be: $PLATFORM" - - echo "test" > test - ln -s ./test link - RETVAL=$? - if test "x${RETVAL}" = x0 ; then - LN="ln -s" - else - echo "Error: \"ln -s\" does not appear to work on this system!" - echo " For help, please contact ." - exit 1 - fi - rm -f test link - - if test "x$CPP" = x ; then - CPP="cpp -traditional -P" - fi - - look_for_makedepend - - #================================================================ - # look for possible C compilers - tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc" - p_CC= - for c in $tmp ; do - rm -f ./genmake_hello.c ./genmake_hello - cat >> genmake_hello.c << EOF +# look for possible C compilers +look_for_C_compilers() { + echo >> $LOGFILE + echo "running: look_for_C_compilers()" >> $LOGFILE + rm -f ./genmake_hello.c ./genmake_hello + cat >> genmake_hello.c << EOF #include int main(int argc, char **argv) { printf("Hello!\n"); return 0; } EOF - $c -o genmake_hello genmake_hello.c > /dev/null 2>&1 + tmp="$MITGCM_CC $CC gcc c89 cc c99 mpicc icc" + p_CC= + for c in $tmp ; do + COMM="$c $CFLAGS -o genmake_hello genmake_hello.c" + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x${RETVAL}" = x0 ; then + echo " $c test successful" >> $LOGFILE p_CC="$p_CC $c" fi done @@ -353,34 +483,55 @@ EOF exit 1 else - echo " The possible C compilers found in your path are:" - echo " "$p_CC + echo " The possible C compilers found in your path are: $p_CC" | tee -a $LOGFILE if test "x$CC" = x ; then CC=`echo $p_CC | $AWK '{print $1}'` echo " Setting C compiler to: "$CC fi fi + echo " --> set CC='$CC'" >> $LOGFILE +} + +# Guess possible config options for this host +find_possible_optfile() { + + echo >> $LOGFILE + echo "running: find_possible_optfile()" >> $LOGFILE + tmp1=`uname`"_"`uname -m` + tmp2=`echo $tmp1 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + tmp3=`echo $tmp2 | sed -e 's/power macintosh/ppc/'` + tmp1=`echo $tmp3 | sed -e 's|x86_64|amd64|'` + tmp2=`echo $tmp1 | sed -e 's/i[3-6]86/ia32/' | sed -e 's/athlon/ia32/'` + tmp3=`echo $tmp2 | sed -e 's/cray sv1/craysv1/'` + PLATFORM=$tmp3 + echo $PLATFORM | grep cygwin > /dev/null 2>&1 && PLATFORM=cygwin_ia32 + OFLIST=`(cd $ROOTDIR/tools/build_options; ls | grep "^$PLATFORM")` + echo " The platform appears to be: $PLATFORM" | tee -a $LOGFILE #================================================================ # look for possible FORTRAN compilers - tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 gfortran g95" + echo " look for possible FORTRAN compilers" >> $LOGFILE + tmp="$MITGCM_FC $FC efc gfortran g77 f77 pgf77 pgf95 ifc ifort f90 f95 mpif77 mpf77 mpxlf95 g95" p_FC= - for c in $tmp ; do - rm -f ./hello.f ./hello - cat >> hello.f <> genmake_hello.f < /dev/null 2>&1 + for f in $tmp ; do + COMM="$f -o genmake_hello genmake_hello.f" + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x${RETVAL}" = x0 ; then - p_FC="$p_FC $c" + echo " $f test successful" >> $LOGFILE + p_FC="$p_FC $f" fi done - rm -f ./hello.f ./hello + rm -f ./genmake_hello.f ./genmake_hello if test "x${p_FC}" = x ; then cat 1>&2 <&2 <> genmake_warnings + echo " running: get_fortran_c_namemangling()" >> $LOGFILE default_nm="#define FC_NAMEMANGLE(X) X ## _" cat > genmake_test.c <> genmake_warnings 2>&1 + COMM="$CC $CFLAGS -c genmake_test.c" + echo ' '$COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x$RETVAL" != x0 ; then FC_NAMEMANGLE=$default_nm - cat <> genmake_errors + cat <> $LOGFILE -WARNING: C test compile fails -WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' -WARNING: Please contact if you need help here + WARNING: C test compile fails + WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' + WARNING: Please contact if you need help here EOF return 1 fi @@ -679,11 +661,11 @@ RETVAL=$? if test "x$RETVAL" != x0 ; then FC_NAMEMANGLE=$default_nm - cat <> genmake_warnings + cat <> $LOGFILE -WARNING: The "nm" command failed. -WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' -WARNING: Please contact if you need help here + WARNING: The "nm" command failed. + WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' + WARNING: Please contact if you need help here EOF return 1 fi @@ -693,15 +675,17 @@ call tsub( string ) end EOF - $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1 + COMM="$FC $FFLAGS -c genmake_tcomp.$FS" + echo ' '$COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x$RETVAL" != x0 ; then FC_NAMEMANGLE=$default_nm - cat <> genmake_warnings + cat <> $LOGFILE -WARNING: FORTRAN test compile fails -- please see "genmake_errors" -WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' -WARNING: Please contact if you need help here. + WARNING: FORTRAN test compile fails -- please see '$LOGFILE' + WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' + WARNING: Please contact if you need help here. EOF return 1 fi @@ -709,11 +693,11 @@ RETVAL=$? if test "x$RETVAL" != x0 ; then FC_NAMEMANGLE=$default_nm - cat <> genmake_warnings + cat <> $LOGFILE -WARNING: The "nm" command failed. -WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' -WARNING: Please contact if you need help here. + WARNING: The "nm" command failed. + WARNING: We'll try to use: FC_NAMEMANGLE='$FC_NAMEMANGLE' + WARNING: Please contact if you need help here. EOF return 1 fi @@ -739,12 +723,13 @@ # cleanup the testing files rm -f genmake_tcomp.* genmake_test.* -} + echo " --> set FC_NAMEMANGLE='$FC_NAMEMANGLE'" >> $LOGFILE +} check_HAVE_CLOC() { - echo >> genmake_warnings - echo "running: check_HAVE_CLOC()" >> genmake_warnings + echo >> $LOGFILE + echo "running: check_HAVE_CLOC()" >> $LOGFILE get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -762,8 +747,8 @@ } EOF COMM="$CC $CFLAGS -c genmake_tc_1.c" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RET_C=$? cat < genmake_tc_2.$FS program hello @@ -774,25 +759,25 @@ end EOF COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RET_F=$? - test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1 + test -x ./genmake_tc && ./genmake_tc >> $LOGFILE 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_CLOC=t DEFINES="$DEFINES -DHAVE_CLOC" fi rm -f genmake_tc* + echo " --> set HAVE_CLOC='$HAVE_CLOC'" >> $LOGFILE } - check_HAVE_SIGREG() { if test ! "x$HAVE_SIGREG" = x ; then return fi - echo >> genmake_warnings - echo "running: check_HAVE_SIGREG()" >> genmake_warnings + echo >> $LOGFILE + echo "running: check_HAVE_SIGREG()" >> $LOGFILE get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -825,8 +810,8 @@ } EOF COMM="$CC $CFLAGS -c genmake_tc_1.c" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RET_C=$? cat < genmake_tc_2.$FS program hello @@ -836,19 +821,19 @@ call sigreg(anint) end EOF - cat genmake_tc_2.$FS >> genmake_warnings + cat genmake_tc_2.$FS >> $LOGFILE COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_SIGREG=t DEFINES="$DEFINES -DHAVE_SIGREG" fi rm -f genmake_tc* + echo " --> set HAVE_SIGREG='$HAVE_SIGREG'" >> $LOGFILE } - check_HAVE_SETRLSTK() { if test "x$HAVE_SETRLSTK" = xt ; then DEFINES="$DEFINES -DHAVE_SETRLSTK" @@ -857,8 +842,8 @@ if test ! "x$HAVE_SETRLSTK" = x ; then return fi - echo >> genmake_warnings - echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings + echo >> $LOGFILE + echo "running: check_HAVE_SETRLSTK()" >> $LOGFILE get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -875,8 +860,8 @@ } EOF COMM="$CC $CFLAGS -c genmake_tc_1.c" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RET_C=$? cat < genmake_tc_2.$FS program hello @@ -884,22 +869,22 @@ call setrlstk() end EOF - cat genmake_tc_2.$FS >> genmake_warnings + cat genmake_tc_2.$FS >> $LOGFILE COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" - echo $COMM >> genmake_warnings - $COMM >> genmake_warnings 2>&1 + echo $COMM >> $LOGFILE + $COMM >> $LOGFILE 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_SETRLSTK=t DEFINES="$DEFINES -DHAVE_SETRLSTK" fi rm -f genmake_tc* + echo " --> set HAVE_SETRLSTK='$HAVE_SETRLSTK'" >> $LOGFILE } - check_HAVE_STAT() { - echo >> genmake_warnings - echo "running: check_HAVE_STAT()" >> genmake_warnings + echo >> $LOGFILE + echo "running: check_HAVE_STAT()" >> $LOGFILE get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -921,7 +906,7 @@ } EOF COMM="$CC $CFLAGS -c genmake_tc_1.c" - echo $COMM >> genmake_warnings + echo $COMM >> $LOGFILE $COMM >> genmake_tc.log 2>&1 RET_C=$? cat < genmake_tc_2.$FS @@ -931,9 +916,9 @@ print *," HELLO WORLD", nbyte end EOF - cat genmake_tc_2.$FS >> genmake_warnings + cat genmake_tc_2.$FS >> $LOGFILE COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" - echo $COMM >> genmake_warnings + echo $COMM >> $LOGFILE $COMM >> genmake_tc.log 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then @@ -941,15 +926,15 @@ DEFINES="$DEFINES -DHAVE_STAT" fi rm -f genmake_tc* + echo " --> set HAVE_STAT='$HAVE_STAT'" >> $LOGFILE } - check_netcdf_libs() { if test ! "x$SKIP_NETCDF_CHECK" = x ; then return fi - echo >> genmake_warnings - echo "running: check_netcdf_libs()" >> genmake_warnings + echo >> $LOGFILE + echo "running: check_netcdf_libs()" >> $LOGFILE cat < genmake_tnc.F program fgennc #include "netcdf.inc" @@ -985,7 +970,7 @@ $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \ && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1 RET_COMPILE=$? - cat genmake_tnc.log >> genmake_warnings + cat genmake_tnc.log >> $LOGFILE #EH3 Remove test program execution for machines that either disallow #EH3 execution or cannot support it (eg. cross-compilers) @@ -996,7 +981,7 @@ if test "x$RET_COMPILE" = x0 ; then HAVE_NETCDF=t - echo "check_netcdf: successful" >> genmake_warnings + echo "check_netcdf: successful" >> $LOGFILE else # try again with "-lnetcdf" added to the libs echo "==> try again with added '-lnetcdf'" > genmake_tnc.log @@ -1007,12 +992,12 @@ && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \ && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1 RET_COMPILE=$? - echo >> genmake_warnings - cat genmake_tnc.log >> genmake_warnings + echo >> $LOGFILE + cat genmake_tnc.log >> $LOGFILE if test "x$RET_COMPILE" = x0 ; then LIBS="$LIBS -lnetcdf" HAVE_NETCDF=t - echo "check_netcdf: successful" >> genmake_warnings + echo "check_netcdf: successful" >> $LOGFILE else # try again with "-lnetcdff" added to the libs echo "==> try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log @@ -1023,20 +1008,20 @@ && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \ && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdff -lnetcdf >> genmake_tnc.log 2>&1 RET_COMPILE=$? - echo >> genmake_warnings - cat genmake_tnc.log >> genmake_warnings + echo >> $LOGFILE + cat genmake_tnc.log >> $LOGFILE if test "x$RET_COMPILE" = x0 ; then LIBS="$LIBS -lnetcdff -lnetcdf" HAVE_NETCDF=t - echo "check_netcdf: successful" >> genmake_warnings + echo "check_netcdf: successful" >> $LOGFILE fi fi fi rm -f genmake_tnc* + echo " --> set HAVE_NETCDF='$HAVE_NETCDF'" >> $LOGFILE } - ############################################################################### # Sequential part of script starts here ############################################################################### @@ -1060,7 +1045,7 @@ # MAKEDEPEND= PKG_DEPEND= PKG_GROUPS= -DUMPSTATE=t +DUMPSTATE=f OPTFILE= INCLUDES="-I. $INCLUDES" FFLAGS= @@ -1147,7 +1132,7 @@ # The following state can be set directly by command-line switches gm_s1="OPTFILE PKG_DEPEND PKG_GROUPS MAKEFILE MAKEDEPEND PLATFORM ROOTDIR MODS DISABLE ENABLE" -gm_s2="FC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS" +gm_s2="FC CC IEEE USE_R4 TS PAPIS PCLS PAPI PCL HPMT GSL DEVEL MPI OMP DUMPSTATE STANDARDDIRS" # The following state is not directly set by command-line switches gm_s3="LN S64 LINK MAKE PACKAGES INCLUDES FFLAGS FOPTIM FEXTRAFLAGS" @@ -1168,15 +1153,16 @@ GENMAKE : -A program for GENerating MAKEfiles for the MITgcm project. For a -quick list of options, use "genmake -h" or for more detail see: - - http://mitgcm.org/devel_HOWTO/ +A program for GENerating MAKEfiles for the MITgcm project. + For a quick list of options, use "genmake2 -h" +or for more detail see the Developer's HOWTO manual at: + http://mitgcm.org/public/docs.html EOF +LOGFILE="genmake.log" #- clean-up previous genmake logfiles: -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors +rm -f genmake_state genmake_*optfile $LOGFILE echo "=== Processing options files and arguments ===" gm_local="genmake_local" @@ -1384,7 +1370,6 @@ done - if test -f ./.genmakerc ; then echo echo "WARNING: genmake2 has detected a copy of the old-style \"./.genmakerc\"" @@ -1443,7 +1428,7 @@ if test "x$MITGCM_OF" = x ; then echo "Warning: no OPTFILE specified so we'll look for possible settings" printf "\n=== Searching for possible settings for OPTFILE ===\n" - find_possible_configs + find_possible_optfile else OPTFILE=$MITGCM_OF fi @@ -1458,7 +1443,7 @@ echo "--please check that variable syntax is bash-compatible" exit 1 fi - if test "x$DUMPSTATE" != xf ; then + if test "x$DUMPSTATE" = xt ; then cp -f $OPTFILE "genmake_optfile" fi else @@ -1485,7 +1470,7 @@ echo "--please check that variable syntax is bash-compatible" exit 1 fi - if test "x$DUMPSTATE" != xf ; then + if test "x$DUMPSTATE" = xt ; then cp -f $AD_OPTFILE "genmake_ad_optfile" fi else @@ -1513,16 +1498,11 @@ EOF exit 1 fi + if test "x$CC" = x ; then - CC=cc -# cat <&2 -# Error: no C compiler: please specify using one of the following: -# 1) within the options file ("CC=...") as specified by "-of=OPTFILE" -# 2) the "-cc=XXX" command-line option -# 3) the "./genmake_local" file -# EOF -# exit 1 + look_for_C_compilers fi + if test "x$LINK" = x ; then LINK=$FC fi @@ -1530,7 +1510,7 @@ MAKE="make" fi if test "x$CPP" = x ; then - CPP=cpp + CPP="cpp -traditional -P" fi #EH3 === UGLY === # The following is an ugly little hack to check for $CPP in /lib/ and @@ -1557,7 +1537,10 @@ else rm -f test_cpp fi + look_for_makedepend + +# Check that soft-link command is set and usable if test "x$LN" = x ; then LN="ln -s" fi @@ -1567,7 +1550,7 @@ if test "x$RETVAL" != x0 ; then cat <&2 -Error: The command "ln -s" failed -- please specify a working soft-link +Error: The command "$LN" failed -- please specify a working soft-link command in the optfile. EOF @@ -1804,7 +1787,6 @@ ENABLE="$ENABLE embed_files" fi - printf "\n=== Setting defaults ===\n" printf " Adding MODS directories: " for d in $MODS ; do @@ -1820,9 +1802,9 @@ done echo -if test "x${PLATFORM}" = x ; then - PLATFORM=$p_PLATFORM -fi +#if test "x${PLATFORM}" = x ; then +# PLATFORM=$p_PLATFORM +#fi if test "x${EXEDIR}" = x ; then tmp=`echo $PWD | sed -e 's/\// /g' | $AWK '{print $NR}'` @@ -2708,16 +2690,16 @@ Clean: @make clean @make cleanlinks - -rm -f \$(SPECIAL_FILES) f90mkdepend.log + -rm -f \$(SPECIAL_FILES) f90mkdepend.log $MAKEFILE.old -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log + -rm -f genmake_warnings genmake_errors make.log # remove also the executable, files that "genmake2" generates (except Makefile) -# and output from a run (plus output and log files from testreport) +# and output from a run (plus log files from testreport) CLEAN: @make Clean - -rm -f \$(EXECUTABLE) \$(EXE_AD) *.bak "$MAKEFILE.old" - -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors - -rm -f genmake.log make.log run.log + -rm -f \$(EXECUTABLE) \$(EXE_AD) *.bak + -rm -f $LOGFILE genmake_state genmake_*optfile genmake.tr_log make.tr_log -find \$(EXEDIR) -name "*.meta" -exec rm {} \; -find \$(EXEDIR) -name "*.data" -exec rm {} \; -find \$(EXEDIR) -name "fort.*" -exec rm {} \; @@ -2725,7 +2707,6 @@ -rm -f *_MIT_CE_000.opt0000 costfunction*0000 -rm -rf mnc_test_* -#eh3 Makefile: makefile makefile: $THIS_SCRIPT $G2ARGS cleanlinks: @@ -2781,6 +2762,8 @@ \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@ .$FS.o: \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$< +.F.o: + \$(FC) \$(FFLAGS) \$(FOPTIM) -c \$< .F90.$FS90: \$(CPP) \$(DEFINES) \$(INCLUDES) > \$@ .FF90.f$FS90: @@ -2915,7 +2898,6 @@ ftl_tamc: ftl_tamc_output.o \$(OBJFILES) \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS) - # ... SVD ... svdtaf: ad_taf_output.$FS ftl_taf_output.$FS @echo "--->>> Only ran TAF to generate SVD code! <<<---" @@ -3239,9 +3221,8 @@ $BASH $TOOLSDIR/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > AD_CONFIG.h fi - # Write the "state" for future records -if test "x$DUMPSTATE" != xf ; then +if test "x$DUMPSTATE" = xt ; then printf "" > genmake_state for i in $gm_state ; do t1="t2=\$$i"