--- MITgcm/tools/genmake2 2005/03/11 07:25:17 1.120 +++ MITgcm/tools/genmake2 2005/11/09 04:31:30 1.134 @@ -1,6 +1,6 @@ #! /usr/bin/env bash # -# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.120 2005/03/11 07:25:17 mlosch Exp $ +# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.134 2005/11/09 04:31:30 edhill Exp $ # # Makefile generator for MITgcm UV codes # created by cnh 03/98 @@ -321,7 +321,7 @@ #================================================================ # look for possible FORTRAN compilers - tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95" + tmp="$MITGCM_FC $FC efc g77 f77 pgf77 pgf95 ifc f90 f95 mpif77 mpf77 mpxlf95 gfortran" p_FC= for c in $tmp ; do rm -f ./hello.f ./hello @@ -527,6 +527,9 @@ *only* works if it is supported by the OPTFILE that is being used. + -ts | --ts + Produce timing information per timestep + -mpi | --mpi Include MPI header files and link to MPI libraries -mpi=PATH | --mpi=PATH @@ -598,7 +601,7 @@ call tsub( string ) end EOF - $FC $FFLAGS $DEFINES -c genmake_tcomp.$FS >> genmake_warnings 2>&1 + $FC $FFLAGS -c genmake_tcomp.$FS >> genmake_warnings 2>&1 RETVAL=$? if test "x$RETVAL" != x0 ; then FC_NAMEMANGLE=$default_nm @@ -668,11 +671,11 @@ RET_C=$? cat < genmake_tc_2.$FS program hello - Real*8 wtime + REAL*8 wtime external cloc call cloc(wtime) print *," HELLO WORLD", wtime - end program hello + end EOF $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1 RET_F=$? @@ -686,6 +689,42 @@ } +check_HAVE_SETRLSTK() { + get_fortran_c_namemangling + cat < genmake_tc_1.c +$FC_NAMEMANGLE +#include +#include +#include +void FC_NAMEMANGLE(setrlstk) () +{ + struct rlimit rls; + rls.rlim_cur = RLIM_INFINITY; + rls.rlim_max = RLIM_INFINITY; + setrlimit(RLIMIT_STACK, &rls); + return; +} +EOF + make genmake_tc_1.o >> genmake_warnings 2>&1 + RET_C=$? + cat < genmake_tc_2.$FS + program hello + external setrlstk + call setrlstk() + end +EOF + $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_warnings 2>&1 + RET_F=$? + test -x ./genmake_tc && ./genmake_tc >> genmake_warnings 2>&1 + RETVAL=$? + if test "x$RETVAL" = x0 ; then + HAVE_SETRLSTK=t + DEFINES="$DEFINES -DHAVE_SETRLSTK" + fi + rm -f genmake_tc* +} + + check_HAVE_STAT() { get_fortran_c_namemangling cat < genmake_tc_1.c @@ -714,7 +753,7 @@ integer nbyte call tfsize(nbyte) print *," HELLO WORLD", nbyte - end program hello + end EOF $FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o >> genmake_tc.log 2>&1 RET_F=$? @@ -752,19 +791,19 @@ EOF echo "Executing:" > genmake_tnc.log echo " $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS" \ - > genmake_tnc.log + >> genmake_tnc.log RET_CPP=f $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \ && RET_CPP=t if test "x$RET_CPP" = xf ; then echo " WARNING: CPP failed to pre-process the netcdf test." \ - > genmake_tnc.log + >> genmake_tnc.log echo " Please check that \$INCLUDES is properly set." \ - > genmake_tnc.log + >> genmake_tnc.log fi echo "Executing:" > genmake_tnc.log - echo " $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS" > genmake_tnc.log - echo " $LINK -o genmake_tnc.o $LIBS" > genmake_tnc.log + echo " $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS" >> genmake_tnc.log + echo " $LINK -o genmake_tnc.o $LIBS" >> genmake_tnc.log $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \ && $LINK -o genmake_tnc genmake_tnc.o $LIBS >> genmake_tnc.log 2>&1 RET_COMPILE=$? @@ -780,6 +819,9 @@ HAVE_NETCDF=t else # try again with "-lnetcdf" added to the libs + echo "$CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS \ " >> genmake_tnc.log + echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log + echo " && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log $CPP $DEFINES $INCLUDES genmake_tnc.F > genmake_tnc.$FS 2>/dev/null \ && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS >> genmake_tnc.log 2>&1 \ && $LINK -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf >> genmake_tnc.log 2>&1 @@ -788,6 +830,9 @@ LIBS="$LIBS -lnetcdf" HAVE_NETCDF=t else + echo "=== genmake_tnc.F ===" >> genmake_warnings + cat genmake_tnc.F >> genmake_warnings + echo "=== genmake_tnc.F ===" >> genmake_warnings cat genmake_tnc.log >> genmake_warnings fi fi @@ -834,15 +879,19 @@ NOOPTFLAGS= MPI= MPIPATH= +TS= +HAVE_TEST_L= -# DEFINES checked by test compilation +# DEFINES checked by test compilation or command-line HAVE_SYSTEM= HAVE_FDATE= FC_NAMEMANGLE= HAVE_CLOC= +HAVE_SETRLSTK= HAVE_STAT= HAVE_NETCDF= HAVE_ETIME= +IGNORE_TIME= MODS= TOOLSDIR= @@ -888,7 +937,7 @@ # The following state can be set directly by command-line switches gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE" -gm_s2="FC CPP IEEE MPI JAM DUMPSTATE STANDARDDIRS" +gm_s2="FC CPP IEEE TS MPI JAM DUMPSTATE STANDARDDIRS" # The following state is not directly set by command-line switches gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM " @@ -1068,6 +1117,9 @@ -noieee | --noieee) IEEE= ;; + -ts | --ts) + TS=true ;; + -mpi | --mpi) MPI=true ;; -mpi=* | --mpi=*) @@ -1091,6 +1143,9 @@ ac_prev=TAMC_EXTRA ;; -tamc_extra=* | --tamc_extra=*) TAMC_EXTRA=$ac_optarg ;; + + -ignoretime | -ignore_time | --ignoretime | --ignore_time) + IGNORE_TIME="-DIGNORE_TIME" ;; -*) echo "Error: unrecognized option: "$ac_option @@ -1148,7 +1203,7 @@ # Find the MITgcm ${THISVER} if test -f "${ROOTDIR}/doc/tag-index" ; then - THISVER=`grep checkpoint ${ROOTDIR}/doc/tag-index | head -1` + THISVER=`grep '^checkpoint' ${ROOTDIR}/doc/tag-index | head -1` fi if test "x$MAKEFILE" = x ; then @@ -1290,6 +1345,11 @@ EOF exit 1 fi +test -L genmake_tlink > /dev/null 2>&1 +RETVAL=$? +if test "x$RETVAL" = x0 ; then + HAVE_TEST_L=t +fi rm -f genmake_test_ln genmake_tlink # Check for broken *.F/*.f handling and fix if possible @@ -1300,6 +1360,11 @@ DEFINES="$DEFINES -DALLOW_USE_MPI -DALWAYS_USE_MPI" fi +if test ! "x$TS" = x ; then + echo " Turning on timing per timestep" + DEFINES="$DEFINES -DTIME_PER_TIMESTEP" +fi + printf "\n=== Checking system libraries ===\n" printf " Do we have the system() command using $FC... " cat > genmake_tcomp.$FS < genmake_tcomp.log 2>&1 +$FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_SYSTEM=t @@ -1322,13 +1387,13 @@ printf " Do we have the fdate() command using $FC... " cat > genmake_tcomp.$FS < genmake_tcomp.log 2>&1 +$FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_FDATE=t @@ -1350,7 +1415,7 @@ print *, tarray end EOF -$FC $FFLAGS $DEFINES -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1 +$FC $FFLAGS -o genmake_tcomp genmake_tcomp.$FS > genmake_tcomp.log 2>&1 RETVAL=$? if test "x$RETVAL" = x0 ; then HAVE_ETIME=t @@ -1371,6 +1436,15 @@ fi rm -f genmake_t* +printf " Can we unlimit the stack size using $FC... " +check_HAVE_SETRLSTK +if test "x$HAVE_SETRLSTK" != x ; then + echo "yes" +else + echo "no" +fi +rm -f genmake_t* + printf " Can we use stat() through C calls... " check_HAVE_STAT if test "x$HAVE_STAT" != x ; then @@ -1387,7 +1461,7 @@ else echo "no" fi - +DEFINES="$DEFINES $IGNORE_TIME" printf "\n=== Setting defaults ===\n" printf " Adding MODS directories: " @@ -1826,7 +1900,10 @@ cat $i/$j >> ad_files done done - +if test ! "x"$FS = "x.f" ; then + cat ad_files | sed -e "s/\.f/.$FS/g" > ad_files_f + mv -f ad_files_f ad_files +fi echo echo "=== Creating the Makefile ===" @@ -1855,6 +1932,7 @@ for sf in $sfiles ; do if test ! -r ".links.tmp/$sf" ; then if test -f "$d/$sf" ; then + ignore_f=f case $d/$sf in ./$PACKAGES_DOT_H) ;; @@ -1865,33 +1943,41 @@ ./BUILD_INFO.h) ;; *) - touch .links.tmp/$sf - deplist="$deplist $sf" + # For the local directory *ONLY*, + # ignore all soft-links + if test "x$HAVE_TEST_L" = xt -a "x$d" = x. -a -L $sf ; then + ignore_f=t + else + touch .links.tmp/$sf + deplist="$deplist $sf" + fi ;; esac - extn=`echo $sf | $AWK -F. '{print $NF}'` - case $extn in - F) - echo " \\" >> srclist.inc - printf " $sf" >> srclist.inc - ;; - F90) - echo " \\" >> f90srclist.inc - printf " $sf" >> f90srclist.inc - ;; - c) - echo " \\" >> csrclist.inc - printf " $sf" >> csrclist.inc - ;; - h) - echo " \\" >> hlist.inc - printf " $sf" >> hlist.inc - ;; - flow) - echo " \\" >> ad_flow_files.inc - printf " $sf" >> ad_flow_files.inc - ;; - esac + if test "x$ignore_f" = xf ; then + extn=`echo $sf | $AWK -F. '{print $NF}'` + case $extn in + F) + echo " \\" >> srclist.inc + printf " $sf" >> srclist.inc + ;; + F90) + echo " \\" >> f90srclist.inc + printf " $sf" >> f90srclist.inc + ;; + c) + echo " \\" >> csrclist.inc + printf " $sf" >> csrclist.inc + ;; + h) + echo " \\" >> hlist.inc + printf " $sf" >> hlist.inc + ;; + flow) + echo " \\" >> ad_flow_files.inc + printf " $sf" >> ad_flow_files.inc + ;; + esac + fi fi fi done @@ -2022,7 +2108,7 @@ cat ad_flow_files.inc >> $MAKEFILE echo >> $MAKEFILE echo 'F77FILES = $(SRCFILES:.F=.'$FS')' >> $MAKEFILE -echo 'F90FILES = $(F90SRCFILES:.F=.'$FS90')' >> $MAKEFILE +echo 'F90FILES = $(F90SRCFILES:.F90=.'$FS90')' >> $MAKEFILE echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE echo >> $MAKEFILE echo '.SUFFIXES:' >> $MAKEFILE @@ -2042,6 +2128,11 @@ \$(TOOLSDIR)/f90mkdepend >> \$(MAKEFILE) -rm -f makedepend.out +lib: libmitgcmuv.a + +libmitgcmuv.a: \$(OBJFILES) + ar rcv libmitgcmuv.a \$(OBJFILES) + links: \$(SRCFILES) \$(CSRCFILES) \$(HEADERFILES) \$(F90SRCFILES) \$(SPECIAL_FILES) small_f: \$(F77FILES) \$(F90FILES) @@ -2151,31 +2242,31 @@ # ... AD ... adall: ad_taf -adtaf: ad_taf_output.f -adtamc: ad_tamc_output.f +adtaf: ad_taf_output.$FS +adtamc: ad_tamc_output.$FS -ad_input_code.f: \$(AD_FILES) \$(HEADERFILES) +ad_input_code.$FS: \$(AD_FILES) \$(HEADERFILES) @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -DALLOW_ADJOINT_RUN -UALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ad_config.template cmp ad_config.template AD_CONFIG.h || cat ad_config.template > AD_CONFIG.h -rm -f ad_config.template @make \$(F77FILES) @make \$(AD_FLOW_FILES) - cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.f + cat \$(AD_FLOW_FILES) \$(AD_FILES) > ad_input_code.$FS -ad_taf_output.f: ad_input_code.f - \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f - cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f +ad_taf_output.$FS: ad_input_code.$FS + \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS + cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS adtafonly: - \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.f - cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.f + \$(TAF) \$(AD_TAF_FLAGS) \$(TAF_EXTRA) ad_input_code.$FS + cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_taf_output.$FS ad_taf: ad_taf_output.o \$(OBJFILES) \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_taf_output.o \$(LIBS) -ad_tamc_output.f: ad_input_code.f - \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.f - cat ad_input_code_ad.f | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.f +ad_tamc_output.$FS: ad_input_code.$FS + \$(TAMC) \$(AD_TAMC_FLAGS) \$(TAMC_EXTRA) ad_input_code.$FS + cat ad_input_code_ad.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ad_tamc_output.$FS ad_tamc: ad_tamc_output.o \$(OBJFILES) \$(LINK) -o ${EXE_AD} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_tamc_output.o \$(LIBS) @@ -2188,38 +2279,38 @@ # ... FTL ... ftlall: ftl_taf -ftltaf: ftl_taf_output.f -ftltamc: ftl_tamc_output.f +ftltaf: ftl_taf_output.$FS +ftltamc: ftl_tamc_output.$FS -ftl_input_code.f: \$(AD_FILES) \$(HEADERFILES) +ftl_input_code.$FS: \$(AD_FILES) \$(HEADERFILES) @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h -rm -f ftl_config.template @make \$(F77FILES) @make \$(AD_FLOW_FILES) - cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.f + cat \$(AD_FLOW_FILES) \$(AD_FILES) > ftl_input_code.$FS -ftl_taf_output.f: ftl_input_code.f - \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f - cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f +ftl_taf_output.$FS: ftl_input_code.$FS + \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS + cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS ftltafonly: - \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.f - cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.f + \$(TAF) \$(FTL_TAF_FLAGS) \$(TAF_EXTRA) ftl_input_code.$FS + cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_taf_output.$FS ftl_taf: ftl_taf_output.o \$(OBJFILES) \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_taf_output.o \$(LIBS) -ftl_tamc_output.f: ftl_input_code.f - \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.f - cat ftl_input_code_ftl.f | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.f +ftl_tamc_output.$FS: ftl_input_code.$FS + \$(TAMC) \$(FTL_TAMC_FLAGS) \$(TAMC_EXTRA) ftl_input_code.$FS + cat ftl_input_code_ftl.$FS | sed -f \$(TOOLSDIR)/adjoint_sed > ftl_tamc_output.$FS ftl_tamc: ftl_tamc_output.o \$(OBJFILES) \$(LINK) -o ${EXE_FTL} \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ftl_tamc_output.o \$(LIBS) # ... SVD ... -svdtaf: ad_taf_output.f ftl_taf_output.f +svdtaf: ad_taf_output.$FS ftl_taf_output.$FS @echo "--->>> Only ran TAF to generate SVD code! <<<---" @echo "--->>> Do make svdall afterwards to compile. <<<---" svdall: svd_touch svd_taf @@ -2235,9 +2326,9 @@ @echo "--->>> Only COMPILE svd code! <<<---" @echo "--->>> Assumes you previously <<<---" @echo "--->>> did make svdtaf <<<---" - touch ad_taf_output.f ftl_taf_output.f - \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.f - \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.f + touch ad_taf_output.$FS ftl_taf_output.$FS + \$(FC) \$(FFLAGS) \$(FOPTIM) -c ad_taf_output.$FS + \$(FC) \$(FFLAGS) \$(FOPTIM) -c ftl_taf_output.$FS @$BASH\$(TOOLSDIR)/convert_cpp_cmd2defines "Warning - this file is automatically generated - do NOT edit" -UALLOW_ADJOINT_RUN -DALLOW_TANGENTLINEAR_RUN -UALLOW_ECCO_OPTIMIZATION > ftl_config.template cmp ftl_config.template AD_CONFIG.h || cat ftl_config.template > AD_CONFIG.h -rm -f ftl_config.template