Subversion Repositories slepc-dev

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#
# This is the makefile for installing SLEPc. See the Users Manual 
# for directions on installing SLEPc.
#
ALL: all
LOCDIR = .
DIRS   = src include docs 

include ${SLEPC_DIR}/bmake/slepc_common

#
# Basic targets to build SLEPc libraries.
# all: builds the C/C++ and Fortran libraries
all:
        -@${MAKE} slepc_all_build 2>&1 | tee make_log_${PETSC_ARCH}_${BOPT}
slepc_all_build: chk_slepc_dir info slepc_chklib_dir slepc_deletelibs slepc_build_c slepc_build_fortran slepc_shared
#
# Prints information about the system and version of SLEPc being compiled
#
info:
        -@echo "=========================================="
        -@echo On `date` on `hostname`
        -@echo Machine characteristics: `uname -a`
        -@echo "-----------------------------------------"
        -@echo "Using C compiler: ${C_CC} ${COPTFLAGS} ${CCPPFLAGS}"
        -@echo "C Compiler version: " `${C_CCV}`
        -@echo "Using C++ compiler: ${CXX_CC} ${COPTFLAGS} ${CCPPFLAGS}"
        -@echo "C++ Compiler version: " `${CXX_CCV}`
        -@echo "Using Fortran compiler: ${C_FC} ${FOPTFLAGS} ${FCPPFLAGS}"
        -@echo "Fortran Compiler version: " `${C_FCV}`
        -@echo "-----------------------------------------"
        -@grep SLEPC_VERSION_NUMBER ${SLEPC_DIR}/include/slepcversion.h | ${SED} "s/........//"
        -@echo "-----------------------------------------"
        -@echo "Using PETSc/SLEPc flags: ${PETSCFLAGS} ${PCONF}"
        -@echo "-----------------------------------------"
        -@echo "Using include paths: ${SLEPC_INCLUDE}"
        -@echo "-----------------------------------------"
        -@echo "Using SLEPc directory: ${SLEPC_DIR}"
        -@echo "Using PETSc directory: ${PETSC_DIR}"
        -@echo "Using PETSc arch: ${PETSC_ARCH}"
        -@echo "------------------------------------------"
        -@echo "Using C linker: ${CLINKER}"
        -@echo "Using Fortran linker: ${FLINKER}"
        -@echo "Using libraries: ${SLEPC_LIB}"
        -@echo "=========================================="

