Thanks Barry,

It makes much more sense! And thanks for clarifying what “P” indicates. I like 
this explicit approach over implicit because I am bad with makefile syntax. 
However, share/petsc/Makefile.user looks much cleaner, but I need to learn how 
pkg-config works to understand it.

Thank you,
Alex.



From: Barry Smith <[email protected]>
Date: Tuesday, December 15, 2020 at 7:41 PM
To: Alex Koshkarov <[email protected]>
Cc: petsc-users <[email protected]>
Subject: Re: [petsc-users] Petsc makefile and PETSC_COMPILE variable


  Alex,

   Since you are explicitly defining your rules you might as well just do it 
completely, so use something like

objects/%.o: src/%.c $(DEP)
               ${PCC} -c $< -o $@ ${PCC_FLAGS} ${PFLAGS} ${CCPPFLAGS}

The P indicates either C and C flags or C++ compiler and its  flags if 
configure was run with --with-clanguage=c++ (not recommended).

So if your code is C you can use


${CC} -c $< -o $@ ${CC_FLAGS} ${CPP_FLAGS}

if C++ use

${CXX} -c $< -o $@ ${CXXPP_FLAGS} ${CXX_FLAGS}


With this you don't need the COMPILE macros that are really internal for 
PETSc's use.


  Barry

  We have not been completely successful at getting share/petsc/Makefile.user 
to be bullet proof yet, but if you can get it to work in your case great.




On Dec 15, 2020, at 11:46 AM, Alex Koshkarov 
<[email protected]<mailto:[email protected]>> wrote:

Thank you!

It makes sense to use share/petsc/Makefile.user - I will try to understand it. 
However, can you please tell me what is the meaning of "_SINGLE" in 
"PETSC_COMPILE_SINGLE"? Does it mean compile only one source file?

Best regards,
Alex Koshkarov.

On 12/15/20, 9:25 AM, "Satish Balay" 
<[email protected]<mailto:[email protected]>> wrote:

   On Tue, 15 Dec 2020, Alex Koshkarov wrote:


Hi All,

I have been using trivial makefile (see below) for the code which uses petsc. 
The makefile relies on variable PETSC_COMPILE which disappeared in new petsc 
version (absent in 3.14.2, but present in 3.13.4). What would be the right way 
to fix the makefile? (should I use something like PETSC_COMPILE_SINGLE ?).

   Yes - this change was a bugfix.


Is it a very bad practice to use such makefile?

   For most use cases the default targets work. However this usage [where 
sources and obj files are in different dirs] is not covered by them.

   So - I think using such targets is appropriate.

   There is also share/petsc/Makefile.user - which attempts to provide a 
portable way to create user makefiles [that don't rely on internals like 
PETSC_COMPILE_SINGLE] - but requires gnumake and pkgconfig

   Satish




p.s. sorry if this is a duplicate message, I believe I sent the first one to 
the wrong address.

Thank you very much,
Alex Koshkarov.


Example of makefile, it assumes sources in “src” and creats objects in 
“objects”:

CPP := $(wildcard src/*.c)
DEP := $(wildcard src/*.h)
OBJ := $(addprefix objects/,$(notdir $(CPP:.c=.o)))

include ${PETSC_DIR}/lib/petsc/conf/variables
include ${PETSC_DIR}/lib/petsc/conf/rules

driver: $(OBJ)
               -${CLINKER} -o $@ $^ ${PETSC_LIB} ${EXTRALIBS} ${CFLAGS}

objects/%.o: src/%.c $(DEP)
               ${PETSC_COMPILE} -c $< -o $@



Reply via email to