저는 마이크로컨트롤러 작업을 위한 makefile을 작성하고 있습니다.
다양한 PHONY 목표는 다음과 같습니다.
- 빌드 - 프로젝트를 빌드합니다.
- 플래시 - 플래시 MCU
- 직렬 - Minicom 직렬 인터페이스를 엽니다.
이들 중 어느 것도 다른 것에 엄격하게 종속되지 않습니다. 예를 들어 재구축이나 재플래시 없이 시리얼을 열 수 있습니다.
그러나 다른 대상이 지정된 경우(예 make flash serial
: ) 특정 순서를 준수해야 합니다(플러시 전 빌드, 시리얼 열기 전 플러시).
Make는 -j
동시성이 활성화된 상태()로 실행 중이며 이를 변경하고 싶지 않습니다.
(필요하지 않은 경우) 매번 이러한 종속성을 확인/업데이트할 필요 없이 대상 순서를 보장하기 위해 선택적 종속성을 어떻게 정의할 수 있습니까?
답변1
이것은 GNU Make용으로 작성되었습니다. MAKECMDGOALS가 GNU 전용인지 POSIX인지는 알 수 없습니다.
Make에서는 빌드 대상이 MAKECMDGOALS
변수에 있어야 함을 명시적으로 요구합니다.
정렬 목적을 위해 선택적 종속성을 정의하기 위해 이를 필터링할 수 있습니다.
after = $(filter $(strip $1), $(MAKECMDGOALS))
post_build = $(call after, build)
post_flash = $(call after, flash) $(post_build)
...
.PHONY: build flash serial debug
...
flash: | $(post_build)
st-flash ...
serial: | $(post_flash)
minicom ...
debug: | $(post_flash)
$(GDB) ...
그런 식으로:
make build
프로젝트를 빌드할 것이다make flash
현재 버전으로 MCU를 새로 고칩니다.make serial
직렬 인터페이스를 엽니다make flash serial
(또는 그 반대로) MCU를 플래시한 다음 직렬 인터페이스를 엽니다.make build flash
프로젝트가 빌드된 다음 MCU가 플래시됩니다.make build flash serial
(어떤 순서로든) 먼저 빌드한 다음 플래시한 다음 직렬 인터페이스를 엽니다.