web-dev-qa-db-ja.com

「そのようなファイルまたはディレクトリはありません」を回避する方法 `makeclean`Makefileターゲットのエラー

.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フラグの説明に気づいていませんでした。これが解決策です。

16
jameh

makeruleのrmの代わりに、rm -f(または、組み込みのcleanルールによって提供されるさらに優れた$(RM)を使用します。これはmake -pを使用して見つけることができます)。

26

rm -f

強制し、エラーを出力しません

5
user2815333

ターゲットが失敗したとき

ターゲットが実行されると、成功したかどうかに基づいてステータスが返されます。ターゲットが失敗した場合、makeはそれに依存するターゲットを実行しません。たとえば、上記の例では、「clean」が失敗した場合、rebuildは「build」ターゲットを実行しません。残念ながら、削除するコアファイルがない場合、これが発生する可能性があります。幸い、この問題は、ステータスを無視する必要があるコマンドの前にマイナス記号を含めることで簡単に解決できます。

clean:
        -rm -f *.o core

http://www.cprogramming.com/tutorial/makefiles.html

3
MartenBE

パーティーに遅れましたが、私たちの風変わりなビルド環境で機能した別のソリューションは次のとおりです。

if exist *.exe rm -f *.exe

出力は無料ではありませんが、削減され、きれいに終了します。

# make clean
        if exist *.exe rm -f *.exe

私はこれに落ち着く前に、すべて問題のある多くの代替案を試しました。

0

私は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

0
ling