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
s가 올바르게 실행하기 위한 종속성과 명령을 설명한다고 분명히 가정하므로 (재)만들기 필요한 모든 것이 있습니다.