Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid duplication in Makefile targets with similar recipes?

Tags:

makefile

dry

I have a Makefile which has a lot of targets and the recipe for each target is quite similar.

foo:
    gcc foo.c -o foo
    mv foo ~/bin

bar:
    gcc bar.c -o bar
    mv bar ~/bin

baz:
    gcc baz.c -o baz
    mv baz ~/bin

I would like to avoid all this duplication. I would like to have something like below (this is not valid syntax; this only expresses my intention).

TARGET_NAME:
    gcc $(TARGET_NAME).c -o $(TARGET_NAME)
    mv $(TARGET_NAME) ~/bin

Is it possible to do something like this? If not, what is the best Makefile I can write that can minimize duplication in recipes?

like image 631
Lone Learner Avatar asked Oct 26 '25 20:10

Lone Learner


1 Answers

Your makefile is wrong because your targets (foo, bar, etc.) don't depend on their source files (foo doesn't depend on foo.c, etc.) So, changing the source code won't cause the target to be rebuilt.

Also, your makefile says you're creating a file foo, but your recipe actually creates a file ~/bin/foo, which is not the same thing.

Anyway, this is exactly what pattern rules are for:

EXES = foo bar baz

all: $(addprefix $(HOME)/bin/,$(EXES))

$(HOME)/bin/%:: %.c
        gcc $< -o $@

(Thanks to Beta for pointing out my think-o in the original)

like image 139
MadScientist Avatar answered Oct 29 '25 16:10

MadScientist



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!