私は、setup と clean という 2 つのターゲットを持つ Makefile を作成しようとしています。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 に 2 つのエラーがあります:
変数を(またはシェルの実行可能ファイルへのパス)に
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
(引数が前後逆になっている)。