Teja Allani
Teja Allani

Reputation: 43

Can a makefile pattern match contain both prefix and suffix as vairables?

I am trying to match a pattern in the rule to compile and generate binary files from c files like below

$(BIN_TARGETS) : $(BIN_DIR)/%.$(BIN_EXT) : $(BIN_DIR)/%.$(EXE_EXT)

I see the following error

../../rules/mkrules.mk:13: target 'bin/hello.bin' doesn't match the target pattern

I have tried the below and it seems to work

$(BIN_TARGETS) : $(BIN_DIR)/%.bin : $(BIN_DIR)/%.elf

I would like to make the file name extensions not fixed.

I have assigned the variables as shown below at the start of makefile

EXE_EXT = .elf
BIN_EXT = .bin

I see here it is mentioned "Note that expansion using ‘%’ in pattern rules occurs after any variable or function expansions, which take place when the makefile is read."

So, aren't variables supposed to be expanded before % is substituted?

Upvotes: 0

Views: 494

Answers (1)

MadScientist
MadScientist

Reputation: 100956

The answer is simple:

EXE_EXT = .elf
BIN_EXT = .bin

$(BIN_TARGETS) : $(BIN_DIR)/%.$(BIN_EXT) : $(BIN_DIR)/%.$(EXE_EXT)

So $(BIN_DIR)/%.$(BIN_EXT) expands to $(BIN_DIR)/%..bin (note double periods).

You'll have to decide whether you want the period either in the variable or in the pattern, but it can't be in both places.

Upvotes: 1

Related Questions