I'll take a stab at fixing up the description of possible makefile approaches in the user's manual documentation and put it in an MR. I agree with Mark it is weak.
Barry > On Jan 14, 2022, at 10:41 AM, Jed Brown <j...@jedbrown.org> wrote: > > 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/> >>>