makefile은 다른 대상을 실행합니다


123

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

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

"make all"을 실행하기 전에 터미널에서 "make clean"다음에 "clear"를 계속 실행하고 있음을 깨달았습니다. 불쾌한 C ++ 컴파일 오류를 살펴보기 전에 깨끗한 터미널을 갖고 싶습니다. 그래서 세 번째 타겟을 추가하려고했습니다.

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

이것은 작동하지만 이것은 make의 두 번째 인스턴스를 실행합니다 (나는 믿습니다). 두 번째 make 인스턴스를 실행하지 않고 동일한 기능을 얻을 수있는 올바른 방법이 있습니까?

답변:


172

실제로 당신이 옳습니다 : 그것은 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!")

6
@ sas4740 : 기본적으로 뒤 따르는 모든 .PHONY : 것은 항상 실행되는 일부 키워드로 취급되는 반면 비 포니 타겟은 파일입니다.
Dacav 2010

"주문 전용 전제 조건"은 조건부입니까? 목표 t2의 경우 t0이 t1을 성공적으로 실행하고 두 성공이 t3에서 일부 작업을 실행하는 경우에만 t0을 먼저 수행합니다
fantastory

1
@fantastory, 아니, 나는 그들이 독립적 이라고 생각 합니다. t2에 따라 달라집니다 t0, t1하고 t3. 이 필요한 경우에는 놓아야 t3요구하는대로 t2, t1에서 요구 t3하고 t0요구하는대로 t1. 이것은 세 가지 다른 규칙을 의미합니다. 그러나이를 확인해야합니다. 100 % 확실하지 않습니다.
Dacav 2015 년

3
"주문 전용 전제 조건"독립적
fantastory

2
'전체'보다 '클린'이 수행된다는 보장이 어디에 있는지 모르겠습니다. 당신이 그들을 바로 넣었다는 사실 | 순서대로 실행하지 않습니다. 주문 전용 종속성은 이러한 작업 후에 대상이 불필요하게 업데이트되지 않음을 의미합니다. 종속 요소의 순서와 관련이 없습니다 ... 또는?
CygnusX1 2016

6

make all"신규"대상에서 줄 을 제거한 경우 :

fresh :
    rm -f *.o $(EXEC)
    clear

다음과 같이 실행되는 명령을 간단히 실행할 make fresh all수 있습니다 make fresh; make all.

어떤 사람들은 이것을 make의 두 번째 인스턴스로 생각할 수 있지만 확실히 make의 하위 인스턴스 (make 내부의 make)가 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.