.oファイルと実行可能ファイルをクリーンアップするための.PHONYクリーンターゲットを定義するMakefileがあります。そのターゲットは次のようになります。
...
.PHONY : clean
clean:
rm $(addprefix $(vq_DIR),$(vq_OBJS)) \
$(addprefix $(vq_DIR),vq) \
$(addprefix $(covq_DIR),$(covq_OBJS)) \
$(addprefix $(covq_DIR),covq) \
$(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \
$(addprefix $(covq_2_DIR),covq_2) \
$(addprefix $(covq_2_DIR),$(test_OBJS)) \
$(addprefix $(covq_2_DIR),test)
すべてが正常に機能しますが、これらのファイルの一部が存在しない場合、rm
はエラーを発生させ(そのようなファイルまたはディレクトリはありません)、出力は、Makefileターゲットが失敗したことを示します。 。
基本的にrm
コマンドに「これらのファイルが存在する場合は削除し、存在しない場合は文句を言わない」ように指示する良い方法はありますか? rm
のマンページを調べましたが、そのようなフラグは見つかりませんでした。
編集:私は実際にマンページの-f
フラグの説明に気づいていませんでした。これが解決策です。
make
ruleのrm
の代わりに、rm -f
(または、組み込みのclean
ルールによって提供されるさらに優れた$(RM)
を使用します。これはmake -p
を使用して見つけることができます)。
rm -f
強制し、エラーを出力しません
ターゲットが失敗したとき
ターゲットが実行されると、成功したかどうかに基づいてステータスが返されます。ターゲットが失敗した場合、makeはそれに依存するターゲットを実行しません。たとえば、上記の例では、「clean」が失敗した場合、rebuildは「build」ターゲットを実行しません。残念ながら、削除するコアファイルがない場合、これが発生する可能性があります。幸い、この問題は、ステータスを無視する必要があるコマンドの前にマイナス記号を含めることで簡単に解決できます。
clean: -rm -f *.o core
パーティーに遅れましたが、私たちの風変わりなビルド環境で機能した別のソリューションは次のとおりです。
if exist *.exe rm -f *.exe
出力は無料ではありませんが、削減され、きれいに終了します。
# make clean
if exist *.exe rm -f *.exe
私はこれに落ち着く前に、すべて問題のある多くの代替案を試しました。
私はrmをあきらめました。次のコマンドは、ファイルとディレクトリを削除します。
find . -delete
ファイルのみまたはdirのみを削除するには、-typeオプションがあります。
# remove only files
find . -type f -delete
# remove only dirs
find . -type d -delete
実際、私は(そのスニペットに基づいて)bombという名前の小さなスクリプトを作成しました。このスクリプトは文句を言わずにファイルを削除します: https://github.com/lingtalfi/bomb