Em um destino de Makefile, tenho uma lista de arquivos que quero dividir em x
partes e trabalhar apenas com uma parte y
e, em seguida, passo esses nomes de arquivos como argumento para um executor de testes. Não tenho controle sobre os argumentos externos, pois eles são fornecidos por um sistema de CI. Então eu preciso manualmente torná-lo baseado em 0. Exemplo de chamada:test_group_count=10 test_group=1 make foo
Aqui está minha tentativa que não funcionou:
foo:
group_number=$(shell echo $$(( $(test_group) - 1 )))
tests="$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}')"
run_tests $${tests}
- as
-1
obras - listar os arquivos funciona, mas não reduzi-lo a cada linha y
- armazenar os nomes dos arquivos em uma variável e usá-la para o próximo comando não funciona
Portanto, não descobri como fazer com que os comandos vejam as duas variáveis: as que defino no destino e as fornecidas pelo comando de chamada.
Atualização :
Eu posso fazê-lo funcionar como uma linha, mas eu preferiria algo mais legível, pois meu real run_tests
é um comando longo e feio por si só:
run_tests $$(ls *.feature | awk 'NR%$(test_group_count)==( $(test_group) - 1 )')
Seu
${group_number}
será substituído pela macro make com esse nome. Mas a linha acima a define como uma variável de shell (em um shell diferente daquele em que você está usando; simplesmente dobrar$
não funcionará).Você deve defini-la como uma macro -- ou seja, não em uma regra, em uma linha sem tabulação. Mesma coisa com
tests
; cada linha é executada em um shell diferente, você não pode compartilhar variáveis entre elas.Solução de trabalho: