계속 컴파일하려면 어떻게 해야 합니까?

계속 컴파일하려면 어떻게 해야 합니까?

make전체 소스 트리를 다시 컴파일하지 않고도 언제든지 프로세스를 중단할 수 있다는 것을 알고 있습니다 . 내가 아는 대로 make대상이 아직 컴파일되지 않았거나 마지막 컴파일 후에 소스 코드가 수정된 경우에만 대상을 컴파일합니다.
그러나 내가 중단하면 make(동시성 수준에 따라) 반쯤 준비된 바이너리가 하나 이상 있을 것입니다. 다음에 내가 달릴 때 그것들은 어떻게 됩니까 make? 아니면 부분적으로 컴파일된 바이너리를 피하기 위해 Ctrl+를 누르면 현재 대상이 완료됩니까 ?C

답변1

make간단히 말해서 각 단계는 여러 파일을 입력으로 사용하고 하나의 파일을 출력으로 생성하는 (아마도 큰) 수의 단계가 있는 것으로 생각할 수 있습니다 .

단계는 " file.c다음으로 컴파일 file.o" 또는 " ld링크 main.o및 연결 file.o에 사용 program"일 수 있습니다. make로 중단하면 CtrlC현재 실행 중인 단계가 종료되어 작업 중이던 출력 파일이 제거됩니다(또는 제거해야 합니다). 일반적으로 "반쯤 준비된 바이너리"는 남아 있지 않습니다.

를 다시 시작하면 make모든 입력 및 출력 파일의 타임스탬프를 확인하고 다음 단계를 다시 실행합니다.

  • 입력 파일은 출력 파일보다 새로운 타임스탬프를 갖습니다.
  • 출력 파일이 존재하지 않습니다

이는 일반적으로 단계를 실행하는 데 오랜 시간이 걸리는 경우(최신 컴퓨터에서는 드물지만 대규모 프로그램의 단계는 설계 ld당시 몇 분이 걸릴 수 있음 ) 중지하고 다시 시작하면 해당 단계가 처음부터 다시 시작된다는 의미입니다.makemake

평균의 현실 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처리되지 않았으므로 중요하지 않기 때문에) 작업을 계속합니다.

위의 설명은 관련 Makefiles가 올바르게 실행하기 위한 종속성과 명령을 설명한다고 분명히 가정하므로 (재)만들기 필요한 모든 것이 있습니다.

관련 정보