# $Id: rules,v 1.203.1.111.1.125 2001/08/22 17:57:34 balay Exp $ # # # Checks that PETSC_DIR variable is set and creates library directory # if it does not exist include /data/sameer/tau-2.11.16/include/Makefile PDTPARSE = $(PDTDIR)/$(PDTARCHDIR)/bin/cxxparse TAUINSTR = $(TAUROOT)/$(CONFIG_ARCH)/bin/tau_instrumentor PDT_PETSC_OPTS = -D__SDIR__='\".\/\"' -DPETSC_LIB_DIR='\".\/\"' -DPETSC_SLSUFFIX='\"${SLSUFFIX}\"' -DPETSC_BOPT='\"g\"' -DPETSC_DIR='\".\/\"' -DPETSC_ARCH='\"linux\"' TAU_PETSC_OPTS = -c -rn PetscFunctionReturn -rv PetscFunctionReturnVoid\(\); COMPILE_RULE1 = $(PDTPARSE) $$filename $(COPTFLAGS) $(CFLAGS) ${CCPPFLAGS} ${PDT_PETSC_OPTS} ; \ $(TAUINSTR) $$name.c.pdb $$filename -o $$name.inst.c ${TAU_PETSC_OPTS} \ ${CC} -c ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} $(TAU_DEFS) $(TAU_INCLUDE) $$name.inst.c -o $$name.o; \ /bin/rm -f $$name.c.pdb $$name.inst.c ; COMPILE_RULE2 = $(PDTPARSE) $< $(COPTFLAGS) $(CFLAGS) ${CCPPFLAGS} ${PDT_PETSC_OPTS} ; \ $(TAUINSTR) $*.c.pdb $< -o $*.inst.c ${TAU_PETSC_OPTS} \ ${CC} -c ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} $(TAU_DEFS) $(TAU_INCLUDE) $*.inst.c -o $@; chklib_dir: @if [ ${BOPT}foo = foo ] ; then \ echo "*********************** ERROR ************************" ; \ echo "You must use the make variable BOPT=[g,O,O_c++,O_complex,...]" ; \ echo "For example, use: make BOPT=g ex1"; \ echo "Remove all .o files and rerun make with appropriate BOPT"; \ echo "******************************************************"; false; fi @if [ ! -d "${INSTALL_LIB_DIR}" ]; then \ echo Making directory ${INSTALL_LIB_DIR} for library; ${MKDIR} ${INSTALL_LIB_DIR} ; fi # 1. Checks that user has set BOPT variable # 2. Check if the ${INSTALL_LIB_DIR} exists chkopts_basic: @if [ ${BOPT}foo = foo ] ; then \ echo "*********************** ERROR ************************" ; \ echo "You must set the variable BOPT=[g,O,O_c++,O_complex,...]" ; \ echo "For exampe, use: make BOPT=g ex1"; \ echo "Remove all .o files and rerun make with appropriate BOPT"; \ echo "******************************************************" ; \ false; fi @if [ ${BOPT}foo = 0foo ]; then \ echo "*********************** ERROR ************************" ; \ echo "BOPT should be the letter O_c++ not the digit zero_c++"; \ echo "******************************************************" ; \ false; fi @if [ "${BOPT}foo" = "0_c++foo" ]; then \ echo "*********************** ERROR ************************" ; \ echo "BOPT should be the letter O not the digit zero"; \ echo "******************************************************" ; \ false; fi @if [ ! -d ${INSTALL_LIB_DIR} ]; then \ echo "*********************** ERROR ************************" ; \ echo Libraries not built for this BOPT: ${BOPT}; \ echo "******************************************************" ;\ false ; fi # 3. Check if the shared libs are out of date chkopts: chkopts_basic @for LIBNAME in ${SHLIBS}; do \ if test -z "${LIBTOOL}"; then \ if [ -f ${INSTALL_LIB_DIR}/$$LIBNAME.a ]; then \ if [ -f ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} ]; then \ flag=`find ${INSTALL_LIB_DIR} -type f -name $$LIBNAME.a -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} -print`; \ if [ "$$flag" != "" ]; then \ echo "Shared libs in ${INSTALL_LIB_DIR} are out of date, attempting to rebuild."; \ if [ -w ${INSTALL_LIB_DIR} ]; then \ ${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} shared; \ else \ echo "*********************** ERROR ************************"; \ echo "Unable to rebuild shared libraries; you do not have write permission."; \ user=`ls -l ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} | tr -s ' ' | cut -d ' ' -f 3`; \ echo "Libraries were built by user $$user; please contact him/her to have them rebuilt."; \ echo "******************************************************"; \ false; \ fi; \ fi; \ fi; \ fi; \ else \ if [ -f ${INSTALL_LIB_DIR}/lt_$$LIBNAME.a ]; then \ if [ -f ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} ]; then \ flag=`find ${INSTALL_LIB_DIR} -type f -name lt_$$LIBNAME.a -newer ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} -print`; \ if [ "$$flag" != "" ]; then \ echo "Shared libs in ${INSTALL_LIB_DIR} are out of date, attempting to rebuild."; \ if [ -w ${INSTALL_LIB_DIR} ]; then \ ${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} shared; \ else \ echo "*********************** ERROR ************************"; \ echo "Unable to rebuild shared libraries; you do not have write permission."; \ user=`ls -l ${INSTALL_LIB_DIR}/$$LIBNAME.${SLSUFFIX} | tr -s ' ' | cut -d ' ' -f 3`; \ echo "Libraries were built by user $$user; please contact him/her to have them rebuilt."; \ echo "******************************************************"; \ false; \ fi; \ fi; \ fi; \ fi; \ fi; \ done # Does nothing; needed for some rules that require actions. foo: # Builds library lib: chklib_dir ${SOURCE} @-if [ "${SPECIALLIB}" = "yes" ] ; then \ ${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} speciallib; \ else \ if [ "${SOURCEC}" != "" ] ; then \ ${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} libc; fi ; \ if [ "${SOURCEF}" != "" ] ; then \ ${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} libf; fi ; \ if [ "${OBJS}" != " " ] ; then \ ${RANLIB} ${LIBNAME}; \ ${RM} ${OBJS}; \ fi;\ fi # # Does not work for some machines with .F fortran files. # # Builds library - fast version # libfast: chklib_dir ${SOURCEC} ${SOURCEF} -@if [ "${SPECIALFASTLIB}" = "yes" ] ; then \ ${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} specialfastlib; \ else \ if [ "${SOURCEC}" != "" ]; then \ if test -n "${LIBTOOL}"; then \ files="${SOURCEC} ${SSOURCE}"; \ for filename in $$files; do \ echo "Using the libfast rule! "; \ name=`basename $$filename .c`; \ ${COMPILE_RULE1} \ done; \ ${AR} ${AR_FLAGS} ${LIBNAME} ${OBJSC} ${SOBJS}; \ ${AR} ${AR_FLAGS} ${LT_LIBNAME} ${OBJSC:.o=.lo} ${SOBJS:.o=.lo}; \ ${RM} ${OBJSC} ${SOBJS} ${OBJSC:.o=.lo} ${SOBJS:.o=.lo}; \ else \ echo "Using the second rule for ${SOURCEC} ${SSOURCE} "; \ files="${SOURCEC} ${SSOURCE}"; \ for filename in $$files; do \ name=`basename $$filename .c`; \ echo " File $$filename name = $$name" ; \ ${COMPILE_RULE1} \ done; \ ${AR} ${AR_FLAGS} ${LIBNAME} ${OBJSC} ${SOBJS}; \ ${RM} ${OBJSC} ${SOBJS}; \ fi; \ fi; \ fi; # Removes garbage files clean: @-${RM} *.o *.lo *~ ex[0-9] ex[0-9][0-9] ex[0-9]f ex[0-9][0-9]f \ ${CLEANFILES} ${TESTS} ex[0-9]f90 ex[0-9][0-9]f90 ex[0-9]c ex[0-9][0-9]c ex[0-9]d ex5d \ PI* *.ln l.outa* mputil.mp_* core core.* *.tmp *.map gmon.out \ trashz \#*\# *.mex* *.stolen *.trace Log.* joe jeff *.stolen \ output/*~ .mpirtmp mon.out *.aus *.mon.* __* p4pg ins10*.c \ ex[0-9].exe ex[0-9][0-9].exe ex[0-9]f.exe ex[0-9][0-9]f.exe \ *.ad.c *.ad.h ad_deriv.h .adic* *.cp_ *.cp__ *.c*.c pageform.txt \ .adic* *.dep *.proj ctoatmp PETScArena* *.L *.anl main *.mod .mpi* *.class *.ouit *.ad.* g_* silly.cmp *.tmp.* @-${RM} -rf output.* AD_cache cleanadic: @-${RM} *.ad.* # # Compiles all the directories on which a particular external package depends. This way # one can update PETSc for an external package without recompiling all of PETSc # package: @-for dir in ${${PACKAGE}_DIRS} ; do \ r=`egrep requirespackage $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ HCONF=`grep PETSC_ ${PETSC_DIR}/bmake/${PETSC_ARCH}/petscconf.h | cut -d" " -f2`; \ HPCONF=`echo ${PCONF} | sed s/-D//g`; \ f=0; \ for l in $${HPCONF} foo $${HCONF}; do \ echo $$r | egrep "'$$l'" > /dev/null; \ if [ "$$?" = 0 ]; then \ f=1; \ break; \ fi; \ done ; \ if [ "$$f" = 0 ]; then \ continue; \ fi; \ fi; \ r=`egrep requireslanguage $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_LANGUAGE} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ r=`egrep requiresscalar $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_SCALAR} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ r=`egrep requiresprecision $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_PRECISION} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ pushd $$dir; \ ${OMAKE} tree ACTION=libfast BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} LOC=${LOC}; \ popd; \ done; # # Checks if directory requires particular package or language # The makefile may contain # #requirespackage 'PETSC_HAVE_XXX' # #requireslanguage CONLY (or CPP) # #requiresscalar real (or complex) # #requiresprecision double (or single) # tree: ${ACTION} -@if [ "${DIRS}" != "" ]; then \ for dir in ${DIRS} foo ; do \ if [ -d $$dir ]; then \ r=`egrep requirespackage $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ HCONF=`grep PETSC_ ${PETSC_DIR}/bmake/${PETSC_ARCH}/petscconf.h | cut -d" " -f2`; \ HPCONF=`echo ${PCONF} | sed s/-D//g`; \ f=0; \ for l in $${HPCONF} foo $${HCONF}; do \ echo $$r | egrep "'$$l'" > /dev/null; \ if [ "$$?" = 0 ]; then \ f=1; \ break; \ fi; \ done ; \ if [ "$$f" = 0 ]; then \ continue; \ fi; \ fi; \ r=`egrep requireslanguage $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_LANGUAGE} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ r=`egrep requiresscalar $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_SCALAR} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ r=`egrep requiresprecision $$dir/makefile`; \ if [ "$$?" = 0 ]; then \ echo $$r | egrep ${PETSC_PRECISION} > /dev/null; \ if [ "$$?" = 1 ]; then \ continue; \ fi; \ fi; \ else \ continue; \ fi; \ (cd $$dir ; \ echo ${ACTION} in: `pwd`; \ ${OMAKE} tree ACTION=${ACTION} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} LOC=${LOC} DATAFILESPATH=${DATAFILESPATH});\ done ; \ fi # Performs the specified action throughout the directory tree tree_basic: ${ACTION} @-if [ "${DIRS}" != "" ]; then \ for dir in ${DIRS} foo ; do if [ -d $$dir ]; then \ (cd $$dir ; echo ${ACTION} in: `pwd`; \ ${OMAKE} tree_basic ACTION=${ACTION} BOPT=${BOPT} \ PETSC_ARCH=${PETSC_ARCH} LOC=${LOC}) ;fi; \ done ; fi #This target goes through all the dirs that contains a makefile alltree_makefile: ${ACTION} -@DIRS=`ls`; \ for dir in $$DIRS foo ; do if [ -f $$dir/makefile ]; then \ (cd $$dir ; echo ${ACTION} in: `pwd`; \ ${OMAKE} alltree_makefile ACTION=${ACTION} BOPT=${BOPT} \ PETSC_ARCH=${PETSC_ARCH} LOC=${LOC} ) ;fi; \ done # This target goes through all dirs specified by DIRS,EDIRS, and # excludes dirs specified by $XDIRS alltree: ${ACTION} @-if [ "${DIRS} ${EDIRS}" != " " ]; then \ NDIRS="${DIRS} ${EDIRS}" ;\ if [ "${XDIRS}" != "" ]; then \ for XDIR in ${XDIRS} qwertyuiop ; do \ NDIRS=`echo $$NDIRS | sed s/$$XDIR//g`; \ done; fi ; \ for dir in $$NDIRS foo ; do if [ -d $$dir ]; then \ (cd $$dir ; echo ${ACTION} in: `pwd`; \ ${OMAKE} alltree ACTION=${ACTION} BOPT=${BOPT} \ PETSC_ARCH=${PETSC_ARCH} LOC=${LOC} ) ;fi; \ done ; fi etags_sourcec: -@if [ "${SOURCEC}" != "" ]; then \ etags -a -f ${TAGSFILE} ${SOURCEC} ; fi etags_sourcej: -@if [ "${SOURCEJ}" != "" ]; then \ etags -a -f ${TAGSFILE} ${SOURCEJ} ; fi etags_sourceh: -@if [ "${SOURCEH}" != "" ]; then \ etags -a -f ${TAGSFILE} ${SOURCEH}; fi etags_sourcef: -@if [ "${SOURCEF}" != "" ]; then \ etags -a -f ${TAGSFILE} ${SOURCEF}; fi etags_docs: -@if [ "${DOCS}" != "" ]; then \ etags -a -f ${TAGSFILE} ${DOCS}; fi etags_bmakefiles: -@if [ "${BMAKEFILES}" != "" ]; then \ etags -a -f ${TAGSFILE} ${BMAKEFILES}; fi etags_examplesc: -@if [ "${EXAMPLESC}" != "" ]; then \ etags -a -f ${TAGSFILE} ${EXAMPLESC}; fi etags_examplesch: -@if [ "${EXAMPLESCH}" != "" ]; then \ etags -a -f ${TAGSFILE} ${EXAMPLESCH}; fi etags_examplesf: -@if [ "${EXAMPLESF}" != "" ]; then \ etags -a -f ${TAGSFILE} ${EXAMPLESF}; fi etags_examplesfh: -@if [ "${EXAMPLESFH}" != "" ]; then \ etags -a -f ${TAGSFILE} ${EXAMPLESFH}; fi etags_makefile: -@etags -a -f ${TAGSFILE} makefile etags_scripts: -@if [ "${SCRIPTS}" != "" ]; then \ etags -a -f ${TAGSFILE} ${SCRIPTS}; fi # -------------------------------------------------------------------- # # All remaining actions are intended for PETSc developers only. # PETSc users should not generally need to use these commands. # chkpetsc_path: @petsc_path=`pwd`; \ mod_path=`echo $$petsc_path | sed 's+/mcs-homes07/bsmith+/petsc/+g'`; \ if [ $${mod_path} = $${petsc_path} ] ; then \ mod_path=`echo $$petsc_path | sed 's+/homes/bsmith+/petsc/+g'`; \ if [ $${mod_path} = $${petsc_path} ] ; then \ echo "Error! Wrong PETSc Dir $$petsc_path ! Please use /home/bsmith/petsc"; \ false; \ fi; \ fi # Builds Fortran-77 wrappers # Source of bfort is in ~gropp/sowing/src/bfort fortranstubs: @-/home/petsc/bin/linux/bfort -dir ${PETSC_DIR}/src/fortran/auto \ -mnative -ansi -nomsgs -anyname -mapptr -mpi -ferr -ptrprefix Petsc\ -ptr64 PETSC_USE_POINTER_CONVERSION -fcaps PETSC_HAVE_FORTRAN_CAPS \ -fuscore PETSC_HAVE_FORTRAN_UNDERSCORE ${SOURCEC} .SUFFIXES: .F .F90 .f90 ${SUFFIXES} .PETSc .C .cc .cpp .r .rm .so .html .ad .m # # .c.o .cpp.o .cc.o .C.o .ad.o: @complex=`echo ${PETSCFLAGS} |grep PETSC_USE_COMPLEX`; \ if [ "${PETSC_HAVE_ADIC}" != "" -a "foo$${complex}" = "foo" ]; then \ egrep "Process adiC" $< > /dev/null ; \ if [ "$$?" = 0 ]; then \ r=`grep "Process adiC" $< | sed -e "s?[ ]*Process adiC: \([a-zA-Z0-9]\)[ ]*?\1?g"`;\ echo Running adiC on function $${r};\ ${PETSC_DIR}/bin/adprocess.py $< $${r}; \ echo '#include "petscda.h"' > $*.ad.c ; \ echo '#include "petscsnes.h"' >> $*.ad.c ;\ echo ${ADIC_CC} -i ${PETSC_DIR}/bmake/adic.init $<.tmp; \ ${ADIC_CC} -i ${PETSC_DIR}/bmake/adic.init $<.tmp ; \ cat $<.ad.tmp >> $*.ad.c ;\ ${ADIC_CC} -h -i ${PETSC_DIR}/bmake/adicmf.init $<.tmp ; \ echo "#undef ad_GRAD_MAX" >> $*.ad.c ;\ echo "#define ad_GRAD_MAX 1" >> $*.ad.c ;\ echo "typedef struct {double value;double grad[1];} mfDERIV_TYPE;" >> $*.ad.c ;\ sed -e "s/DERIV_TYPE/mfDERIV_TYPE/g" $<.ad.tmp >> $*.ad.c ;\ echo "#include \"$<\"" >> $*.ad.c ;\ echo ${CC} -o $*.o -c ${ADIC_DEFINES} -I${PETSC_DIR}/include/adic ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} $*.ad.c ;\ ${CC} -o $*.o -c ${ADIC_DEFINES} -I${PETSC_DIR}/include/adic ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} $*.ad.c ;\ else \ ${COMPILE_RULE2} \ fi; \ else \ ${COMPILE_RULE2} \ fi .c.a .cpp.a .cc.a .C.a: -${CC} -c ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} $< -${AR} ${AR_FLAGS} ${LIBNAME} $*.o -if test -n "${LIBTOOL}"; then ${AR} ${AR_FLAGS} ${LT_LIBNAME} $*.lo; fi -${RM} $*.o $*.lo .F.o .F90.o: -@if [ "${PETSC_HAVE_ADIFOR}" != "" ]; then \ egrep "Process adifor" $< > /dev/null ; \ if [ "$$?" = 0 ]; then \ r=`grep "Process adifor" $< | sed -e "s?![ ]*Process adifor: \([a-zA-Z0-9]\)[ ]*?\1?g"`;\ echo Running adifor on function $${r};\ ${RM} $*.tmp $*.tmp.f $*.ad.F silly.cmp ;\ echo "#include \"$<\"" > $*.ad.F;\ ${FC} -E ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< | grep -v '^ *#' > $*.tmp ; \ ${PETSC_DIR}/bin/adprocess.py $*.tmp $${r}; \ echo $*.tmp.f > silly.cmp; \ echo ${ADIFOR_FC} AD_TOP=$${r}; \ ${ADIFOR_FC} AD_TOP=$${r} ; \ sed -e 's/^C/\!/g' -e 's/^ \*/ \&/g' g_$*.tmp.f | ${PETSC_DIR}/bin/adiforfix.py >> $*.ad.F;\ ${ADIFOR_FC} AD_TOP=$${r} AD_SCALAR_GRADIENTS=true AD_PMAX=1 AD_PREFIX=m ; \ sed -e 's/^C/\!/g' -e 's/^ \*/ \&/g' m_$*.tmp.f | ${PETSC_DIR}/bin/adiforfix.py >> $*.ad.F;\ echo ${FC} -o $*.o -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $*.ad.F ;\ ${FC} -o $*.o -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $*.ad.F ;\ else \ echo ${FC} -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< ; \ ${FC} -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< ; \ fi; \ else \ echo ${FC} -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< ; \ ${FC} -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< ; \ fi .F.a: -${FC} -c ${FOPTFLAGS} ${FFLAGS} ${FCPPFLAGS} $< -${AR} ${AR_FLAGS} ${LIBNAME} $*.o -${RM} $*.o .f.o .f90.o: -${FC} -c ${FFLAGS} ${FOPTFLAGS} $< .f.a: -${FC} -c ${FFLAGS} ${FOPTFLAGS} $< -${AR} ${AR_FLAGS} ${LIBNAME} $*.o -${RM} $*.o # # These rules are for compiling the test examples. # .cpp.rm .cc.rm .C.rm .F.rm .f.rm .c.rm: -@${RM} $* *.o $*.mon.* gmon.out mon.out .c.PETSc: -@${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} $* > trashz 2>&1 -@grep -v clog trashz | grep -v "information sections" | \ grep -v "WARNING: TOC" | \ grep -v "D4024 : unrecognized" | \ grep -v "Extra instructions" | \ grep -v "Unused external reference" | \ grep -v "f90 continuing despite warning messages" | \ grep -v "symbol if the" | \ grep -v "ignoring symbol version info" | \ grep -v "preempts that definition" | \ grep -v "is an array from" | \ grep -v "At least one PA 2.0" | \ grep -v "Cannot cast" | \ grep -v "WARNING 134: weak definition of" | \ grep -v "Warning(s) detected" | \ grep -v "object file assumed" | \ grep -v "consider using mkstemp" |\ grep -v EXTERNAL |\ grep -v volatile |\ grep -v -i inconsistent | grep -v Anachronism | \ egrep -i '(Error|warning|Can|Unresolved)' >> /dev/null;\ if [ "$$?" != 1 ]; then \ cat trashz ; fi; ${RM} trashz .F.PETSc: -@${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} $* > trashz 2>&1 -@grep -v EXTERNAL trashz | grep -v Wall | \ grep -v "Unused external reference" | \ grep -v "D4024 : unrecognized" | \ grep -v "WARNING: TOC overflow." | \ grep -v "Extra instructions are being" | \ grep -v "symbol if the symbol" | \ grep -v -i inconsistent | \ grep -v -i "unused dummy" | \ grep -v "WARNING: -cpp is ignored" | \ grep -v "ignoring symbol version info" | \ grep -v "At least one PA 2.0" | \ grep -v "Inconsistent structure" | \ grep -v "object file assumed" | \ grep -v "ex20.F:30:" | \ grep -v "f90 continuing despite warning messages" | \ grep -v "is an array from" | \ grep -v "consider using mkstemp" |\ grep -v "Unused external reference" | \ grep -v "WARNING 134: weak definition of" | \ grep -v 'continuing despite warning messages' | \ grep -v "Unused dummy argument" | \ egrep -i '(Error|warning|Can|Unresolved)' >> /dev/null ; \ if [ "$$?" != 1 ]; then \ cat trashz ; fi; ${RM} trashz; deleteshared: chkopts_basic ${RM} ${INSTALL_LIB_DIR}/*.${SLSUFFIX} ${INSTALL_LIB_DIR}/so_locations noshared: # --------------------------------------------------------------------------------------- # Rules for the automatic generation of documentation, tutorials etc # See rule for allmanualpages and allhtml in ${PETSC_DIR}/makefile # # Builds manual pages in HTML in two stages # 1.) manualpages_buildcite: builds the file manualpages.cit for hyperlinks # 2.) manualpages: builds the html pages, complete with hyperlinks chk_manualpage_dir: @if [ ! -d "${LOC}/docs/manualpages/${MANSEC}" ]; then \ echo Making directory ${LOC}/docs/manualpages/${MANSEC} for library; ${MKDIR} ${LOC}/docs/manualpages/${MANSEC}; fi manualpages_buildcite: chk_manualpage_dir @-if [ "${MANSEC}" != "" ] ; then \ DOCTEXT_PATH=${PETSC_DIR}/docs/tex/doctext; \ /home/gropp/bin/linux/doctext -html -indexdir ../${MANSEC} \ -index ${LOC}/docs/manualpages/manualpages.cit \ -mpath ${LOC}/docs/manualpages/${MANSEC} ${SOURCEC} ${SOURCEH}; fi # # manualpages: -@if [ "${MANSEC}" != "" ] ; then \ DOCTEXT_PATH=${PETSC_DIR}/docs/tex/doctext; \ /home/gropp/bin/linux/doctext -html \ -mpath ${LOC}/docs/manualpages/${MANSEC} -heading PETSc \ -defn ${PETSC_DIR}/docs/tex/doctext/html.def \ -locdir ${LOCDIR} -mapref ${LOC}/docs/manualpages/manualpages.cit \ ${SOURCEC} ${SOURCEH}; \ # # Example usage for manual pages; adds each example that uses a function to that functions # manual page up to a limit of 10 examples. # manexamples: -@base=`basename ${LOCDIR}`; \ if [ "$${base}" = "tutorials" ] ; then \ echo "Generating manual example links" ; \ for i in ${EXAMPLESC} ${EXAMPLESF} foo ; do \ if [ "$$i" != "foo" ] ; then \ a=`cat $$i | /home/gropp/bin/linux/mapnames -map ${LOC}/docs/manualpages/manualpages.cit \ -printmatch -o /dev/null | sort | uniq` ; \ for j in $$a ; do \ b=`ls ${LOC}/docs/manualpages/*/$${j}.html | cut -f9` ; \ l=`grep tutorials $${b} | wc -l`; \ if [ $$l -le 10 ] ; then \ if [ $$l -eq 0 ] ; then \ echo "

