makefile で「rm」を避ける

makefile で「rm」を避ける

Makefile の行に関して質問があります。ローカルにインストールされたテスト/ステージング サーバーを「クリーンアップ」するターゲットがあります。現在は次のようになっています。

clean:
    rm -rf $(LOCAL_SERVER_PATH)/*

LOCAL_SERVER_PATH変数が定義されていて、このようになっている限り/srv/www/htdocs、すべて問題ありません。しかし、ユーザーが誤って変数定義を誤って入力したり、何らかの設定手順が間違っていたりして、間違った定義で Makefile が作成された場合はどうなるでしょうか。

本質的に、私は誤って定義されていない になってしまい$(LOCAL_SERVER_PATH)、ターゲットが次のようになってしまうのではないかと懸念しています。

clean:
    rm -rf /*

Makefile をリファクタリングして、このようなエラーに対してより堅牢にすることは可能ですか? Linux インストール全体 (または、ユーザーが「root」ではないため、一部) を消去してしまう可能性のある Makefile を作成したくありません。

答え1

前述のように、変数が空でないことを確認します。

clean:
    test -n "$(LOCAL_SERVER_PATH)" && rm -rf $(LOCAL_SERVER_PATH)/*

同じイディオムは、多数のRPM仕様ファイルで見られ、変数がBUILD_ROOT未設定であることが知られているようです。その代替手段は普遍的に利用可能ではないため(しばらく前のコメントにもかかわらず)、Re: [Fedora-packaging] buildroot を段階的に廃止しますか?)は、今でもあちこちで見ることができます。

答え2

コマンドを使用する代わりにtest、Makefile 内の変数をテストして異なる動作をさせることができます。たとえば、ユーザーにエラーを表示して、Makefile の実行を拒否します。

ifeq (,$(LOCAL_SERVER_PATH))
$(error Set LOCAL_SERVER_PATH variable to run this Makefile)
endif

関連情報