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:
Ele depende de
bash
(ou de um shell com a mesma sintaxe de array) sem definir amake
variávelSHELL
como/bin/bash
(ou qualquer que seja o caminho para o arquivo executável do shell).Depende de cada ação sendo executada na mesma instância do shell. Normalmente, cada linha de ação é invocada por umseparado
$SHELL
(/bin/sh
por padrão), o que significa que você não pode definir uma variável shell em uma linha e depois usá-la em outra, oucd
em um diretório e então assumir que ainda está no mesmo diretório na próxima linha do Makefile.
Eu provavelmente reescreveria o setup
alvo 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 bash
shell ser o shell usado por make
e também corrige a ordem dos argumentos cp
(você tem os seus de trás para frente).