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 $@
