![외부 매개변수 및 내부 변수가 포함된 Makefile 명령](https://linux55.com/image/157264/%EC%99%B8%EB%B6%80%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EB%B0%8F%20%EB%82%B4%EB%B6%80%20%EB%B3%80%EC%88%98%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20Makefile%20%EB%AA%85%EB%A0%B9.png)
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 매크로로 대체됩니다. 그러나 위의 줄은 이를 쉘 변수로 설정합니다(사용 중인 쉘과 다른 쉘에서 단순히 두 배로 늘리면 작동하지 않습니다 $
).
매크로로 정의해야 합니다. 즉, 규칙이 아니라 탭이 아닌 들여쓰기 줄에 정의해야 합니다. 에서도 마찬가지입니다 tests
. 각 줄은 서로 다른 셸에서 실행되며 둘 사이에 변수를 공유할 수 없습니다.
작업 솔루션:
foo: group_number=$(shell echo $$(( $(test_group) - 1 )))
foo: tests=$(shell ls *.feature | awk 'NR%$(test_group_count)==${group_number}')
foo:
run_tests ${tests}