makefile은 다른 대상을 실행합니다 메이크 파일이

다음과 같이 구성된 메이크 파일이 있습니다.

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)가 아닙니다.


답변