2012-03-09 4 views
1

에 허위 전제 조건이 포함되지 않도록하려면 어떻게해야합니까? 목표를 작성하기 전에 항상 실행해야하는 대상을 선언해야한다는 전제 조건이 있습니다. 실제로 파일을 생성하지는 않습니다. 문제는 내가 타겟 자체의 첫 번째 의존성이라고 선언하면, 가짜 의존성이 $ ^로 끝나고 이어지는 연결 단계를 혼란스럽게 만든다.

다른 곳
.PHONY: start 
    sample-prog-1 : start sample-prog-1.o 

내가 오브젝트 파일에서 실행 파일을 구축하기위한 규칙이 있습니다 : 여기

은 예입니다

%: %.o 
     echo "Building executable [email protected]";$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

문제는, "시작"가짜 대상, 그것 때문에 존재하지 않지만 링크 단계가 객체 파일 중 하나 인 "start"와 함께 호출되므로 빌드 프로세스가 실패합니다!

%: %.o 
    echo "Building executable [email protected]";$(CC) $(LDFLAGS) $(shell echo "$^" | sed s/start//g) $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

그러나 매우 해키 추한 보이는뿐만 아니라

, 그것은 또한 내가 할 수있는 의미 '

나는 오브젝트 파일의 목록에서 빼내야 "시작"하는 것입니다있는 작업 주위에 발견 그 안에 "시작"이있는 소스 파일이 없습니다. 또한 "시작"은 항상 다시 만들어지기 때문에 항상 sample-prog-1을 재구성해야합니다.

이것은 잘못된 솔루션처럼 보입니다. 그러나이 작업을 수행하는 "올바른"방법은 무엇입니까? 난 내가 이런 일에 실행을 고려 뭔가해야한다 생각하고 있어요 :

sample-prog-1 : sample-prog-1.o 
    do_sample-prog-1 : start sample-prog-1 

를하지만 지금 내가 앞에 추가 또는 일부를 추가하는 것을 기억해야 주어진 목표를 구축하려는 경우 때문에 이것은 직관적입니다 실행 파일이 빌드되기 전에 시작 코드가 실행되도록 해당 대상 이름의 다른 문자열.

sample-prog-1 : sample-prog-1.o | start 

무엇보다도, 위해 전용 전제 조건이 $^에 표시되지 않습니다 :

답변

3

당신은 order-only prerequisite이 고려할 수 있습니다. 당신이 GNU-메이크업을 사용하는 경우 단지 개체를 가져 내장 filter를 사용,

sample-prog-1 : sample-prog-1.o start 

%: %.o 
     echo "Building executable [email protected]";$(CC) $(LDFLAGS) $< $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

을 또는 :

+0

정확히 내가 무엇을 찾고 있었습니까, 감사합니다! – Michael

+0

이상하게도 make는 내 주문만으로 선행 조건을 먼저 실행하지 않습니다. 물론이 작업을 수행 할 수 없다는 것을 알 수는 없습니다. 그것은 출력을 엉망으로 만든다. 왜냐하면 지금 시작하는 컴파일의 세부 사항을 반향하기 전에 컴파일하는 것을 볼 수 있기 때문이다. – Michael

+0

무언가의 빌드 전에 prereq를 실행하려면, 무언가의 전제가 될 필요가있다. 이 예제에서'start'는 .o 파일의 전제 조건이 아니므로 .o 파일이 먼저 만들어 질 수도 있습니다 (또는 동시에 -j를 사용하는 경우). 현재 암시 된 유일한 순서는 링크 단계 전에'start'가 실행된다는 것입니다. –

1

당신은 .o 인 목표 후 포니 타겟을 넣고 $^ 대신 $<를 사용할 수 있습니다 파일 :

$(CC) $(LDFLAGS) $(filter %.o $^) $(LOADLIBES) $(LDLIBS) -o [email protected] 
+0

대상이 하나 이상의 개체 파일을 필요로하지 않는 한 첫 번째 방법은 좋습니다. 두 번째는 효과적이며 약간만 복잡합니다. +1 – Beta

+0

어떤 경우에는 여러 개의 오브젝트 파일이 있으므로 두 번째 방법을 사용해야합니다.이것은 내가 시도한 무언가의 짧은 버전 일 뿐이며, 시작 부분이 변경되었다고 생각하기 때문에 필요하지 않더라도 여전히 실행 파일을 다시 빌드하려고 시도하는 것이 문제라고 생각합니다. – Michael

관련 문제