带有外部参数和内部变量的 Makefile 命令

带有外部参数和内部变量的 Makefile 命令

在 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}

相关内容