Examples

" >> $$b; \ fi; \ echo "BB
" | sed s?BB?${LOCDIR}$$i.html?g >> $$b; \ grep -v /BODY $$b > ltmp; \ echo "" >> ltmp; \ mv -f ltmp $$b; \ fi; \ done; \ fi; \ done; \ fi # # Goes through all examples adding the Concepts: to the /tmp/exampleconcepts file # exampleconcepts: -@base=`basename ${LOCDIR}`; \ if [ "$${base}" = "tutorials" ] ; then \ echo "Generating concepts list" ; \ for i in ${EXAMPLESC} ${EXAMPLESF} foo ; do \ if [ "$$i" != "foo" ] ; then \ grep Concepts: $$i | sed -e s?Concepts:??g -e s?\!??g > ltmp; \ line=`cat ltmp | wc -l`; \ line=`expr $$line - 1` ; \ line=`expr $$line + 1` ; \ while [ $$line -gt 0 ] ; do \ a=`head -$$line ltmp | tail -1`; \ echo ${LOCDIR}$$i $$a >> ${LOC}/docs/tex/exampleconcepts; \ line=`expr $$line - 1` ; \ done; \ ${RM} ltmp; \ fi; \ done; \ fi # # Goes through all manual pages removing the Concepts: field and adding the # concepts to the /tmp/manconcepts file # manconcepts: -@${RM} ${LOC}/docs/tex/manconcepts ${LOC}/docs/tex/exampleconcepts -@for i in docs/manualpages/*/*.html ; do \ ${RM} ltmp; \ grep Concepts: $$i | sed s?Concepts:??g > ltmp; \ line=`cat ltmp | wc -l`; \ line=`expr $$line - 1` ; \ line=`expr $$line + 1` ; \ if [ $$line -gt 0 ] ; then \ while [ $$line -gt 0 ] ; do \ a=`head -$$line ltmp | tail -1`; \ echo $$i $$a >> ${LOC}/docs/tex/manconcepts; \ line=`expr $$line - 1` ; \ done; \ grep -v Concepts: $$i > tmp; \ mv tmp $$i; \ fi; \ ${RM} ltmp; \ done getexlist: -@${PETSC_DIR}/maint/getexlist -locdir ${LOCDIR} -byfile -destdir ${LOC}/docs/manualpages/concepts/ ${EXAMPLESC} ${EXAMPLESF} -@${RM} -f logfile.txt # # Rules for generating html code from C and Fortran # html: -@sed -e s?man+../?man+ROOT/docs/manualpages/? ${LOC}/docs/manualpages/manualpages.cit > /tmp/$$USER.htmlmap -@cat /home/MPI/www/www.index >> /tmp/$$USER.htmlmap -@ROOT=`echo ${LOCDIR} | sed -e s?/[a-z]*?/..?g -e s?src/??g -e s?include/??g` ;\ loc=`pwd | sed -e s?\$${PETSC_DIR}?$${LOC}/?g -e s?/disks??g`; \ for i in ${SOURCEC} ${SOURCEF} ${SOURCEH} ${EXAMPLESC} ${EXAMPLESF} ${EXAMPLESCH} ${EXAMPLESFH} ${EXAMPLESMATLAB} foo ; do\ if [ -f $$i ]; then \ iroot=`echo $$i | sed -e s?[a-z.]*/??g`;\ IROOT=`echo $${i} | sed -e s?[.][.]??g` ;\ if [ "$${IROOT}" != "$${i}" ] ; then \ IROOT=".."; \ else \ IROOT=$${ROOT};\ fi;\ ${RM} $${loc}/$$i.html; \ echo "
Actual source code: $${iroot}

