Я пытаюсь создать Makefile с двумя целями: setup и clean. Цель setup должна найти все файлы в /usr/lib/man-db и скопировать их в каталог 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
решение1
В вашем Makefile есть две ошибки:
Он полагается на
bash
(или на оболочку с тем же синтаксисом массива) без установки переменнойmake
( или любого другого пути к исполняемому файлу оболочки).SHELL
/bin/bash
Он полагается на каждое действие, выполняемое в одном и том же экземпляре оболочки. Обычно каждая строка действия вызываетсяотдельный
$SHELL
(/bin/sh
по умолчанию), что означает, что вы не можете задать переменную оболочки в одной строке, а затем использовать ее в другой илиcd
в одном каталоге, а затем предположить, что вы все еще находитесь в том же каталоге в следующей строке Makefile.
Я бы, наверное, переписал setup
цель как-то так
setup:
mkdir -p proj/lib proj/bin
find /usr/lib/man-db -type f -name '*.so' -exec cp {} proj/lib \;
Это дополнительно не зависит от того, bash
является ли оболочка оболочкой, используемой make
, и это также исправляет порядок аргументов cp
(ваши аргументы идут задом наперед).