Não é possível acessar arquivos de dentro do makefile

0

Sempre que faço

for f in data/*; echo $f; done

de um terminal, ele exibe corretamente todos os caminhos.

No entanto, se eu adicionar a linha mencionada a um makefile, digamos

test:
    for f in data/*; echo $f; done

e, em seguida, executa make test , em vez de gerar os arquivos sempre gera uma string vazia. Ele faz isso um número de vezes igual ao número de arquivos / diretórios no diretório, portanto, ele parece fazer um loop corretamente.

Por que isso?

Edit: Descobri que fazer $$f em vez de $f é o truque, mas deforma a saída se, por exemplo, eu usar time para cronometrar o comando.

Editar # 2: aqui está um exemplo do comando time:

do makefile: for f in data/ascending_order/*; do time echo $$f; done

data/ascending_order/01/
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 804maxresident)k
0inputs+0outputs (0major+232minor)pagefaults 0swaps

do terminal for f in data/ascending_order/*; do time echo $f; done

data/ascending_order/01

real    0m0.001s
user    0m0.000s
sys     0m0.000s
    
por Mike 12.11.2018 / 18:35

1 resposta

2

O primeiro problema ( echo $f ) é devido a escapar dentro do Makefile, se você usar $f , então o make vai pensar que você está se referindo à variável make ao invés do shell e ele expandirá esse (para vazio), o que fará com que o seu shell execute um único echo com uma linha em branco para cada arquivo. A solução é escapar do $ dobrando-o, em outras palavras, use $$f , nesse caso o make consumirá um dos $ s e passará ao shell um $f , que é o que você deseja.

Com relação ao segundo problema (formato de time output), o que você está vendo é a diferença no formato de saída entre o bash time embutido e o comando externo /usr/bin/time .

make executará os comandos em seu Makefile passando-os para /bin/sh , que algumas distribuições do Linux (principalmente Debian e Ubuntu) apontam para dash , que é um shell mais simples que não implementa uma construção em time e acabaria invocando o comando externo nesse caso.

Você pode obter o bash time output dizendo ao make para executar os comandos em seu Makefile usando bash, o que você pode fazer com esta atribuição de variável em seu Makefile:

SHELL = /bin/bash
    
por 12.11.2018 / 19:16

Tags