How to generate targets in a Makefile by iterating

2019-03-16 03:18发布

CODE:

LIST=0 1 2 3 4 5
PREFIX=rambo

# some looping logic to interate over LIST

EXPECTED RESULT:

rambo0:
    sh rambo_script0.sh

rambo1:
    sh rambo_script1.sh

Since my LIST has 6 elements, 6 targets should be generated. In future, if I want to add more targets, I want to be able to just modify my LIST and not touch any other part of the code.

How should the looping logic be written?

2条回答
家丑人穷心不美
2楼-- · 2019-03-16 04:06

Use text-transforming functions. With patsubst you can make quite general transformations. For constructing filenames, addsuffix and addprefix are both convenient.

For the rules, use pattern rules.

The overall result might look something like this:

LIST = 0 1 3 4 5
targets = $(addprefix rambo, $(LIST))

all: $(targets)

$(targets): rambo%: rambo%.sh
    sh $<
查看更多
神经病院院长
3楼-- · 2019-03-16 04:10

If you're using GNU make, you can generate arbitrary targets at run-time:

LIST = 0 1 2 3 4 5
define make-rambo-target
  rambo$1:
         sh rambo_script$1.sh
  all:: rambo$1
endef

$(foreach element,$(LIST),$(eval $(call make-rambo-target,$(element))))
查看更多
登录 后发表回答