如何通过迭代列表在Makefile中生成目标?

Laz*_*zer 8 shell makefile

码:

LIST=0 1 2 3 4 5
PREFIX=rambo

# some looping logic to interate over LIST
Run Code Online (Sandbox Code Playgroud)

预期结果:

rambo0:
    sh rambo_script0.sh

rambo1:
    sh rambo_script1.sh
Run Code Online (Sandbox Code Playgroud)

由于我的LIST有6个元素,因此应该生成6个目标.将来,如果我想添加更多目标,我希望能够修改我的LIST而不是触及代码的任何其他部分.

如何编写循环逻辑?

Ide*_*lic 19

如果您使用的是GNU make,则可以在运行时生成任意目标:

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))))
Run Code Online (Sandbox Code Playgroud)


Mic*_*ber 13

使用文本转换功能.随着patsubst你可以进行非常一般的转换.用于构造文件名,addsuffix并且addprefix都很方便.

对于规则,请使用模式规则.

整体结果可能如下所示:

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

all: $(targets)

$(targets): rambo%: rambo%.sh
    sh $<
Run Code Online (Sandbox Code Playgroud)

  • @Lazer,`$(info 目标是 $(targets))` (2认同)