The idea here is - you would: include "conf/variables" in your makefile and use PETSC_LIB in the target - so everything works correctly.
The complexity you mention is to manage --with-single-lib=0/1. So Instead of trying to list libraries directly in your makefile [which becomes unportable] - I suggest you use the recommended procedure above. PETSC_LIB will pick up all exteranlpackages currently installed with PETSc [so even this part of the makefile will become portable] The best thing would be to also use "conf/rules" as well in your makefile and use PETSc compile targets for both petsc & non-petsc sources that go into your application. Satish On Thu, 5 Aug 2010, Filippo Spiga wrote: > Dear users, > I look at different examples but I'm not sure to have well understood how > to compile and link correctly using the contents of "conf/petscvariables" and > "conf/variables". My program uses both linear and non linear solvers and > different external packages such as superlu_dist, hypre and umfpack. I looked > at "${PETSC_ROOT}/${PETSC_ARCH}/conf/petscvariables" to extract the right path > to compile and link my code. Inside this file there are all these lines: > > PETSC_CONTRIB_BASIC = -lpetsc > PETSC_SNES_LIB_BASIC = -lpetsc > PETSC_KSP_LIB_BASIC = -lpetsc > PETSC_MAT_LIB_BASIC = -lpetsc > PETSC_LIB_BASIC = -lpetsc > PETSC_VEC_LIB_BASIC = -lpetsc > PETSC_DM_LIB_BASIC = -lpetsc > PETSC_TS_LIB_BASIC = -lpetsc > PETSC_SYS_LIB_BASIC = -lpetsc > PACKAGES_LIBS = ... > > but there isn't a single entry that collect in the right order all of them. > Then if I look at "${PETSC_ROOT}/${PETSC_ARCH}/conf/variables" I can find > these lines: > > PETSC_EXTERNAL_LIB_BASIC = ${EXTERNAL_LIB} ${PACKAGES_LIBS} ${PCC_LINKER_LIBS} > PETSC_SYS_LIB_BASIC = -lpetscsys > PETSC_VEC_LIB_BASIC = -lpetscvec ${PETSC_SYS_LIB_BASIC} > PETSC_MAT_LIB_BASIC = -lpetscmat ${PETSC_VEC_LIB_BASIC} > PETSC_DM_LIB_BASIC = -lpetscdm ${PETSC_MAT_LIB_BASIC} > PETSC_KSP_LIB_BASIC = -lpetscksp ${PETSC_DM_LIB_BASIC} > PETSC_SNES_LIB_BASIC = -lpetscsnes ${PETSC_KSP_LIB_BASIC} > PETSC_TS_LIB_BASIC = -lpetscts ${PETSC_SNES_LIB_BASIC} > PETSC_LIB_BASIC = ${PETSC_TS_LIB_BASIC} > PETSC_CONTRIB_BASIC = -lpetsccontrib > > PETSC_SYS_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_SYS_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_VEC_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_VEC_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_MAT_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_MAT_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_DM_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_DM_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_KSP_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_KSP_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_SNES_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} > ${PETSC_SNES_LIB_BASIC} ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_TS_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_TS_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_LIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_LIB_BASIC} > ${PETSC_EXTERNAL_LIB_BASIC} > PETSC_CONTRIB = ${C_SH_LIB_PATH} -L${PETSC_LIB_DIR} ${PETSC_CONTRIB_BASIC} > > that are pretty clear. However if I look inside > "${PETSC_ROOT}/${PETSC_ARCH}/lib" I don't see all the -lpetsc* libraries > mentioned above" I only have one single "libpetsc.a" > > So, what's the right env variable to use? what is the right order of -lpetsc* > statements? Can I only link "libpetsc.a"? In this last case, is my Makefile > fully compatible and maintenable with all the future version of PETSc? > > Thank you very much in advance, > Regards > >