URL에 종속된 파일 이후 URL이 업데이트된 경우 실행되는 Makefile에 종속성이 필요합니다. 상황은 약간 복잡합니다.
- URL 1은 다운로드 페이지를 가리킵니다. 이 페이지가 마지막으로 수정된 날짜에 따라 규칙이 달라지기를 원합니다.
- URL 1의 페이지 콘텐츠에는 다운로드하려는 실제 파일을 가리키는 URL이 포함되어 있습니다(URL 2라고 함).
저는 Python 스크립트를 작성했습니다(마지막 검토)는 "touch"를 호출하여 URL과 수정 날짜가 동일한 파일을 생성합니다. 이제 Makefile
다음과 같이 보입니다.
output_file: .input_url source_file
wc -l source_file > $@
source_file: .input_url
wget -q -O $@ --no-use-server-timestamps `cat .input_url`
.input_url: .input_modified
wget -q -O - $(DOWNLOAD_URL) | \
sed -n '1,/current version/d;\
/Previous versions/,$$d;
s/.*href="\\([^"]*\\):,*/\\1/p' > $@
lastmod -t $@ $(DOWNLOAD_URL)
.input_modified: FORCE
lastmod -t $@ $(DOWNLOAD_URL)
FORCE:
DOWNLOAD_URL은 다운로드 페이지로 설정됩니다. 요점은 다운로드 페이지가 생성된 이후 수정된 경우에만 .input_url이 생성되기를 원한다는 것입니다. 이렇게 하려면 항상 .input_modified를 재생성해야 하지만 (새로 생성된) .input_modified의 수정 시간이 이후인 경우에만 .input_url을 생성해야 합니다. "이 규칙을 실행하는 것"이라는 개념과 "이 규칙에 의존하는 항목을 실행하도록 지시하는 것"을 구별하는 방법을 모르겠습니다. "FORCE"를 생략하면 .input_modified에 대한 규칙이 실행되지 않습니다. 내가 넣으면 항상 실행되지만 .input_url에 대한 규칙도 마찬가지입니다. 내가 원하는 것을 달성할 수 있는 방법이 있나요?
답변1
다음을 정의하고 싶을 수도 있습니다.전제 조건만 주문초과하다.input_modified실행하는 대상수정된 경우시험,
output_file: .input_url source_file
wc -l source_file > $@
source_file: .input_url
wget -q -O $@ --no-use-server-timestamps `cat .input_url`
.input_url: .input_modified
wget -q -O - $(DOWNLOAD_URL) | \
sed -n '1,/current version/d;\
/Previous versions/,$$d;
s/.*href="\\([^"]*\\):,*/\\1/p' > $@
lastmod -t $@ $(DOWNLOAD_URL)
.input_modified: | if_modified_test # as order-only-prerequisite
.PHONY: if_modified_test # test it
if_modified_test:
lastmod -t .input_modified $(DOWNLOAD_URL)