다음과 같이 구성된 메이크 파일이 있습니다.
all :
compile executable
clean :
rm -f *.o $(EXEC)
“make all”을 실행하기 전에 터미널에서 “make clean”다음에 “clear”를 계속 실행하고 있음을 깨달았습니다. 불쾌한 C ++ 컴파일 오류를 살펴보기 전에 깨끗한 터미널을 갖고 싶습니다. 그래서 세 번째 타겟을 추가하려고했습니다.
fresh :
rm -f *.o $(EXEC)
clear
make all
이것은 작동하지만 이것은 make의 두 번째 인스턴스를 실행합니다 (나는 믿습니다). 두 번째 make 인스턴스를 실행하지 않고 동일한 기능을 얻을 수있는 올바른 방법이 있습니까?
답변
실제로 당신이 옳습니다 : 그것은 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!")
답변
make all
“신규”대상에서 줄 을 제거한 경우 :
fresh :
rm -f *.o $(EXEC)
clear
다음과 같이 실행되는 명령을 간단히 실행할 make fresh all
수 있습니다 make fresh; make all
.
어떤 사람들은 이것을 make의 두 번째 인스턴스로 생각할 수 있지만 확실히 make의 하위 인스턴스 (make 내부의 make)가 아닙니다.