Makefile:调用它时如何增加变量? (bash中的var ++)

时间:2015-12-07 20:31:21

标签: variables makefile increment

这是我的makefile的一部分:

LISTEINC = $(DEST)/file.inc $(DEST)/otherfile.inc $(DEST)/anotherfile.inc
compteur = 1

$(DEST)/file: $(LISTEINC)
       #action

$(DEST)/%.inc: $(DEST)/%.jpg
      ./script $< $compteur $(DEST) > $@

如何将变量compteur设置为1表示文件,2表示其他文件,3表示另一个文件?

$((compteur ++))可以在bash脚本中工作,但在这里我真的不知道等价物是什么。我尝试了很多$$()++ +1等组合......没有任何效果。 有人可以帮我吗?

3 个答案:

答案 0 :(得分:5)

可以使用eval

完成
$(eval compteur=$(shell echo $$(($(compteur)+1))))

从手册:

  

eval功能非常特别:它允许您定义新的   makefile构造不是常量;这是结果   评估其他变量和函数。 eval的论据   扩展函数,然后将该扩展的结果解析为   makefile语法。扩展结果可以定义新的make变量,   目标,隐含或显式规则等

答案 1 :(得分:1)

每次评估某个目标的收据时,它都会使用自己的shell实例。因此,您无法修改 shell 变量,用于构建文件$(DEST)/otherfile.inc,同时构建文件$(DEST)/file.inc

您可以使用 make 变量代替 shell 变量compteur

$(DEST)/%.inc: $(DEST)/%.jpg
      ./script $< $(compteur) $(DEST) > $@

对于不同的目标具有不同的值。可以使用target-specific variable values技术来实现:

$(DEST)/file.inc: compteur = 1
$(DEST)/otherfile.inc: compteur = 2
$(DEST)/another.inc: compteur = 3

如果您想生成这些变量赋值规则,您可以自由使用任何make工具,在解析阶段工作(与构建<相反/ em> stage,当make执行目标收据时)。例如,您可以在生成每个变量赋值规则后使用shell更改变量:

# For target, given by the first parameter, set current *compteur* value.
# After issuing the rule, issue new value for being assigned to *compteur*.
define set_compteur
$(1): compteur = $(compteur) # Variable-assignment rule
compteur = $(shell echo $$(($(compteur)+1))) # Update variable's value
endef

$(foreach t,$(LISTEINC),$(eval $(call set_compteur, $(t))))

或者,您可以创建一次可能的compteur值列表,并在生成变量赋值规则时使用此列表:

# List of possible indicies in the list *LISTEINC*: 1 2 ...
indicies = $(shell seq $(words $(LISTEINC)))
# Corresponded *compteur* values actually are same as indicies.
compteurs = $(indicies)

# For target, specified with index, given by the first parameter, set corresponded *compteur* value.
define set_compteur
$(word $(1),$(LISTEINC)): compteur = $(word $(1),$(compteurs))
endef

$(foreach i,$(indicies),$(eval $(call set_compteur, $(i))))

解析阶段为列表LISTEINC中的每个目标调用shell 的第一个代码段不同,第二个代码段仅调用shell 一次seq命令),更快

答案 2 :(得分:0)

不确定是否仍然相关(问题是旧的......),但这里是你如何增加GNU Make。注意:

  1. 实施的操作是递增。
  2. 数字是反小数,数字之间有空格,因为Make。
  3. 空字符串是有效的零(数字 0,即不是数字)。
  4. 大概这已经足够了,因为人们只要求增量通常只需要唯一性。
  5. 显然,基础10的选择完全是任意的。调整next_ *地图以品尝。
  6. 渲染&#34;数字&#34;没有空间或倒转它们留给读者练习。 :)
  7.     define inc
          $(if $(1),$(call inc-rec,$(next_$(firstword $(1))),$(wordlist 2,$(words $(1)),$(1))),1)
        endef
        define inc-rec
          $(if $(filter 0,$(1)),0 $(call inc,$(2)),$(1) $(2))
        endef
        next_0 := 1
        next_1 := 2
        next_2 := 3
        next_3 := 4
        next_4 := 5
        next_5 := 6
        next_6 := 7
        next_7 := 8
        next_8 := 9
        next_9 := 0