실제로 당신이 옳습니다 : 그것은 make의 또 다른 인스턴스를 실행합니다. 가능한 해결책은 다음과 같습니다.
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
호출 make fresh
하면 먼저 clean
대상 을 얻은 다음 clearscreen
실행 clear
하고 마지막으로 all
작업을 수행합니다.
8 월 4 일 수정
make의 -j
옵션 이있는 병렬 빌드의 경우 어떻게됩니까 ? 주문을 수정하는 방법이 있습니다. make 매뉴얼, 섹션 4.2에서 :
그러나 때때로 이러한 규칙 중 하나가 실행되는 경우 대상을 업데이트하지 않고 호출 할 규칙에 특정 순서를 적용하려는 상황이 있습니다. 이 경우 주문 전용 전제 조건을 정의하려고합니다. 전제 조건 목록에 파이프 기호 (|)를 배치하여 주문 전용 전제 조건을 지정할 수 있습니다. 파이프 기호 왼쪽에있는 전제 조건은 정상입니다. 오른쪽의 모든 전제 조건은 주문 전용입니다. targets : normal-prerequisites | 주문 전용 전제 조건
물론 일반적인 전제 조건 섹션은 비어있을 수 있습니다. 또한 동일한 대상에 대해 여러 줄의 전제 조건을 선언 할 수 있습니다. 적절하게 추가됩니다. 동일한 파일을 일반 및 주문 전용 전제 조건으로 선언하는 경우 일반 전제 조건이 우선합니다 (주문 전용 전제 조건의 동작의 엄격한 상위 세트이기 때문에).
따라서 makefile은
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
12 월 5 일 수정
태스크 내의 각 명령은 어쨌든 하위 쉘 이 될 것이기 때문에 하나 이상의 makefile 인스턴스를 실행하는 것은 큰 문제가 아닙니다 . 그러나 call 함수를 사용하여 재사용 가능한 메소드를 가질 수 있습니다 .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
것은 항상 실행되는 일부 키워드로 취급되는 반면 비 포니 타겟은 파일입니다.