Há algum tempo para dizer ao make para aplicar uma regra a todos os arquivos que correspondem a um padrão?

1

Estou trabalhando em um projeto que possui uma estrutura de diretórios semelhante a esta:

inputs/
   a.txt
   b.txt
   c.txt

outputs/
   a.out
   b.out
   c.out

makefile

Os arquivos na pasta outputs são gerados a partir dos arquivos na pasta inputs e eu quero atualizá-los automaticamente sempre que um dos arquivos de entrada for alterado.

Eu tentei fazer isso criando um makefile com uma regra padrão. (Para manter esta questão simples, estou apenas copiando o arquivo de entrada em vez de transformá-lo)

outputs/%.txt: inputs/%.out
    cp $< $@

No entanto, este makefile não fez exatamente o que eu quero. Se eu executar make outputs/a.txt , aplicarei a regra que escrevi e regenerarei o arquivo de saída se ele estiver desatualizado, mas se eu executar apenas make , nada acontecerá:

make: *** No targets.  Stop.

Existe uma maneira de dizer que por padrão eu quero gerar um arquivo de saída para cada arquivo na pasta de entradas?

edit : fez com que os arquivos de saída tivessem um sufixo de arquivo diferente dos arquivos de entrada.

    
por hugomg 06.12.2016 / 20:51

1 resposta

3

Você normalmente faria isso com um makefile algo assim:

IN = $(wildcard inputs/*.txt)
OUT = $(subst inputs/,outputs/,$(IN))

outputs/%.txt: inputs/%.txt
        cp $< $@

default:  $(OUT)

Isso faz com que o destino padrão (o primeiro no arquivo) dependa de OUT , que é a expansão glob dos arquivos existentes em IN com a sequência de diretórios alterada de entradas para saídas.

Se você quiser alterar o sufixo, há muitas outras funções internas para manipular os destinos. Por exemplo, você pode adicionar uma operação intermediária:

IN2 = $(addsuffix .out,$(basename $(IN)))

A função basename removerá o% final.txt e o addsuffix adicionará% .out .

    
por 06.12.2016 / 21:33

Tags