" > $${loc}/$$i.html; \ grep -v __FUNCT__ $$i | sed -e "s/CHKERRQ(ierr);//g" -e "s/PetscFunctionReturn(0)/return(0)/g" \ -e "s/ierr = //g" | /home/gropp/bin/linux/c2html -n | ${PETSC_DIR}/maint/fixinclude $$i $${ROOT} | \ grep -v PetscValid | grep -v PetscFunctionBegin | grep -v PetscCheck | grep -v "int ierr;" |\ grep -v '#if !defined(__' | grep -v '#define __' | \ /home/gropp/bin/linux/mapnames -map /tmp/$$USER.htmlmap -inhtml | sed -e s?ROOT?$${IROOT}?g >> $${loc}/$$i.html ; \ fi; \ done -@ROOT=`echo ${LOCDIR} | sed -e s?/[a-z]*?/..?g -e s?src/??g -e s?include/??g` ;\ loc=`pwd | sed -e s?\$${PETSC_DIR}?$${LOC}/?g -e s?/disks??g`; ${RM} $${loc}/index.html; \ cat ${PETSC_DIR}/docs/manualpages/sec/bop.${MANSEC} | sed -e "s?Examples?Manual pages?g" -e "s?PETSC_DIR?$${ROOT}/?g"> $${loc}/index.html; \ echo "

