make
전체 소스 트리를 다시 컴파일하지 않고도 언제든지 프로세스를 중단 할 수 있다는 것을 알고 있습니다 . 내가 아는 한, make
대상은 아직 컴파일되지 않았거나 마지막 컴파일 이후 소스 코드가 수정된 경우에만 컴파일됩니다.
그러나 내가 중단하면 make
분명히 하나 이상의(동시성 수준에 따라) 준비가 완료된 바이너리가 하나 이상 있을 것입니다. 다음에 내가 달리면 그들은 무엇을 할 것인가 make
? 아니면 부분적으로 컴파일된 바이너리를 피하기 위해 Ctrl+를 누르면 현재 대상이 완료됩니까 ?C
답변1
make
간단히 말해서, 각 단계가 여러 파일을 입력으로 사용하고 단일 파일을 출력으로 생성하는 (잠재적으로 큰) 수의 단계가 있는 것으로 생각할 수 있습니다 .
단계는 "컴파일 file.c
대상" file.o
또는 " ld
링크 사용 main.o
"일 수 있습니다. 중단하면 현재 실행 중인 단계가 종료되고 처리 중이던 출력 파일이 삭제됩니다. 일반적으로 "반쯤 준비된 바이너리"는 남지 않습니다.file.o
program
make
CtrlC
재부팅하면 make
모든 입력 및 출력 파일의 타임스탬프를 확인하고 다음 단계를 다시 실행합니다.
- 입력 파일의 타임스탬프가 출력 파일보다 최신입니다.
- 출력 파일이 존재하지 않습니다
이는 일반적으로 단계를 실행하는 데 오랜 시간이 걸리는 경우(최신 컴퓨터에서는 드물지만 대규모 프로그램의 단계는 ld
설계 시 쉽게 몇 분이 걸릴 수 있음) 중지하고 다시 시작하면 해당 단계가 처음부터 시작된다는 의미입니다.make
make
평균화의 현실은 Makefile
위에서 설명한 것보다 훨씬 더 복잡하지만 기본 원칙은 동일합니다.
답변2
Ctrl+ Ca가 SIGINT
실행 중인 프로세스로 전송되도록 합니다. 이 신호는 프로세스에 의해 포착될 수 있습니다. Make 소스 코드에서 다음 위치에서 이 신호에 대한 트랩을 찾을 수 있습니다 commands.c
.
/* If we got a signal that means the user
wanted to kill make, remove pending targets. */
if (sig == SIGTERM || sig == SIGINT
... remove childrens ...
/* Delete any non-precious intermediate files that were made. */
remove_intermediates (1);
remove_intermediates()
예, 정리 기능입니다 make
. 여기에서 정의를 참조하세요.
/* Remove all nonprecious intermediate files.
If SIG is nonzero, this was caused by a fatal signal,
meaning that a different message will be printed, and
the message will go to stderr rather than stdout. */
나중에 볼 수 있는 함수에서는 효과적으로 제거됩니다.
status = unlink (f->name);
결론적으로:
일반적으로 컴파일을 중단하는 것을 두려워하지 마십시오 make
. 잡을 수 없는 신호( )가 아닌 경우 SIGKILL, SIGSEGV, SIGSTOP
중간 파일을 정리합니다.
답변3
무언가가 중지되면 make
(ctrl-C, 종료 또는 명령 실패 등) 완료된 작업이 보존됩니다. 요약할 때 항상 그렇듯이 추가로 수행해야 할 작업이 무엇인지 파악하고(파일이 변경되었거나 처리할 필요가 전혀 없기 make
때문에 중요하지 않음 ) 작업을 계속합니다.make
위의 설명에서는 관련 Makefile
설명이 올바른 실행을 위한 종속성과 명령을 설명한다고 분명히 가정하므로 (재)작성해야 할 것은 모두 다음과 같습니다.