2012-04-16 1 views
7

내 프로젝트에서 몇 가지 심볼릭 링크가 필요합니다.Makefile에서 심볼릭 링크에 대한 의존성이 있습니까?

src/openlayers에서 폴더 imgthemecontrib/openlayers으로 심볼릭 링크되어야합니다. contrib/openlayers 폴더도 자동으로 만들어야합니다.

.PHONY: run 
run: contrib/openlayers/theme contrib/openlayers/img 
    ../bin/pserve development.ini --reload 

contrib/openlayers/theme: 
    ln -s src/openlayers/theme [email protected] 

contrib/openlayers/img: 
    ln -s src/openlayers/img [email protected] 

하지만이 규칙은 매번 기호 링크를 만들려고합니다. (플래그를 ln에 넣으므로 매번 심볼릭 링크가 다시 생성됩니다.)

답변

3

물론 가능합니다. make는 symlink를 포함하여 모든 것을 파일처럼 취급합니다. 파일이 있는지 확인합니다 (선행 조건을 나열하지 않았으므로 시간 소인 비교는 없습니다). 심볼릭 링크의 경우 링크가 가리키는 것이 무엇이든 상관없이 링크 자체를 검사합니다.

당신은이 일을 할 때 어떤 일이 발생 하는지를 보여주지 않지만 설명에 따라 두 가지 중 하나가 발생합니다 : (a) contrib/openlayers 디렉토리가 없으므로 ln 명령이 오류를 생성하고 생성하지 않습니다 심볼릭 링크를 만들면 다음 번에 실행될 때 다시 만들려고합니다. (b) 심볼릭 링크가 잘못 작성되어 아무것도 가리 키지 않습니다. make는 그것이 존재하는지 확인하려고 시도 할 때 make가 시도 할 것을 의미합니다. 그것을 다시 만드십시오.

예를 들어 src 디렉토리가 contrib 디렉토리의 형제 인 경우 심볼릭 링크가 잘못되었습니다. 당신은 얻을 것이다 :

contrib/openlayers/theme -> src/openlayers/theme 

또는 커널이 시도를 해결하기 위해 :

contrib/openlayers/src/openlayers/theme 

그것은 만약 당신이 원하는 희박합니다.

contrib/openlayers/theme: 
     mkdir -p contrib/openlayers 
     ln -s ../../src/openlayers/theme contrib/openlayers/theme 

그런 다음 당신이 가고 싶은 곳 심볼릭 링크, 한 번 생성이 실제로 가리키는 지 확인 : 나는이 같은 것을 사용하는 것이 좋습니다.

+0

맞아요, 심볼릭 링크가 깨졌습니다. –

12

symlink가 기존 파일을 올바르게 가리키고 있음에도 불구하고이 문제가 발생하는 경우 : "make"가 심볼릭 링크의 대상 파일의 mtime을보고, 이 아니란 점을 염두에 두십시오. at 심볼릭 링크 자체의 mtime.

따라서 "ln -s"를 호출하는 규칙이 심볼 링크가 가리키는 파일보다 인 종속성을 갖는 경우 "make"는 매번 해당 규칙의 명령을 다시 실행해야합니다. 파일을 가리키는 심볼릭 링크를 만들면 해당 파일의 mtime이 업데이트되지 않으므로 여러 번 반복됩니다.

"touch"명령을 사용하여 링크 대상에 의존성보다 최근 mtime이 더 오래 있는지 확인할 수 있습니다.

+1

좋은 지적! 내 규칙이 링크를 만들고 싶어하는 이유를 알아내는 데 도움이되었습니다 (http://stackoverflow.com/a/19213369/1510289). –

관련 문제