質問
GNU Makeの$(wildcard)関数がWindowsでディレクトリを開いたままにしておくと、この問題があるようです。 (不明な)投稿" makeがディレクトリを開いたままにしている"。 Googleはこのトピックに関する多くの情報を提供していません。
要するに、Makefileはある時点で$(wildcard)関数を使用し、ディレクトリを開いたままにします。正しく動作するためのルール。再実行" make clean&quot ;;通常は2回目で解決します。
標準のDOSボックスでGNU Makeバージョン3.81を使用しています。上記にリンクされている投稿の著者はCygwinを使用しています。
これに対する修正を見つけた人はいますか?
解決 2
問題の回避策を見つけました。これにより、少なくとも安心して作業できます。
問題は、 $(wildcard)
関数を使用してソースファイルを収集したことです。ただし、私のクリーンルールはディレクトリを削除するだけです。収集する必要はありません。したがって、基本的にソースファイルを収集する必要があるMakefileの一部を条件ステートメントに入れます。
# The clean rule is always parsed
clean:
rm -rf $(OUTPUT_DIRECTORY)
# The compile rule is only interpreted if we did not invoke 'make clean'. We
# can test the value of $(MAKECMDGOALS) for that:
ifeq ($(filter $(MAKECMDGOALS),clean),)
SOURCE_FILES := $(wildcard ...)
compile:
g++ $(SOURCE_FILES) ...
endif
他のヒント
ファイル記述子リークのように聞こえますが、大丈夫です-UNIXでは非常に短命のプロセス(makeなど)には無害ですが、Windowsでは正しいPITAです。
これはmakeのバグであると言われているため、その使用法の問題とは異なり、最新のアップストリームバージョンのソースからビルドされたときに存在することを確認してから対処し、次に GNU makeプロジェクト(または適切なサポート契約を結んでいるディストリビューター)にバグレポートを提出する )、またはソースに飛び込んで自分で修正しようとしています。
Linuxで再現を試みても害はありません。ここでは / proc / self / fd
(または、 makeの子、 / proc / $ PPID / fd
)所属していないもの。