" >> $${loc}/index.html -@loc=`pwd | sed -e s?\$${PETSC_DIR}?$${LOC}/?g -e s?/disks??g`;\ if [ "${EXAMPLESC}" != "" ] ; then \ for file in ${EXAMPLESC} foo ; do \ if [ -f $$file ]; then \ cmess=`grep "static char help" $${file} | cut -d\" -f2 | cut -d\. -f1`; \ echo "$${file}: $${cmess}
" >> $${loc}/index.html;\ fi; \ done ;\ else \ for file in ${DIRS} foo; do \ if [ -d $$file ]; then \ echo "$${file}/
" >> $${loc}/index.html; \ fi; \ done; \ echo " " >> $${loc}/index.html; \ for file in ${SOURCEH} ${SOURCEC} ${SOURCEF} foo ; do \ if [ -f $$file ]; then \ echo "$${file}
" >> $${loc}/index.html; \ fi; \ done; \ fi ;\ echo " " >> $${loc}/index.html; \ echo "makefile
" >> $${loc}/index.html -@loc=`pwd | sed -e s?\$${PETSC_DIR}?$${LOC}/?g -e s?/disks??g`; \ cat makefile | /home/gropp/bin/linux/c2html | /home/gropp/bin/linux/mapnames -map /tmp/$$USER.htmlmap -inhtml > $${loc}/makefile.html -@${RM} /tmp/$$USER.htmlmap tmp cleanhtml: -@${RM} makefile.html *.c.html *.F.html *.h.html *.h90.html inex.html *.m.html # ------------------------------------------------------------------------------- # # Rule for generating ADIC derivatives from PETSc .c and .hfiles # adic: @-if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ for i in ${SOURCEC} foo; do if [ -f $$i ]; then \ ${ADIC_CC} -s -h -f 1 ${CFLAGS} ${CCPPFLAGS} $$i ; \ fi; done ; \ fi; fi @-if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEH}" != "" ]; then \ for i in ${SOURCEH} foo; do if [ -f $$i ]; then \ ${ADIC_CC} -s -h -f 1 ${CFLAGS} ${CCPPFLAGS} $$i ; \ fi; done ; \ fi; fi adic2: -if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ for i in ${SOURCEC} foo; do if [ -f $$i ]; then \ ${ADIC_CC} -h -f 1 ${CFLAGS} ${CCPPFLAGS} $$i ; \ fi; done ; \ fi; fi -if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEH}" != "" ]; then \ for i in ${SOURCEH} foo; do if [ -f $$i ]; then \ ${ADIC_CC} -h -f 1 ${CFLAGS} ${CCPPFLAGS} $$i ; \ fi; done ; \ fi; fi adiclib: -@if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ ${CC} -c ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} ${ADIC_INCLUDE} *.ad.c ; \ fi; fi -@if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ ${AR} ${AR_FLAGS} ${INSTALL_LIB_DIR}/${LIBBASE}.a *.ad.o ; \ fi; fi -@${RM} *.ad.o adiclib2: -if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ ${CC} -c ${COPTFLAGS} ${CFLAGS} ${CCPPFLAGS} ${ADIC_INCLUDE} *.ad.c ; \ fi; fi -if [ "${NOADIC}" != "true" ]; then if [ "${SOURCEC}" != "" ]; then \ ${AR} ${AR_FLAGS} ${INSTALL_LIB_DIR}/${LIBBASE}.a *.ad.o ; \ fi; fi -@${RM} *.ad.o # ---------------------------------------------------------------------------------------- # Rules for finding errors in the source and errors in the coding style # countfunctions: chklib_dir -@if [ ! -f ${INSTALL_LIB_DIR}/countfunctions ]; then \ touch ${INSTALL_LIB_DIR}/countfunctions ; fi @-if [ "${SOURCEC}" != "" ]; then \ for i in ${SOURCEC} foo; do if [ -f $$i ]; then \ grep "define __FUNCT__" $$i | cut -f2 -d\" >> ${INSTALL_LIB_DIR}/countfunctions ; \ fi; done ; \ fi checkbadPetscFunctionBegin: -@if [ "${SOURCEC}" != "" ] ; then \ ${OMAKE} PETSC_ARCH=${PETSC_ARCH} BOPT=${BOPT} \ checkbadPetscFunctionBegin_private ; fi checkbadPetscFunctionBegin_private: -@for filename in ${SOURCEC} ; do \ a=`grep '#define __FUNCT__' $$filename | wc -l`; \ b=`grep 'PetscFunctionBegin' $$filename | wc -l`; \ if [ $$a -ne $$b ] ; then \ echo "$$filename: __FUNCT__ = $$a; PetscFunctionBegin = $$b" ; \ fi; \ done checkbadFileHeader: -@for filename in ${SOURCEC} makefile ${SOURCEH} ${SOURCEF} ${EXAMPLESC} ${EXAMPLESF}; do \ a=`grep 'Id:' $$filename | wc -l`; \ if [ $$a -ne 1 ] ; then \ echo "$$filename: missing RCS file header" ; \ fi; \ done checkbadSource: -@for filename in ${SOURCEC} makefile ${SOURCEH} ${SOURCEF} ${EXAMPLESC} ${EXAMPLESF}; do \ a=`grep '( ' $$filename | wc -l`; \ if [ $$a -ge 1 ] ; then \ echo "$$filename: extra blank after (" ; \ fi; \ a=`grep ' )' $$filename | wc -l`; \ if [ $$a -ge 1 ] ; then \ echo "$$filename: extra blank before )" ; \ fi; \ a=`grep 'register int' $$filename | wc -l`; \ if [ $$a -ge 1 ] ; then \ echo "$$filename: do not use register keyword in PETSc" ; \ fi; \ a=`grep 'register double' $$filename | wc -l`; \ if [ $$a -ge 1 ] ; then \ echo "$$filename: do not use register keyword in PETSc" ; \ fi; \ a=`grep '; CHK' $$filename | wc -l`; \ if [ $$a -ge 1 ] ; then \ echo "$$filename: space before CHKERRx() or CHKPTRx()" ; \ fi; \ done checkTestCoverage: -@for filename in ex*.c; do \ if test -f $$filename; then \ if ! grep run`basename $$filename .c`\: makefile 2>&1 > /dev/null; then \ echo "Missing run target for `pwd`/$$filename"; \ elif ! grep run`basename $$filename .c`\ makefile 2>&1 > /dev/null; then \ echo "Missing test for `pwd`/$$filename"; \ fi; \ fi; \ done -@for filename in ex*.f; do \ if test -f $$filename; then \ if ! grep run`basename $$filename .f`\: makefile 2>&1 > /dev/null; then \ echo "Missing run target for `pwd`/$$filename"; \ elif ! grep run`basename $$filename .f`\ makefile 2>&1 > /dev/null; then \ echo "Missing test for `pwd`/$$filename"; \ fi; \ fi; \ done -@for filename in ex*.F; do \ if test -f $$filename; then \ if ! grep run`basename $$filename .F`\: makefile 2>&1 > /dev/null; then \ echo "Missing run target for `pwd`/$$filename"; \ elif ! grep run`basename $$filename .F`\ makefile 2>&1 > /dev/null; then \ echo "Missing test for `pwd`/$$filename"; \ fi; \ fi; \ done -@for filename in ex*.f90; do \ if test -f $$filename; then \ if ! grep run`basename $$filename .f90`\: makefile 2>&1 > /dev/null; then \ echo "Missing run target for `pwd`/$$filename"; \ elif ! grep run`basename $$filename .f90`\ makefile 2>&1 > /dev/null; then \ echo "Missing test for `pwd`/$$filename"; \ fi; \ fi; \ done # # fixfortran target is used in one of the stages of generating the fortran # interface stubs - in src/fortran/auto # fixfortran: @echo "Fixing pointers in src/fortran/auto" -@for FILENAME in ${SOURCEC} ; do \ if [ ! -f $$FILENAME ]; then \ echo "Error: file $$FILENAME specified in SOURCEC does not exist."; \ else \ cat $$FILENAME | \ sed "s/__ierr/ierr/g" | \ sed "s/^void /void PETSC_STDCALL /" | \ sed "s/PetscToPointer(int)/PetscToPointer(void *)/" | \ sed "s/PetscRmPointer(int)/PetscRmPointer(void *)/" | \ sed "s/PetscToPointer(a) (a)/PetscToPointer(a) (*(long *)(a))/" | \ sed "s/PetscFromPointer(a) (int)(a)/PetscFromPointer(a) (long)(a)/" | \ sed "s/PetscToPointer( \*(int\*)/PetscToPointer( /" | \ sed "s/MPI_Comm comm/MPI_Comm *comm/" | \ sed "s/(MPI_Comm)PetscToPointer( (comm) )/(MPI_Comm)MPI_Comm_f2c(*(MPI_Fint*)(comm))/" | \ sed -e '/#include/{;i\' -e '#include "petscfix.h"' -e '}' > _$$FILENAME; \ /bin/mv _$$FILENAME $$FILENAME ;\ fi; \ done include ${PETSC_DIR}/bmake/${PETSC_ARCH}/rules