On Mon, 20 Jan 2020 at 14:14, Matthew Knepley <knep...@gmail.com> wrote:
> On Mon, Jan 20, 2020 at 3:06 AM Lisandro Dalcin <dalc...@gmail.com> wrote: > >> I'm using GCC 9 from Fedora 31. A few things have changed regarding >> dependency generation, and things are now broken for PETSc. I do not have a >> clean solution to propose. >> >> The problem is the way targets are emitted : >> >> $ head -n 3 arch-linux2-c-debug/obj/sys/objects/init.d >> init.o: /home/devel/petsc/dev/src/sys/objects/init.c \ >> /home/devel/petsc/dev/include/petscsys.h \ >> /home/devel/petsc/dev/arch-linux2-c-debug/include/petscconf.h \ >> >> GCC now generates a bare "init.o" target. Using GCC 8 in a Manjaro box I >> get instead: >> >> $ head -n 3 arch-linux2-c-debug/obj/sys/objects/init.d >> arch-linux2-c-debug/obj/sys/objects/init.o: \ >> /home/devel/petsc/src/sys/objects/init.c \ >> /home/devel/petsc/include/petscsys.h \ >> >> These differences totally break our use of dependencies: >> >> $ touch include/petscsys.h >> $ make >> ... >> gmake[2]: Nothing to be done for 'all'. >> ... >> >> >> My quick workaround so far has been to add this in makefiles: >> >> C_DEPFLAGS += -MT $@ >> CXX_DEPFLAGS += -MT $@ >> FC_DEPFLAGS += -MT $@ >> >> From the GCC info page >> >> '-MT TARGET' >> >> Change the target of the rule emitted by dependency generation. By >> default CPP takes the name of the main input file, deletes any >> directory components and any file suffix such as '.c', and appends >> the platform's usual object suffix. The result is the target. >> >> An '-MT' option sets the target to be exactly the string you >> specify. If you want multiple targets, you can specify them as a >> single argument to '-MT', or use multiple '-MT' options. >> >> For example, '-MT '$(objpfx)foo.o'' might give >> >> $(objpfx)foo.o: foo.c >> > > Why is my GCC 9.1 not doing this? > > master *$:/PETSc3/petsc/petsc-dev$ head -n 3 > arch-master-debug/obj/sys/objects/init.d > arch-master-debug/obj/sys/objects/init.o: \ > /PETSc3/petsc/petsc-dev/src/sys/objects/init.c \ > /PETSc3/petsc/petsc-dev/include/petscsys.h \ > master *$:/PETSc3/petsc/petsc-dev$ head -n 3 > arch-master-gcc-debug/obj/sys/objects/init.d > arch-master-gcc-debug/obj/sys/objects/init.o: \ > /PETSc3/petsc/petsc-dev/src/sys/objects/init.c \ > /PETSc3/petsc/petsc-dev/include/petscsys.h \ > master *$:/PETSc3/petsc/petsc-dev$ /PETSc3/petsc/gcc/bin/mpicc -show > /Users/knepley/MacSoftware/bin/ccache /usr/local/gcc-9.1/bin/gcc-9.1 > -fstack-protector -g3 -Wl,-flat_namespace -Wl,-commons,use_dy > libs -I/PETSc3/petsc/gcc/include -L/PETSc3/petsc/gcc/lib -lmpi -lpmpi > master *$:/PETSc3/petsc/petsc-dev$ /usr/local/gcc-9.1/bin/gcc-9.1 --version > gcc-9.1 (GCC) 9.1.0 > Copyright (C) 2019 Free Software Foundation, Inc. > > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > Maybe this is a regression in GCC 9.2 ? The thing is that the behavior seems consistent with the documentation. $ gcc --version gcc (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1) Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.