Search code examples
makefilegnu-makeconfigureautotoolsautomake

Unable to `make clean`: "No rule to make target ...Plo"


Question Summary

I'm trying to make clean and I'm getting the following output:

Makefile:835: /absolute/path/to/server/server/example/.deps/libfoo-bar.Plo: No such file or directory
Makefile:836: /absolute/path/to/server/server/example/.deps/libfoo-baz.Plo: No such file or directory
Makefile:837: /absolute/path/to/server/server/example/.deps/libfoo-qux.Plo: No such file or directory
Makefile:838: /absolute/path/to/server/server/example/.deps/libfoo-quux.Plo: No such file or directory
Makefile:839: /absolute/path/to/server/server/example/.deps/libfoo-quuz.Plo: No such file or directory
Makefile:840: /absolute/path/to/server/server/example/.deps/libfoo-corge.Plo: No such file or directory
Makefile:841: /absolute/path/to/server/server/example/.deps/libfoo-grault.Plo: No such file or directory
Makefile:842: /absolute/path/to/server/server/example/.deps/libfoo-garply.Plo: No such file or directory
Makefile:843: /absolute/path/to/server/server/example/.deps/libfoo-waldo.Plo: No such file or directory
Makefile:844: /absolute/path/to/server/server/example/.deps/libfoo-fred.Plo: No such file or directory
Makefile:845: /absolute/path/to/server/server/example/.deps/libfoo-plugh.Plo: No such file or directory
Makefile:846: /absolute/path/to/server/server/example/.deps/libfoo-xyzzy.Plo: No such file or directory
Makefile:847: /absolute/path/to/server/server/example/.deps/libfoo-babble.Plo: No such file or directory
Makefile:848: /absolute/path/to/server/server/example/.deps/libfoo-thud.Plo: No such file or directory
Makefile:848: /absolute/path/to/server/server/example/.deps/libfoo-flarp.Plo: No such file or directory
make: *** No rule to make target '/absolute/path/to/server/server/example/.deps/libfoo-flarp.Plo'. Stop.

How can I successfully do a make clean? I don't understand what these .Plo files are, and they are usually something I don't mess with.

Investigation

My Makefile.am

The Makefile.am which is used to generate the Makefile from which I'm trying to run the clean contains this preamble:

include $(top_srcdir)/server/include.am
include $(top_srcdir)/server/tests/include.am
...

The first $(top_srcdir)/server/include.am includes the following:

...
server_libdir = $(exec_prefix)/lib
serverdir = $(top_srcdir)/server
...

and in the specified $(top_srcdir)/server/tests/include.am, I have a lot of things including:

...
server_lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = \
    /absolute/path/to/server/server/example/bar.c \
    /absolute/path/to/server/server/example/baz.c \
    /absolute/path/to/server/server/example/qux.c \
    /absolute/path/to/server/server/example/quux.c \
    /absolute/path/to/server/server/example/quuz.c \
    /absolute/path/to/server/server/example/corge.c \
    /absolute/path/to/server/server/example/grault.c \
    /absolute/path/to/server/server/example/garply.c \
    /absolute/path/to/server/server/example/waldo.c \
    /absolute/path/to/server/server/example/fred.c \
    /absolute/path/to/server/server/example/plugh.c \
    /absolute/path/to/server/server/example/xyzzy.c \
    ...

Investigating the Makefile Contents

If I look at the Makefile directly and find the lines generating these errors, I see the following:

include /absolute/path/to/server/server/example/$(DEPDIR)/libfoo-bar.Plo
include /absolute/path/to/server/server/example/$(DEPDIR)/libfoo-baz.Plo
include /absolute/path/to/server/server/example/$(DEPDIR)/libfoo-qux.Plo
... 

Where are the .Plo files generated?

Frustratingly, there seems to be the exact .Plo files that I need generated all over the place, just not in the right place; for example these files exist:

/absolute/path/to/server/tests/absolute/path/to/server/server/example/$(DEPDIR)/libfoo-bar.Plo
/absolute/path/to/server/tests/absolute/path/to/server/server/example/$(DEPDIR)/libfoo-baz.Plo
/absolute/path/to/server/tests/absolute/path/to/server/server/example/$(DEPDIR)/libfoo-qux.Plo
...

and there are 7 other directories where these .Plo files are created.

Unsuccessful Attempts

Running config.status directly

I found this message on the GNU mailing list:

Actually, these .P files are created by config.status for each directory it creates an Automake Makefile in. (BTW, make sure ./config.status --help' lists the relevant Makfiles in the Configuration files' section).

You can request the creation of the .P files for a given directory by running

% rm -Rf kernel/framework/.deps % ./config.status kernel/framework/Makefile depfiles

And ran ./config.status as described but the output of make clean hasn't changed

According to this other Stack Overflow question, they were able to generate .Plo files, but I don't know what is different for them.


Solution

  • re-run configure with the --disable-dependency-tracking option