Dependência de URL no make

1

Eu preciso de uma dependência em um Makefile que seja acionado se uma URL tiver sido atualizada desde o arquivo que depende dela. A situação é um pouco complicada:

  • o URL 1 aponta para uma página de download. Eu quero que a regra dependa da data da última modificação desta página.
  • O conteúdo da página do URL 1 tem um URL incorporado apontando para o arquivo real que eu quero baixar (chame esse URL 2).

Eu escrevi um script Python ( lastmod ) que criará (chamando "touch") um arquivo com a mesma data de modificação de um URL. Então, o Makefile agora se parece com algo assim:

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:

onde DOWNLOAD_URL está definido para a página de download. A essência é que eu quero que o .input_url seja gerado somente se a página de download tiver sido modificada desde que foi criada. Para fazer isso, eu preciso sempre regenerar .input_modified, mas ter .input_url gerado apenas se o (recém-gerado) .input_modified tiver um mod time posterior. Eu não estou vendo como separar as noções de "executar esta regra" de "dizer coisas que dependem desta regra para executar". Se eu omitir "FORCE", a regra para .input_modified não será executada. Se eu colocá-lo, ele sempre é executado, mas o mesmo acontece com a regra para .input_url. Existe alguma maneira de conseguir o que eu estou depois?

    
por Scott Deerwester 05.12.2015 / 17:45

1 resposta

2

Você pode definir um pré-requisito somente de pedido sobre o alvo .input_modified , isto realiza o teste se modificado ,

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)
    
por 05.12.2015 / 21:10

Tags