카테고리 보관물: 리눅스

리눅스

컴파일을 계속하려면 어떻게해야합니까? 후에 소스

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



답변

간단히 말해서, make각 단계는 많은 파일을 입력으로 사용하고 하나의 파일을 출력으로 작성하는 단계 수 (아마도 많은 수)를 갖는 것으로 생각할 수 있습니다 .

하는 단계 일 “컴파일 수 file.cfile.o또는”사용 ” ld링크 main.ofile.oprogram“. 당신이 방해하는 경우 makeCtrlC, 다음 현재 실행 단계 (또는해야한다)가 작업 된 출력 파일을 제거 할 종료됩니다. “반이 준비된 바이너리”가 남아 있지 않습니다.

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

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

이는 일반적으로 단계를 실행하는 데 시간이 오래 걸리는 경우 (현대 컴퓨터에서는 드문 일이지만 ld큰 프로그램 의 단계 make는 설계 시 몇 분이 걸릴 수 있음 ) 중지 및 다시 시작 make하면 해당 단계가 처음부터 다시 시작 됩니다.

평균의 현실은 Makefile위의 설명보다 상당히 복잡하지만 기본 사항은 동일합니다.


답변

Ctrl+ CSIGINT실행중인 프로세스로 a 를 전송합니다. 이 신호는 프로세스에 의해 잡힐 수 있습니다. 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잡을 수 없는 신호 ( ) 가 아닌 경우 중간 파일을 정리합니다.


답변

무언가가 중지되면 make, 작업이 이미 완료 숙박 (가 CTRL-C, 종료, 또는 실패하더라도 명령 수). 재 작성 할 때 make항상 수행합니다 여전히 (파일이 변경되거나 때문에 수행에 필요한 사항을 파악 make문제가 처리 한있어 결코하지 않음) 및 작업로에 간다.

위의 설명은 관련 항목이 Makefile올바르게 실행하기위한 종속성 및 명령을 설명한다고 가정 하므로 모든 (재) 제작해야합니다.


답변