Makefile: 선택적 종속성 순서 확인

Makefile: 선택적 종속성 순서 확인

저는 마이크로컨트롤러 작업을 위한 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(어떤 순서로든) 먼저 빌드한 다음 플래시한 다음 직렬 인터페이스를 엽니다.

관련 정보