lindenb / makefile2graph

Creates a graph of dependencies from GNU-Make; Output is a graphiz-dot file or a Gexf-XML file.
MIT License
617 stars 63 forks source link

Pattern rules with multiple targets not shown #29

Open dacodas opened 4 years ago

dacodas commented 4 years ago

Consider the following Makefile

all: hello.b hello.c

hello.a:
    touch $@

%.b %.c: %.a
    touch $*.b $*.c

Instead of properly connecting the two pattern rule targets, only one of them is connected the in the dot output

wrong

should-be

I believe this is because the make -d output just says that the second has "already been considered"

# make -rRBndC example
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Reading makefile 'Makefile'...
Updating makefiles....
 Considering target file 'Makefile'.
  Looking for an implicit rule for 'Makefile'.
  No implicit rule found for 'Makefile'.
  Finished prerequisites of target file 'Makefile'.
 No need to remake target 'Makefile'.
Updating goal targets....
Considering target file 'all'.
 File 'all' does not exist.
 Looking for an implicit rule for 'all'.
 No implicit rule found for 'all'.
  Considering target file 'hello.b'.
   Looking for an implicit rule for 'hello.b'.
   Trying pattern rule with stem 'hello'.
   Trying implicit prerequisite 'hello.a'.
   Found an implicit rule for 'hello.b'.
    Considering target file 'hello.a'.
     Finished prerequisites of target file 'hello.a'.
    Making 'hello.a' due to always-make flag.
    Must remake target 'hello.a'.
make[1]: Entering directory '/home/dacoda/projects/tea-dragon-society/src/third-party/makefile2graph/test/example'
touch hello.a
    Successfully remade target file 'hello.a'.
   Finished prerequisites of target file 'hello.b'.
   Prerequisite 'hello.a' is newer than target 'hello.b'.
  Must remake target 'hello.b'.
touch hello.b hello.c
  Successfully remade target file 'hello.b'.
  Considering target file 'hello.c'.
  File 'hello.c' was considered already.
 Finished prerequisites of target file 'all'.
Must remake target 'all'.
Successfully remade target file 'all'.
make[1]: Leaving directory '/home/dacoda/projects/tea-dragon-society/src/third-party/makefile2graph/test/example'

With a different flag, however, it seems possible to have make let us know that it is building more than one file with a single recipe

# make -rRpBC example | grep -C5 'Also makes'
    touch $@

hello.b: hello.a
#  Implicit rule search has been done.
#  Implicit/static pattern stem: 'hello'
#  Also makes: hello.c
#  Last modified 2020-09-18 17:55:32.792450404
#  File has been updated.
#  Successfully updated.
# automatic
# @ := hello.b
lindenb commented 4 years ago

Thank you for this report ! I'm afraid I won't have the time to fix this soon.

dacodas commented 4 years ago

No worries! I'll give it a shot over the next while and make a pull request. This issue helps keep it fresh in my mind.

Thanks for the tool and for your quick response 😄😄