サポートしているプラットフォームを使用している場合inotifywait
(私の知る限り、Linux のみです。しかし、Make について尋ねたので、Linux を使用している可能性が高いようです。OS X については、この質問を参照してください)、次のようなことができます。 :
inotifywait --exclude '.*\.swp|.*\.o|.*~' --event MODIFY -q -m -r . |
while read
do make
done
それを分解する:
inotifywait
ファイル システム イベントをリッスンします。
--exclude '.*\.swp|.*\.o|.*~'
.swp
、.o
またはで終わるファイルを除外します~
(おそらく、このリストに追加することをお勧めします)。
--event MODIFY
見つけたら、イベントが発生したファイルのファイルパスを出力します。
-q
起動メッセージを出力しません (そのため、make が時期尚早に呼び出されることはありません)。
-m
連続して聞く。
-r .
現在のディレクトリで再帰的にリッスンします。次に、行が読み込まれるたびに make を呼び出す単純なループにパイプされます。
ニーズに合わせて調整してください。マンページが役立つ場合がinotifywait --help
あります。
より詳細なスクリプトを次に示します。私はそれをあまりテストしていないので、識別して使用してください。これは、Git でブランチを切り替えるときなど、不必要に何度もビルドが行われないようにするためのものです。
#!/bin/sh
datestampFormat="%Y%m%d%H%M%S"
lastrun=$(date +$datestampFormat)
inotifywait --exclude '.*\.swp|.*\.o|.*~' \
--event MODIFY \
--timefmt $datestampFormat \
--format %T \
-q -m -r . |
while read modified; do
if [ $modified -gt $lastrun ]; then
make
lastrun=$(date +$datestampFormat)
fi
done