Em um Makefile, como posso começar a processar um arquivo antes de terminar a construção?

1

Estou usando make para automatizar um projeto que gera muitos dados e, em seguida, o processa com receitas mais ou menos assim:

processed-data: data
    data-processing-program $^ > $@

data:
    output-data > $@

O data tem sua própria receita, porque vários outros destinos o processam também .

O programa output-data é executado por um tempo. Uma vez feito, o data-processing-program começa e, eventualmente, produz processed-data :

data output, then processing

Isso pode ser claramente mais rápido, executando ambos em paralelo, transmitindo data para o data-processing-program antes que o arquivo seja concluído:

simultaneous output and processing

Como expresso esse relacionamento em um Makefile ?

Opções que considerei:

  • Eu tentei usar --jobs / -j para executar várias receitas em paralelo , mas make ainda espera que qualquer receita seja concluída antes de executar seus dependentes.

  • Eu observei que, se estivesse fazendo isso manualmente, escreveria um canal:

    output-data | data-processing-program > processed-data
    

    Isso processaria os dados assim que algum deles estivesse disponível.

    Eu brinquei com uma receita para imitar isso, fazendo com que a receita de data criasse um chamado canalizar em vez de um arquivo e gerar um processo em segundo plano para gravar os dados nele. No entanto, os dados no pipe só podem ser lidos uma vez, tornando impossível processar os mesmos dados com várias receitas.

por Anko 02.06.2015 / 18:24

1 resposta

3

Você pode ter seu bolo e comê-lo também usando tee para salvar uma cópia da saída no disco, enquanto alimenta a outra com data-processing-program :

output-data | tee data | data-processing-program > processed-data

Isso deixará uma cópia de data devidamente marcada com o tempo para outros destinos em seu makefile.

Existem várias maneiras de associar esse pipeline a dependências, então deixarei que você escolha o que fizer sentido para você. (A menos que você ainda esteja preso, nesse caso, acompanhamento.) Por exemplo, como a regra gera data e processed-data , posso escrever:

data processed-data:
    output-data | tee data | data-processing-program > processed-data
    
por 02.06.2015 / 18:34