Makefile.user is meant to be the example that doesn't import a zillion variables and in which you can readily add other packages that provide pkg-config. (Just add them to one line.) If you already use pkg-config for other dependencies, it also makes clear how to add PETSc. This is symmetric, where as including PETSc makefiles is fundamentally nonsymmetric (they're full of rules and non-namespaced variables likely to conflict with other packages).
While we could create a makefile that defines only namespaced variables and does not define rules, that would actually require more effort per package because you'd be needing CPPFLAGS = $(PETSC_CPPFLAGS) $(X_CPPFLAGS) $(Y_CPPFLAGS). In Makefile.user, you can add additional packages with one line. PACKAGES := $(petsc.pc) $(x.pc) $(y.pc) where the x.pc variable can either be the plain package name (to look for it in default locations) or a path to the x.pc file. Mark Adams <mfad...@lbl.gov> writes: > I want an example that I can clone for an existing makefile. I don't even > see PETSC_LIB in Makefile.user > > Makefile.user is where you start if 0) you are starting from scratch and > are all-in on PETSc. > > I think the vast majority of our users either 1) have a makefile and want > to add PETSc or 2) want to keep more control than this turn-key method. > > I think something like Victor's material is useful even if it goes out of > date ( > https://pages.tacc.utexas.edu/~eijkhout/taccnotes/petsclinking/petsclinking.html > ). > > Barry's "Writing Application Codes with PETSc" addresses (0) and then jumps > to 3) no makefile just cut and paste (nice, not what I'm looking for, but > cleaner than making an example). > > (I have literally never done any of the methods, shown in the PETSc docs, > before. I have alway owned the makefile with my targets, and all of my > current users do this now.) > > The first thing I googled was "petsc user makefile" and found and > interesting stackoverflow post ( > https://stackoverflow.com/questions/21338718/using-petsc-on-makefile-within-my-user-defined-makefile > ) > > Maybe just a FAQ "Adding PETSc to a user Makefile" and you could just have > a link to Victor's page (and have him update the include path line) > > > On Thu, Jan 13, 2022 at 11:15 PM Jed Brown <j...@jedbrown.org> wrote: > >> No makefile is needed to build foo from foo.c. >> >> $ make -f $PETSC_DIR/share/petsc/Makefile.user foo >> >> >> In the example below, you don't have to write the recipe (the ${CLINKER} >> line). It's enough to write >> >> foo: foo.o baz.o >> >> Matthew Knepley <knep...@gmail.com> writes: >> >> > foo: foo .o >> > ${CLINKER} -o $@ $^ ${PETSC_LIB} >> > >> > Matt >> > >> > On Thu, Jan 13, 2022 at 9:54 PM Jacob Faibussowitsch < >> jacob....@gmail.com> >> > wrote: >> > >> >> Is share/petsc/Makefile.user what you are looking for? >> >> >> >> Best regards, >> >> >> >> Jacob Faibussowitsch >> >> (Jacob Fai - booss - oh - vitch) >> >> >> >> On Jan 13, 2022, at 21:49, Barry Smith <bsm...@petsc.dev> wrote: >> >> >> >> >> >> >> >> >> https://petsc.org/release/docs/manual/getting_started/?highlight=user%20makefile >> >> >> >> Search for Writing Application Codes with PETSc >> >> >> >> Perhaps this needs to clearer or have links to it from the FAQ. >> >> >> >> >> >> >> >> On Jan 13, 2022, at 9:38 PM, Mark Adams <mfad...@lbl.gov> wrote: >> >> >> >> I am finding it pretty hard to find an example of a makefile target to >> >> build an app with PETSc. >> >> >> >> I can not find it on the docs page. >> >> >> >> With Google: >> >> >> >> Victor has a little example that looks fine ($PETSC_LIB). (sort of, see >> >> below) >> >> >> >> Another one is bigger and has this at the end: >> >> >> >> -${CLINKER} $< -o bin.x $(OBJ_FILES) ${PETSC_KSP_LIB} >> >> -I$(PETSC_DIR)/include >> >> >> >> I recall using PETSC_KSP_LIB the last time I wrote a makefile 20 years >> ago. >> >> >> >> Maybe there should be a FAQ that a search would find like "Example of >> user >> >> makefile" with something like Victor's (dropping v2 and updating it, >> this >> >> looks wrong): >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> *PETSc linkingThe easiest way to link PETSc to your code is to have this >> >> line in your makefile:include ${PETSC_DIR}/conf/baseThis will >> automatically >> >> give you the compilation rules. For linking you then do:${CLINKER} -o >> ex1 >> >> ex1.o ${PETSC_LIB}(or FLINKER for fortran)You can also use this include >> >> line:include ${PETSC_DIR}/conf/variablesand then you have to give the >> >> compile rules yourself. In this case, dosomething like${CC} -c ex1.c >> >> ${PETSC_INCLUDE}to compile. (This is for petsc version 3, for version 2 >> >> useinclude ${PETSC_DIR}/bmake/common/baseand replace base by variables >> to >> >> omit petsc’s make rules.)If you insist on having all the libraries and >> >> includes explicitly, usemake getlinklibsmake getincludedirs* >> >> >> >> >> >> >> >> >> >> >> > >> > -- >> > What most experimenters take for granted before they begin their >> > experiments is infinitely more interesting than any results to which >> their >> > experiments lead. >> > -- Norbert Wiener >> > >> > https://www.cse.buffalo.edu/~knepley/ < >> http://www.cse.buffalo.edu/~knepley/> >>