#
# Builds the SLEPc libraries
#
slepc_build_c:
        -@echo "BEGINNING TO COMPILE SLEPc LIBRARIES IN ALL DIRECTORIES"
        -@echo "========================================="
        -@${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} ACTION=libfast  tree 
        ${RANLIB} ${SLEPC_LIB_DIR}/*.${LIB_SUFFIX}
        -@echo "Completed building SLEPc libraries"
        -@echo "========================================="

#
# Builds SLEPc Fortran source
#
slepc_build_fortran:
        -@echo "BEGINNING TO COMPILE SLEPc FORTRAN SOURCE"
        -@echo "========================================="
        -@cd src/fortran/custom; \
          ${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} libf clean 
        ${RANLIB} ${SLEPC_LIB_DIR}/libslepcfortran.a
        ${RANLIB} ${SLEPC_LIB_DIR}/libslepc.a
        -@echo "Completed compiling SLEPc Fortran source"
        -@echo "========================================="

# Builds SLEPc test examples for a given BOPT and architecture
slepc_testexamples: info chkopts
        -@echo "BEGINNING TO COMPILE AND RUN SLEPc TEST EXAMPLES"
        -@echo "Due to different numerical round-off on certain"
        -@echo "machines some of the numbers may not match exactly."
        -@echo "========================================="
        -@${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} \
           ACTION=testexamples_1  tree 
        -@echo "Completed compiling and running test examples"
        -@echo "========================================="

# Builds SLEPc test examples for a given BOPT and architecture
slepc_testfortran: info chkopts
        -@echo "BEGINNING TO COMPILE AND RUN SLEPc FORTRAN TEST EXAMPLES"
        -@echo "========================================="
        -@echo "Due to different numerical round-off on certain"
        -@echo "machines or the way Fortran formats numbers"
        -@echo "some of the results may not match exactly."
        -@echo "========================================="
        -@${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} \
           ACTION=testexamples_3  tree 
        -@echo "Completed compiling and running Fortran test examples"
        -@echo "========================================="

# Builds SLEPc test examples for a given BOPT and architecture
slepc_testexamples_uni: info chkopts
        -@echo "BEGINNING TO COMPILE AND RUN TEST UNI-PROCESSOR EXAMPLES"
        -@echo "Due to different numerical round-off on certain"
        -@echo "machines some of the numbers may not match exactly."
        -@echo "========================================="
        -@${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} \
           ACTION=testexamples_4  tree 
        -@echo "Completed compiling and running uniprocessor test examples"
        -@echo "========================================="
slepc_testfortran_uni: info chkopts
        -@echo "BEGINNING TO COMPILE AND RUN TEST UNI-PROCESSOR FORTRAN EXAMPLES"
        -@echo "Due to different numerical round-off on certain"
        -@echo "machines some of the numbers may not match exactly."
        -@echo "========================================="
        -@${OMAKE} BOPT=${BOPT} PETSC_ARCH=${PETSC_ARCH} \
           ACTION=testexamples_9  tree 
        -@echo "Completed compiling and running uniprocessor fortran test examples"
        -@echo "========================================="

# Ranlib on the libraries
slepc_ranlib:
        ${RANLIB} ${SLEPC_LIB_DIR}/*.${LIB_SUFFIX}

# Deletes SLEPc libraries
slepc_deletelibs: chkopts_basic
        -${RM} -f ${SLEPC_LIB_DIR}/*

slepc_shared: shared
slepc_chklib_dir: chklib_dir

#
# Check if SLEPC_DIR variable specified is valid
#
chk_slepc_dir:
        @if [ ! -f ${SLEPC_DIR}/include/slepcversion.h ]; then \
          echo "Incorrect SLEPC_DIR specified: ${SLEPC_DIR}!"; \
          echo "You need to use / to separate directories, not \\!"; \
          echo "Aborting build"; \
          false; fi


# ------------------------------------------------------------------
#
# All remaining actions are intended for SLEPc developers only.
# SLEPc users should not generally need to use these commands.
#

chk_loc:
        @if [ ${LOC}foo = foo ] ; then \
          echo "*********************** ERROR ************************" ; \
          echo " Please specify LOC variable for eg: make allmanualpages LOC=/sandbox/petsc"; \
          echo "******************************************************";  false; fi

chk_concepts_dir: chk_loc
        @if [ ! -d "${LOC}/docs/manualpages/concepts" ]; then \
          echo Making directory ${LOC}/docs/manualpages/concepts for library; ${MKDIR} ${LOC}/docs/manualpages/concepts; fi

# Builds all the documentation
slepc_alldoc: slepc_allmanualpages
#       cd docs/tex; ${OMAKE} ps  

# Deletes man pages (HTML version)
slepc_deletemanualpages:
        find ${LOC}/docs/manualpages -type f -name "*.html" -exec ${RM} {} \;
        ${RM} ${LOC}/docs/tex/exampleconcepts
        ${RM} ${LOC}/docs/tex/manconcepts
        ${RM} ${LOC}/docs/manualpages/manualpages.cit
#       -${PETSC_DIR}/maint/update-docs.py ${LOC} clean

# Builds all versions of the man pages
slepc_allmanualpages: chk_loc slepc_deletemanualpages chk_concepts_dir
        -${OMAKE} ACTION=manualpages_buildcite tree_basic LOC=${LOC}
        -${OMAKE} ACTION=manualpages tree_basic LOC=${LOC}
        -${PETSC_DIR}/maint/wwwindex.py ${SLEPC_DIR} ${LOC}
        -${OMAKE} ACTION=slepc_manexamples tree LOC=${LOC}
        -${OMAKE} manconcepts LOC=${LOC}
        -${OMAKE} ACTION=getexlist tree LOC=${LOC}
        -${OMAKE} ACTION=slepc_exampleconcepts tree LOC=${LOC}
        -${PETSC_DIR}/maint/helpindex.py ${SLEPC_DIR} ${LOC}
        -${OMAKE} ACTION=slepc_html alltree LOC=${LOC}
#       -${PETSC_DIR}/maint/update-docs.py ${LOC}
        cp ${LOC}/docs/manual.htm ${LOC}/docs/index.html

# Builds Fortran stub files
slepc_allfortranstubs:
#       -@${RM} -f src/fortran/auto/*.c
#       -${OMAKE} ACTION=slepc_fortranstubs tree
#       -@cd src/fortran/auto; ${OMAKE} -f makefile slepc_fixfortran
        -@which ${BFORT} > /dev/null 2>&1;  \
        if [ "$$?" != "0" ]; then \
          echo "No bfort available, skipping building Fortran stubs";\
        else \
          ${RM} -f ${SLEPC_DIR}/src/fortran/auto/*.c ;\
          touch ${SLEPC_DIR}/src/fortran/auto/makefile.src ;\
          ${OMAKE} ACTION=slepc_fortranstubs tree_basic ;\
          cd ${SLEPC_DIR}/src/fortran/auto; ${RM} makefile.src; echo SOURCEC = ` ls *.c | tr -s '\n' ' '` > makefile.src ;\
          cd ${SLEPC_DIR}/src/fortran/auto; ${OMAKE} slepc_fixfortran ;\
        fi

# -------------------------------------------------------------------------------
#
# Some macros to check if the fortran interface is up-to-date.
#
slepc_countfortranfunctions: 
        -@cd ${SLEPC_DIR}/src/fortran; egrep '^void' custom/*.c auto/*.c | \
        cut -d'(' -f1 | tr -s  ' ' | cut -d' ' -f2 | uniq | egrep -v "(^$$|Tao)" | \
        sed "s/_$$//" | sort > /tmp/countfortranfunctions

slepc_countcfunctions:
        -@ grep -s extern ${SLEPC_DIR}/include/*.h *.h | grep "(" | tr -s ' ' | \
        cut -d'(' -f1 | cut -d' ' -f3 | grep -v "\*" | tr -s '\012' |  \
        tr 'A-Z' 'a-z' |  sort > /tmp/countcfunctions

slepc_difffortranfunctions: slepc_countfortranfunctions slepc_countcfunctions
        -@echo -------------- Functions missing in the Fortran interface ---------------------
        -@diff /tmp/countcfunctions /tmp/countfortranfunctions | grep "^<" | cut -d' ' -f2
        -@echo ----------------- Functions missing in the C interface ------------------------
        -@diff /tmp/countcfunctions /tmp/countfortranfunctions | grep "^>" | cut -d' ' -f2
        -@${RM}  /tmp/countcfunctions /tmp/countfortranfunctions

slepc_checkbadfortranstubs:
        -@echo "========================================="
        -@echo "Functions with MPI_Comm as an Argument"
        -@echo "========================================="
        -@cd ${SLEPC_DIR}/src/fortran/auto; grep '^void' *.c | grep 'MPI_Comm' | \
        tr -s ' ' | tr -s ':' ' ' |cut -d'(' -f1 | cut -d' ' -f1,3
        -@echo "========================================="
        -@echo "Functions with a String as an Argument"
        -@echo "========================================="
        -@cd ${SLEPC_DIR}/src/fortran/auto; grep '^void' *.c | grep 'char \*' | \
        tr -s ' ' | tr -s ':' ' ' |cut -d'(' -f1 | cut -d' ' -f1,3
        -@echo "========================================="
        -@echo "Functions with Pointers to SLEPc Objects as Argument"
        -@echo "========================================="
        -@cd ${SLEPC_DIR}/src/fortran/auto; \
        _p_OBJ=`grep _p_ ${SLEPC_DIR}/include/*.h | tr -s ' ' | \
        cut -d' ' -f 3 | tr -s '\012' | grep -v '{' | cut -d'*' -f1 | \
        sed "s/_p_//g" | tr -s '\012 ' ' *|' ` ; \
        for OBJ in $$_p_OBJ; do \
        grep "$$OBJ \*" *.c | tr -s ' ' | tr -s ':' ' ' | \
        cut -d'(' -f1 | cut -d' ' -f1,3; \
        done