Makefile依赖项是否有"watch"/"monitor"/"guard"程序?

and*_*fff 2 c++ filesystems makefile build guard

我最近在终端窗口中使用nodemon被破坏,每当我保存更改时运行我的Node.js程序.

我想用我的一些C++代码做类似的事情.我的实际项目有很多源文件,但如果我们假设下面的例子,我想make在保存更改时自动运行sample.dat,program.c或者header.h.

test: program sample.dat
    ./program < sample.dat

program: program.c header.h
    gcc program.c -o program
Run Code Online (Sandbox Code Playgroud)

是否有现成的解决方案?

(不启动IDE.我知道很多IDE可以在更改文件时进行项目重建.)

Kei*_*son 5

如果你在一个支持的平台上inotifywait(据我所知,只有Linux;但是既然你问过Make,看来你很有可能在Linux上;对于OS X,请看这个问题),你可以这样做:

inotifywait --exclude '.*\.swp|.*\.o|.*~' --event MODIFY -q -m -r . |
while read
do make
done
Run Code Online (Sandbox Code Playgroud)

打破这种情况:

inotifywait
Run Code Online (Sandbox Code Playgroud)

侦听文件系统事件.

--exclude '.*\.swp|.*\.o|.*~'
Run Code Online (Sandbox Code Playgroud)

排除结尾的文件.swp,.o或者~(您可能希望添加到此列表中).

--event MODIFY
Run Code Online (Sandbox Code Playgroud)

当您找到一个打印出事件发生的文件的文件路径时.

-q
Run Code Online (Sandbox Code Playgroud)

不要打印启动消息(因此不会过早地调用make).

-m
Run Code Online (Sandbox Code Playgroud)

不断听.

-r .
Run Code Online (Sandbox Code Playgroud)

在当前目录上递归监听.然后它被传送到一个简单的循环,它为每一行读取调用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
Run Code Online (Sandbox Code Playgroud)