--- MITgcm/tools/genmake2 2010/05/26 00:08:18 1.207 +++ MITgcm/tools/genmake2 2010/11/02 00:51:11 1.210 @@ -1,6 +1,6 @@ #! /usr/bin/env bash # -# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.207 2010/05/26 00:08:18 jmc Exp $ +# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.210 2010/11/02 00:51:11 jmc Exp $ # # Makefile generator for MITgcm UV codes # created by cnh 03/98 @@ -56,7 +56,6 @@ # the package list. expand_pkg_groups() { new_packages= - PKG_GROUPS=$ROOTDIR"/pkg/pkg_groups" if test -r $PKG_GROUPS ; then cat $PKG_GROUPS | sed -e 's/#.*$//g' | sed -e 's/:/ : /g' > ./p1.tmp cat ./p1.tmp | $AWK '(NF>2 && $2==":"){ print $0 }' > ./p2.tmp @@ -67,7 +66,7 @@ if test "x$RETVAL" = x0 ; then matched=1 replace=`echo $line | $AWK '{ $1=""; $2=""; print $0 }'` - echo " replacing \"$i\" with: $replace" + echo " replacing \"$i\" with:$replace" new_packages="$new_packages $replace" else new_packages="$new_packages $i" @@ -484,7 +483,7 @@ > ./.pd_tmp RETVAL=$? if test ! "x${RETVAL}" = x0 ; then - echo "Error: unable to parse package dependencies -- please check PDEPEND=\"$1\"" + echo "Error: unable to parse package dependencies -- please check PKG_DEPEND=\"$1\"" exit 1 fi . ./.pd_tmp @@ -519,9 +518,9 @@ -pdepend=NAME | --pdepend=NAME Get package dependency information from "NAME". - -pdefault NAME | --pdefault NAME - -pdefault=NAME | --pdefault=NAME - Get the default package list from "NAME". + -pgroups NAME | --pgroups NAME + -pgroups=NAME | --pgroups=NAME + Get the package groups information from "NAME". -bash NAME Explicitly specify the Bourne or BASH shell to use @@ -657,6 +656,7 @@ if test ! "x$FC_NAMEMANGLE" = x ; then return 0 fi + echo "running: get_fortran_c_namemangling()" >> genmake_warnings default_nm="#define FC_NAMEMANGLE(X) X ## _" @@ -743,6 +743,8 @@ check_HAVE_CLOC() { + echo >> genmake_warnings + echo "running: check_HAVE_CLOC()" >> genmake_warnings get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -789,6 +791,8 @@ if test ! "x$HAVE_SIGREG" = x ; then return fi + echo >> genmake_warnings + echo "running: check_HAVE_SIGREG()" >> genmake_warnings get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -832,8 +836,6 @@ call sigreg(anint) end EOF - echo >> genmake_warnings - echo "running: check_HAVE_SIGREG()" >> genmake_warnings cat genmake_tc_2.$FS >> genmake_warnings COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" echo $COMM >> genmake_warnings @@ -855,6 +857,8 @@ if test ! "x$HAVE_SETRLSTK" = x ; then return fi + echo >> genmake_warnings + echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -880,8 +884,6 @@ call setrlstk() end EOF - echo >> genmake_warnings - echo "running: check_HAVE_SETRLSTK()" >> genmake_warnings cat genmake_tc_2.$FS >> genmake_warnings COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" echo $COMM >> genmake_warnings @@ -896,6 +898,8 @@ check_HAVE_STAT() { + echo >> genmake_warnings + echo "running: check_HAVE_STAT()" >> genmake_warnings get_fortran_c_namemangling cat < genmake_tc_1.c $FC_NAMEMANGLE @@ -927,8 +931,6 @@ print *," HELLO WORLD", nbyte end EOF - echo >> genmake_warnings - echo "running: check_HAVE_STAT()" >> genmake_warnings cat genmake_tc_2.$FS >> genmake_warnings COMM="$FC $FFLAGS -o genmake_tc genmake_tc_2.$FS genmake_tc_1.o" echo $COMM >> genmake_warnings @@ -965,9 +967,9 @@ IF (iret .NE. NF_NOERR) write(*,*) NF_STRERROR(iret) end EOF - echo "=== genmake_tnc.F ===" > genmake_tnc.log + echo "=== genmake_tnc.F >>>" > genmake_tnc.log cat genmake_tnc.F >> genmake_tnc.log - echo "=== genmake_tnc.F ===" >> genmake_tnc.log + echo "<<< genmake_tnc.F ===" >> genmake_tnc.log RET_CPP=f COMM="cat genmake_tnc.F | $CPP $DEFINES $INCLUDES" echo "$COMM" >> genmake_tnc.log @@ -994,9 +996,10 @@ if test "x$RET_COMPILE" = x0 ; then HAVE_NETCDF=t + echo "check_netcdf: successful" >> genmake_warnings else # try again with "-lnetcdf" added to the libs - echo "try again with added '-lnetcdf'" > genmake_tnc.log + echo "==> try again with added '-lnetcdf'" > genmake_tnc.log echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log @@ -1004,13 +1007,15 @@ && $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 if test "x$RET_COMPILE" = x0 ; then LIBS="$LIBS -lnetcdf" HAVE_NETCDF=t + echo "check_netcdf: successful" >> genmake_warnings else # try again with "-lnetcdff" added to the libs - echo "try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log + echo "==> try again with added '-lnetcdff -lnetcdf'" > genmake_tnc.log echo "cat genmake_tnc.F | $CPP $DEFINES $INCLUDES > genmake_tnc.$FS \ " >> genmake_tnc.log echo " && $FC $FFLAGS $FOPTIM -c genmake_tnc.$FS \ " >> genmake_tnc.log echo " && $LINK $FFLAGS $FOPTIM -o genmake_tnc genmake_tnc.o $LIBS -lnetcdf" >> genmake_tnc.log @@ -1018,10 +1023,12 @@ && $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 if test "x$RET_COMPILE" = x0 ; then LIBS="$LIBS -lnetcdff -lnetcdf" HAVE_NETCDF=t + echo "check_netcdf: successful" >> genmake_warnings fi fi fi @@ -1051,9 +1058,9 @@ DISABLE= # MAKEFILE= # MAKEDEPEND= -PDEPEND= +PKG_DEPEND= +PKG_GROUPS= DUMPSTATE=t -PDEFAULT= OPTFILE= INCLUDES="-I. $INCLUDES" FFLAGS= @@ -1138,17 +1145,16 @@ SVD_TAMC_FLAGS= TAMC_EXTRA= - # The following state can be set directly by command-line switches -gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE" +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" # The following state is not directly set by command-line switches -gm_s3="LN S64 KPP LINK PACKAGES MAKEDEPEND PDEPEND PDEFAULT INCLUDES FFLAGS FOPTIM FEXTRAFLAGS" -gm_s4="CFLAGS KFLAGS1 KFLAGS2 LIBS KPPFILES NOOPTFILES NOOPTFLAGS" -gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOST THISUSER THISDATE THISVER MACHINE" +gm_s3="LN S64 LINK MAKE PACKAGES INCLUDES FFLAGS FOPTIM FEXTRAFLAGS" +gm_s4="CFLAGS LIBS KPP KFLAGS1 KFLAGS2 KPPFILES NOOPTFILES NOOPTFLAGS" +gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD THISHOST THISUSER THISDATE THISVER MACHINE" gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF" -gm_s7="HAVE_SYSTEM HAVE_FDATE FC_NAMEMANGLE HAVE_ETIME" +gm_s7="FC_NAMEMANGLE HAVE_NETCDF HAVE_SYSTEM HAVE_FDATE HAVE_ETIME" # The following are all related to adjoint/tangent-linear stuff gm_s10="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF AD_TAMC_FLAGS AD_TAF_FLAGS" @@ -1169,6 +1175,9 @@ EOF +#- clean-up previous genmake logfiles: +rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors + echo "=== Processing options files and arguments ===" gm_local="genmake_local" printf " getting local config information: " @@ -1215,14 +1224,14 @@ AD_OPTFILE=$ac_optarg ;; -pdepend | --pdepend) - ac_prev=PDEPEND ;; + ac_prev=PKG_DEPEND ;; -pdepend=* | --pdepend=*) - PDEPEND=$ac_optarg ;; + PKG_DEPEND=$ac_optarg ;; - -pdefault | --pdefault) - ac_prev=PDEFAULT ;; - -pdefault=* | --pdefault=*) - PDEFAULT=$ac_optarg ;; + -pgroups | --pgroups) + ac_prev=PKG_GROUPS ;; + -pgroups=* | --pgroups=*) + PKG_GROUPS=$ac_optarg ;; -make | --make | -m | --m) ac_prev=MAKE ;; @@ -1913,64 +1922,83 @@ done printf "\n=== Determining package settings ===\n" -if test "x${PDEPEND}" = x ; then +if test "x${PKG_DEPEND}" = x ; then tmp=$ROOTDIR"/pkg/pkg_depend" - if test -r $tmp ; then - PDEPEND=$tmp - else + if test -r $tmp ; then PKG_DEPEND=$tmp ; fi +fi +if test "x${PKG_DEPEND}" = x ; then echo "Warning: No package dependency information was specified." echo " Please check that ROOTDIR/pkg/pkg_depend exists." +else + if test ! -r ${PKG_DEPEND} ; then + echo "Error: can't read package dependency info from PKG_DEPEND=\"$PKG_DEPEND\"" + exit 1 fi + echo " getting package dependency info from $PKG_DEPEND" +# Strip the comments and then convert the dependency file into arrays: PNAME, DNAME + get_pdepend_list $PKG_DEPEND +fi + +# A default package groups file "$ROOTDIR/pkg/pkg_groups" is provided +# to define the "default_pkg_list" and package groups (for convenience, one +# can specify a group of packages using names like "ocean" and "atmosphere"). +if test "x${PKG_GROUPS}" = x ; then + tmp=$ROOTDIR"/pkg/pkg_groups" + if test -r $tmp ; then PKG_GROUPS=$tmp ; fi +fi +if test "x${PKG_GROUPS}" = x ; then + echo "Warning: No package groups information was specified." + echo " Please check that ROOTDIR/pkg/pkg_groups exists." else - if test ! -r ${PDEPEND} ; then - echo "Error: can't read package dependency info from PDEPEND=\"$PDEPEND\"" + if test ! -r ${PKG_GROUPS} ; then + echo "Error: can't read package groups info from PKG_GROUPS=\"$PKG_GROUPS\"" exit 1 fi + echo " getting package groups info from $PKG_GROUPS" fi -echo " getting package dependency info from $PDEPEND" -# Strip the comments and then convert the dependency file into -# two arrays: PNAME, DNAME -get_pdepend_list $PDEPEND - -# Search for default packages. Note that a "$ROOTDIR/pkg/pkg_groups" -# file has been added so that, for convenience, one can specify -# groups of packages using names like "ocean" and "atmosphere". -echo " checking default package list: " -if test "x${PDEFAULT}" = x ; then + +# Search for packages to compile. +echo " checking list of packages to compile:" +PKG_LIST= +if test "x${PKG_LIST}" = x ; then for i in "." $MODS ; do if test -r $i"/packages.conf" ; then - PDEFAULT=$i"/packages.conf" + PKG_LIST=$i"/packages.conf" break fi done fi -if test "x${PDEFAULT}" = x ; then - PDEFAULT="$ROOTDIR/pkg/pkg_default" -fi -if test "x${PDEFAULT}" = xNONE ; then - echo " default packages file disabled" +if test "x${PKG_LIST}" = x ; then + pkg_list='default_pkg_list' + if test "x${PKG_GROUPS}" = x ; then + echo "Error: need package groups info to expand pkg_list=\"$pkg_list\"" + exit 1 + fi else - if test ! -r $PDEFAULT ; then - echo "Warning: can't read default packages from PDEFAULT=\"$PDEFAULT\"" + if test ! -r $PKG_LIST ; then + echo "Error: can't read package list from PKG_LIST=\"$PKG_LIST\"" + exit 1 else - echo " using PDEFAULT=\"$PDEFAULT\"" + echo " using PKG_LIST=\"$PKG_LIST\"" # Strip the comments and add all the names - def=`cat $PDEFAULT | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'` + pkg_list=`cat $PKG_LIST | sed -e 's/#.*$//g' | $AWK '(NF>0){print $0}'` RETVAL=$? if test "x${RETVAL}" != x0 ; then - printf "Error: can't parse default package list " - echo "-- please check PDEFAULT=\"$PDEFAULT\"" + printf "Error: can't parse package list " + echo "-- please check PKG_LIST=\"$PKG_LIST\"" exit 1 fi - for i in $def ; do - PACKAGES="$PACKAGES $i" - done - echo " before group expansion packages are:$PACKAGES" - RET=1 - while test $RET = 1 ; do expand_pkg_groups; RET=$?; done - echo " after group expansion packages are: $PACKAGES" fi fi +for i in $pkg_list ; do + PACKAGES="$PACKAGES $i" +done +echo " before group expansion packages are:$PACKAGES" +if test "x${PKG_GROUPS}" != x ; then + RET=1 + while test $RET = 1 ; do expand_pkg_groups; RET=$?; done + echo " after group expansion packages are: $PACKAGES" +fi echo " applying DISABLE settings" echo "" > ./.tmp_pack @@ -2001,7 +2029,7 @@ for i in $PACKAGES ; do j=`echo $i | sed 's/[-+]//'` if test ! -d "$ROOTDIR/pkg/$j" ; then - echo "Error: can't find package $i at \"$ROOTDIR/pkg/$i\"" + echo "Error: dir '$ROOTDIR/pkg/$i' missing for package '$i'" exit 1 fi echo $i >> ./.tmp_pack @@ -2020,7 +2048,6 @@ if test "x$HAVE_NETCDF" != xt ; then if test "x$mnc_in" = x0 ; then cat < \$@ +# remove most of the files that "make" generates clean: -rm -rf *.p *.$FS90 *.mod ${RMFILES} work.{pc,pcl} *.template -rm -rf *.o -rm -rf *.$FS *.flowdir -rm -rf *.f$FS90 \$(AD_CLEAN) ad_input* + +# remove most of the files that "make" and "make depend" generate Clean: @make clean @make cleanlinks - -rm -f \$(SPECIAL_FILES) - -rm -f genmake_state genmake_*optfile genmake_warnings genmake_errors - -rm -f make.log run.log f90mkdepend.log *.bak "$MAKEFILE.old" + -rm -f \$(SPECIAL_FILES) f90mkdepend.log -rm -f taf_command taf_output taf_ad.log taf_ad_flow.log + +# remove also the executable, files that "genmake2" generates (except Makefile) +# and output from a run (plus output and 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 -find \$(EXEDIR) -name "*.meta" -exec rm {} \; -find \$(EXEDIR) -name "*.data" -exec rm {} \; -find \$(EXEDIR) -name "fort.*" -exec rm {} \; - -rm -f \$(EXECUTABLE) \$(EXE_AD) *.txt STD* *diagnostics.log datetime + -rm -f *.txt STD* *diagnostics.log datetime -rm -f *_MIT_CE_000.opt0000 costfunction*0000 -rm -rf mnc_test_*