エラー「/bin/sh: 1: 構文エラー: Makefile に「(」予期しないエラーがあります

エラー「/bin/sh: 1: 構文エラー: Makefile に「(」予期しないエラーがあります

私は、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 つのエラーがあります:

  1. 変数を(またはシェルの実行可能ファイルへのパス)にbash設定せずに、 (または同じ配列構文を持つシェル)に依存します。makeSHELL/bin/bash

  2. 各アクションが同じシェルインスタンスで実行されることに依存します。通常、各アクション行は $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(引数が前後逆になっている)。

関連情報