Erro "/bin/sh: 1: Erro de sintaxe: "(" inesperado" no Makefile

Erro "/bin/sh: 1: Erro de sintaxe: "(" inesperado" no Makefile

Estou tentando criar um Makefile com dois alvos: setup e clean. O alvo de configuração deve encontrar todos os arquivos em /usr/lib/man-db e copiá-los para o diretório proj/lib.

setup:
    files=( $( find /usr/lib/man-db -name "*.so" ) )
    mkdir proj; cd proj; mkdir lib bin
    cd
    cp $HOME/proj/lib "${files[@]}"
clean:
    rm -r proj

Responder1

Seu Makefile tem dois erros:

  1. Ele depende de bash(ou de um shell com a mesma sintaxe de array) sem definir a makevariável SHELLcomo /bin/bash(ou qualquer que seja o caminho para o arquivo executável do shell).

  2. Depende de cada ação sendo executada na mesma instância do shell. Normalmente, cada linha de ação é invocada por umseparado $SHELL( /bin/shpor padrão), o que significa que você não pode definir uma variável shell em uma linha e depois usá-la em outra, ou cdem um diretório e então assumir que ainda está no mesmo diretório na próxima linha do Makefile.

Eu provavelmente reescreveria o setupalvo como algo como

setup:
    mkdir -p proj/lib proj/bin
    find /usr/lib/man-db -type f -name '*.so' -exec cp {} proj/lib \;

Além disso, isso não depende do bashshell ser o shell usado por makee também corrige a ordem dos argumentos cp(você tem os seus de trás para frente).

informação relacionada