这是我的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等组合......没有任何效果。 有人可以帮我吗?
答案 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。注意:
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