遍历makefile参数列表

时间:2018-07-15 07:58:05

标签: makefile system-verilog uvm test-bench

我希望我的makefile解析下面$(cfg)列表中的每个arg = value对。然后在生成文件中使用这些$(arg)和$(value)。这些arg = value对可以用空格或逗号分隔。

示例:我想通过命令行覆盖三个测试变量(A,B,C)

make run test=my_test.sv cfg="A=3, B=4, C=5"

Makefile应该执行以下操作:

foreach $arg,$val in $cfg  ----> +uvm_set_config_int=*,$arg,$val

有效结果:

+uvm_set_config_int=*,A,3
+uvm_set_config_int=*,B,4
+uvm_set_config_int=*,C,5

我上面的目的是允许通过命令行覆盖任何默认的测试配置。

我检查了Variable arguments list to a MakefilePassing arguments to "make run",但没有回答我的特定问题。

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这可能不对:

+uvm_set_config_int=*,A,3
+uvm_set_config_int=*,B,4
+uvm_set_config_int=*,C,5

因为它只是设置然后覆盖单个值+uvm_set_config_int。最后,变量+uvm_set_config_int将包含单个值*,C,5,因为这是最后一个赋值。也许您是说要在上述每一项中使用uvm_set_config_int += ...来附加到现有值上?

我真的不明白您要在这里完成什么。

但是,这里有一个示例,说明了如何执行您所要求的操作,即使这似乎没有多大意义:

c = ,
$(foreach X,$(subst $c, ,$(cfg)),$(eval +uvm_set_config_int=*,$(subst =,$c,$X)))

由于逗号是特殊的函数,因此我们必须将它们隐藏在上面的变量$c后面。第一个subst将逗号变成空格,因为这就是make用来分隔单词的原因。第二个将=转换为逗号,以便您可以将A=3更改为A,3等。eval评估作为makefile行给出的文本。

答案 1 :(得分:0)

如果要通过make进行某种形式的构建配置,则可以使用gmtt,它是具有支持此任务功能的库。在gmtt中,您可以这样制定任务:

include gmtt/gmtt.mk

cfg-table := 2 $(cfg) # make a gmtt-table from the variable

# now select column 1 and 2 from the table for the right test and format the output (without the need to format, just use "select")
smoketest-cfg := $(call map-select,1 2,$(cfg-table),$$(call glob-match,$$1,smoketest*),+uvm_set_config=*$(comma)$$1$(comma)$$2)

regressiontest-cfg := $(call map-select,1 2,$(cfg-table),$$(call glob-match,$$1,regressiontest*),+uvm_set_config=*$(comma)$$1$(comma)$$2)


$(info $(smoketest-cfg))
$(info $(regressiontest-cfg))
$(info -----------------------)
$(info $(subst $(space),$(newline),$(strip $(smoketest-cfg))))

,您现在应该可以将其命名为:

make cfg="smoketest-A 1 smoketest-B 2 regressiontest-A 3 regressiontest-B 4"

(gmtt使用的表只是GNUmake列表,因此必须使用空格作为项目的分隔符,并且不能有空的“单元格”。)

输出:

 +uvm_set_config=*,smoketest-A,1 +uvm_set_config=*,smoketest-B,2
 +uvm_set_config=*,regressiontest-A,3 +uvm_set_config=*,regressiontest-B,4
-----------------------
+uvm_set_config=*,smoketest-A,1
+uvm_set_config=*,smoketest-B,2

请注意,由于make的慷慨字符处理功能几乎需要将所有内容都用作函数参数,因此您需要在输出格式中将,引用为$(comma)(由gmtt提供的变量)。 {1}},因此不能用作转义字符。