2014-07-08 2 views
0

저는 Makefile을 처음 접했고 여러 Makefile을 확장하는 것을 디버깅하려고합니다.Makefile, dependencies as targets

TARGET2 :이 target1 대상 1은 소스 코드를 기반으로 한

(약 ~ 4 시간 소요)

명령. 목표 2는 결과 파일을 특정 디렉토리에 복사하기로되어 있습니다.

나는 이미 목표 1을 만들었습니다. 목표 2를 바로 만들려고 할 때, 파일/라이브러리가 누락되었다고 생각하고 ~ 5-10 분 동안 다시 빌드하는 것으로 보입니다. 파일이 이동되거나 변경되지 않았습니다. 목표 1 바로 다음에 목표 2를 실행할 수 있으며 항상 몇 분 동안 다시 작성됩니다.

대상 1과 명령 1에서 동일한 디렉토리가 생성됩니다. 이 디렉토리의 타임 스탬프로 인해 이러한 라이브러리가 재구성 될 수 있습니까? 또는 시간 소인 불일치로 재건을 트리거하는 파일입니까?

+0

내게 불분명하다. 이 두 가지 목표에 대해 더 자세히 설명해 주시겠습니까? 그들은 정확히 무엇을합니까? MWE를 줄 수 있습니까? – kebs

답변

1

대상은 실제로 파일 이름입니다. 레시피 (명령)는 해당 대상 파일을 생성하거나 업데이트해야합니다. 그렇지 않으면 make는 대상이 누락되었거나 유효하지 않다고 간주하고 다음 실행시 다시 작성하려고 시도합니다. 매번 재건되는 가짜 목표가 아닌 한.

-d 옵션을 사용하여 make 옵션을 호출하여 빌드 대상과 이유를 확인하십시오. 당신이 전제 조건의 목록에서 일부 파일을 생성 할 수 있도록

+0

대상이 실제로 파일 이름이라는 것은 무엇을 의미합니까? 이 타겟 2는 확실히 파일을 만들지 않습니다. 여러 개의 디렉토리를 만들고 대상 1에서 만든 파일을 복사합니다. – user3816949

+0

그럼'target2'는 가짜 대상이어야하며 해당 디렉토리에 의존해야합니다. 또는 다른 디렉토리를 포함하는 디렉토리 자체 일 수 있습니다. –

+1

_targets은 실제로 파일 이름입니다. :'target2 : target1'은 make에게 파일'target1'을 먼저 빌드 한 다음 파일'target2'을 빌드 할 수 있습니다. 가짜 타겟 만 파일을 만들지 않습니다. –

0

참조, GNU는 main.h

main.c를 컴파일하여 생성 될 main.o 오브젝트 파일 아래의 예처럼, 기본적으로 파일 이름으로 취급하는 모든 대상 이름을
main.o : main.c defs.h 
    gcc -c main.c 

그러나 이것이 항상 당신이 원하는 것은 아니며 때로는 대상 bar을 실행하기 전에 수행해야 할 작업을 수행하는 foo이라는 대상을 갖고 싶을 때가 있습니다. foo은 파일 이름이 아니므로이라는 파일을 생성하지 않습니다.. 여기에 필요한 것은 .PHONY 타겟입니다. 가짜 표적은 실제로 파일의 이름이 아닌 표적입니다. 오히려 그것은 명시적인 요청을 할 때 처형되는 명칭 일뿐입니다. make 위의 예에서

.PHONY: foo 
    foo: bar 

GNU Make Manual on Phony Targets은 파일 이름으로 대상 foo는 치료하지 따라서 foo라는 이름의 파일을 생성하려고 시도하지 말한다. 귀하의 경우에는

target1target that has no recipe 에 따라 달라질 수 있습니다 또는 당신이 (이 경우 당신이 .PHONY 대상이 필요) target1 그래서 make 항상 대신이 파일을 구축하는 시도와 같은 이름을 가진 파일이있을 수 있습니다, 또는 결국 이 다시 빌드해야한다고 간주하여 target1이 빌드 된 후에 변경된 타임 스탬프 또는 오브젝트 파일을 가질 수 있습니다.

또한 target1에는 make이 분석 할 수없는 항목이있을 수 있으므로 이미 빌드되었는지 확인할 수 없습니다. 특정 유형의 아카이브 작업, 텍스트 생성 또는 변환, 다른 빌드 시스템 호출 (예 :ant) 서브 루틴 등