Bjarke Freund-Hansen
Bjarke Freund-Hansen

Reputation: 30128

Debugging Makefile for target that is not being built

I need some help debugging a Makefile system. I have a rather huge Makefile dependency tree, actually the Android source makefile system.

At some point the build fails because a file is missing:

/bin/bash: out/host/linux-x86/bin/mkfs.ubifs: No such file or directory

The file mkfs.ubifs is supposed to be "build" during the make process, and indeed it works if I do:

make out/host/linux-x86/bin/mkfs.ubifs

The mkfs.ubifs is build, and everything is working, until I again clean everything and build from the beginning.

This indicates to me, that there is a missing dependency somewhere. So my question is, how do I go about debugging this? How do I discover exactly which target is missing a dependency? What options can I provide for make which will give me clues as to where the error is?

Any other suggestions will also be appreciated. Thanks. :)

Update

Using make -d provides quite a lot of output. How exactly do I determine from which make target (sourcefile and line) and error occurred?

Upvotes: 5

Views: 6379

Answers (2)

Bjarke Freund-Hansen
Bjarke Freund-Hansen

Reputation: 30128

Problem solved. It seems make -p was the most useful way to debug this problem:

-p, --print-data-base
    Print  the data base (rules and variable values) that results from
    reading the makefiles; then execute as usual or as otherwise spec-
    ified.   This  also prints the version information given by the -v
    switch (see below).  To print the  data  base  without  trying  to
    remake any files, use make -p -f/dev/null.

From that output it is relatively easy to determine which target was failing, and what dependency that should be included.

Upvotes: 10

Maxim Egorushkin
Maxim Egorushkin

Reputation: 136495

There is a discrepancy between target's prerequisites and its commands, that is, a dependency is not specified for a target. I don't think you can debug that using make means because make can't tell you that a dependency is missing.

However, you can try invoking make with -d switch. That is going to tell you which target it tries to build when it hits the missing file. The next step would be to find the rule for that target in the makefile and add the missing dependency.

Upvotes: 1

Related Questions