在 Makefile 目标中,我有一个文件列表,我想将其拆分为x
多个部分并仅处理一个部分y
,然后将这些文件名作为参数传递给测试运行程序。我无法控制外部参数,因为它们是由 CI 系统提供的。所以我需要手动使其从0开始。调用示例:test_group_count=10 test_group=1 make foo
这是我的非工作尝试:
foo:
group_number=$(shell echo $$(( $(test_group) - 1 )))
tests="$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}')"
run_tests $${tests}
- 作品
-1
- 列出文件有效,但不能将其减少到每 y 行
- 将文件名存储在变量中然后将其用于下一个命令不起作用
所以我还没有弄清楚如何使命令看到这两个变量:我在目标中定义的变量和调用命令给出的变量。
更新:
我可以让它作为一句台词工作,但我强烈喜欢更具可读性的东西,因为我的真实命令run_tests
本身就是一个又长又难看的命令:
run_tests $$(ls *.feature | awk 'NR%$(test_group_count)==( $(test_group) - 1 )')
答案1
您的${group_number}
命令将被具有该名称的 make 宏替换。但上面的行将其设置为 shell 变量(在与您使用它的 shell 不同的 shell 中;简单地将其加倍是$
行不通的)。
您应该将其定义为宏——即不在规则中,在非制表符缩进行中。同样的事情与tests
;每行都在不同的 shell 中运行,您不能在它们之间共享变量。
工作解决方案:
foo: group_number=$(shell echo $$(( $(test_group) - 1 )))
foo: tests=$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}')
foo:
run_tests ${tests}