Suppose I have the following Makefile:

RM = rm -f
FLAGS =  -Cr -O1 -gv -gw -g -vw
builddir = ./build/
TD = ./tasks/

all: example1 example3 example5


    fpc 01_Kreisumfang.pas $(FLAGS) -o$(builddir)01_Kreisumfang


    fpc 03_EuroBetrag3.pas $(FLAGS) -o$(builddir)03_EuroBetrag3


    fpc 05_Dreiecke.pas $(FLAGS) -o$(builddir)05_Dreieck


    $(RM) $(builddir)*

At a certain point my Makefile grows to example112 ..., is there a way to define all automatically with out needing to type in all the targets? I don't want to do this:

all: example1 example3 example5 ... example112

Can I do something like this?

all: (MAGIC to Exclude clean)?

So instead of having to type all the targets, I want make to detect all the targets and exclude a certain list.


I found the following possible hint:

 make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)' 

I don't know how to make this a target by itself, I tried with:

TARGETS =: $(shell make -rpn | sed -n -e '/^$$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)')

But it seems to be wrong. Not only it is wrong, it will cause a silly recursion.

So this solution is only available as a shell command, not within the Makefile itself.

Well, make seems to be just cryptic here. The most reasonable solution I found is to create a script and use that:

$ cat doall.sh 
for i in `make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' | sed -e 's/://' | egrep -v -E '(all|clean)'`; 
    do make $i; 

It seems impossible to create it as a make target, or that the ROI on this is very low ...


I tried this out using a for loop. Check if this simple example works for you. Took the command from this post.

RM = rm -f
builddir = ./build/
TD = ./tasks/
SHELL := /bin/bash

targets=$(shell for file in `find . -name '*.pas' -type f -printf "%f\n" | sed 's/\..*/\.out/'`; do echo "$$file "; done;)

all: $(targets)

  fpc $< $(FLAGS) -o (builddir)$@

    $(RM) $(builddir)*
  • you are assuming all my targets are called example. Which is fine for now, how would it be when I start having other names? – Oz123 Sep 29 '13 at 10:36
  • Are the file extensions the same? Check my edited post. – el_tenedor Sep 29 '13 at 10:42
  • it will try to execute the files themselves. – Oz123 Sep 29 '13 at 10:51
  • Sorry, my fault. I think now I got the problem. Check the new edit. – el_tenedor Sep 29 '13 at 11:07
  • you are searching for .h files, I am trying to compile .pas files. Why are you adding the word .targets? and finally, it just echoing a list of the files but it does not execute the compiler – Oz123 Sep 29 '13 at 11:13

I've been using


(Saved as make-t) to list all targets.

If you want to build all real targets, then get a listing of all targets that aren't phony:

make -qp | grep -P '^[.a-zA-Z0-9][^$#\/\t=]*:([^=]|$)' |
tee >(cut -d: -f1 ) >(grep '^\s*\.PHONY\s*:' |cut -d: -f2) >/dev/null|
tr ' ' '\n' | sed '/^\s*\./ d; /^\s*$/ d' |sort |uniq -u

should do the job (this assumes no target names with spaces in them).

Your Answer

