42

Let's say you have a project structure with lots of Makefiles and there is a top level Makefile that includes all the other.

How can you list all the possible targets?

I know writing

make 

and then tabbing to get the suggestions would generally do the trick, but in my case there are 10000 targets. Doing this passes the results through more and also for some reason scrolling the list results in a freeze. Is there another way?

Sogartar
  • 581

3 Answers3

55

This is how the bash completion module for make gets its list:

make -qp |
    awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}' |
    sort -u

It prints out a newline-delimited list of targets, without paging.

Chris Down
  • 125,559
  • 25
  • 270
  • 266
6

FreeBSD and NetBSD make(1) have a built-in variable called .ALLTARGETS. You can print out its contents like this

make -V .ALLTARGETS

That will unfortunately print out a space-delimited list. I find the following more useful

make -V .ALLTARGETS | tr ' ' '\n'

It prints out each target on its own line.

  • If you want to also exclude pseudo targets (.WAIT), you can change the command as follows: make -V '$(.ALLTARGETS:N.WAIT_*:O)'. – Bass May 16 '22 at 23:25
0

This is a very simplified version of what the bash-completion script does.

make -npq : 2> /dev/null | \
    awk -v RS= -F: '$1 ~ /^[^#%.]+$/ { print $1 }'
FelipeC
  • 111