Makefile CMake如何检测更改的文件

Makefile CMake如何检测更改的文件,makefile,cmake,Makefile,Cmake,我有一个“C”/C++CMake项目,它工作得很好。然而,我有时(重新)构建一个时间略有不同的远程集群。这台机器运行Linux,我正在使用make构建。我想知道是否有一些make/CMake方法可以改变检测文件更改的方式,例如MD5或diff,而不是使用时间戳。否则,我想我要么必须忍受持续的makeclean/make-j周期,要么每次使用特定服务器时都必须更改本地时间 我翻了翻CMake文档,想看看是否有一个标志可以改变这些设置,但没有发现。在没有RTC(如Raspberry)的平台上,这将如

我有一个“C”/C++CMake项目,它工作得很好。然而,我有时(重新)构建一个时间略有不同的远程集群。这台机器运行Linux,我正在使用
make
构建。我想知道是否有一些make/CMake方法可以改变检测文件更改的方式,例如MD5或diff,而不是使用时间戳。否则,我想我要么必须忍受持续的
makeclean
/
make-j
周期,要么每次使用特定服务器时都必须更改本地时间


我翻了翻CMake文档,想看看是否有一个标志可以改变这些设置,但没有发现。在没有RTC(如Raspberry)的平台上,这将如何工作?

对,因此知道CMake/
make
不符合我的要求,也不想让我的机器时间与目标时间同步,我提出了以下建议:

#/bin/bash
触摸src_hash.md5
echo-n make“$@”>mymake.sh
查找`pwd`/../src`pwd`/../include-print0 |
而IFS=read-r-d$'\0'f;做
如果[!-d“$f”];然后
MD5=`md5sum“$f”| awk-v fn=“$f”{print“\”fn“\”1;}”`
echo$MD5>>src_hash.MD5.new
OLDMD5=`grep-e“^\“$f\”src_hash.md5`
如果[[“$OLDMD5”=”];然后
echo“$MD5--[新文件]”
继续#一个新文件,make可以自己处理好
fi
HASH=`echo$MD5 | awk'{print$2;}'`
OLDHASH=`echo$OLDMD5 | awk'{print$2;}'`
如果[[“$HASH”!=“$OLDHASH”];然后
echo“$MD5--已从$OLDHASH更改”
echo-n“\”--if=${f}\”>>mymake.sh
#这在别处运行,无法通过变量传递内容
fi
fi
完成
触摸src_hash.md5.new
mv src_hash.md5.new src_hash.md5
echo使用:`cat mymake.sh`
echo>>mymake.sh#添加新行
chmod+x mymake.sh
/mymake.sh
rm-f mymake.sh
这会在
src_hash.md5
中保留一个源文件哈希列表,每次运行时都会将当前文件与这些哈希进行比较(并相应地更新列表)

最后,它调用
make
,将您提供的任何参数传递给脚本(例如
-j
)。它使用了
--what if=
开关,该开关告诉
make
像给定的文件被更改一样操作,这样就可以优雅地处理构建目标对源/头的依赖关系

您可能还希望将源文件/包含文件的路径作为参数传递,这样这些文件就不会在内部硬编码

或者在所述脚本上再进行一次迭代,使用
touch
更改和恢复文件时间戳,以防
make
对不重建任何内容非常固执:

#/bin/bash
如果[!-d../src]];然后
>&2 echo“错误:../src不是目录或不存在”
出口-1
fi
如果[!-d../包括]];然后
>&2 echo“错误:../include不是目录或不存在”
出口-1
fi
echo“扫描../src和../include中已更改的文件”
如果是第一次运行,请触摸src_hash.md5
rm-f mymaketouch.sh
rm-f mymakerestore.sh
touch mymaketouch.sh
触摸mymakerestore.sh
echo-n make“$@”>mymake.sh
CWD=“`pwd`”
查找../src../include-print0|
而IFS=read-r-d$'\0'f;做
如果[!-d“$f”];然后
fl=`readlink-f“$CWD/$f”`
MD5=`md5sum“$fl”| awk-v fn=“$fl””{print“\”fn“\”$1;}”`
HASH=`echo$MD5 | awk'{print$2;}'`
echo$MD5>>src_hash.MD5.new
OLDMD5=`grep-e“^\”$fl\”src_hash.md5`
OLDHASH=`echo$OLDMD5 | awk'{print$2;}'`
如果[[“$OLDMD5”=”];然后
echo“$f$HASH--[新文件]”
继续#一个新文件,make可以自己处理好
fi
如果[[“$HASH”!=“$OLDHASH”];然后
echo“$f$HASH--已从$OLDHASH更改”
echo“touch-m\”$fl\”>>mymaketouch.sh#将触摸它并更改修改时间
stat“$fl”-c”touch-m-d\%y\\%n\'>>mymakerestore.sh稍后将对其进行恢复,以便在从其他系统复制较新版本时不会遇到问题
echo-n“\”--if=$fl\”>>mymake.sh
#这在别处运行,无法通过变量传递内容
fi
fi
完成
echo使用:`cat mymake.sh`
echo>>mymake.sh#添加新行
echo“exit$?”>>mymake.sh
chmod+x mymaketouch.sh
chmod+x mymakerestore.sh
chmod+x mymake.sh
control_c()#如果用户点击control-c,则运行
{
echo-en“\n恢复修改次数\n”
./mymakerestore.sh
rm-f mymaketouch.sh
rm-f mymakerestore.sh
rm-f mymake.sh
rm-f src_hash.md5.new
出口-1
}
陷阱控制信号
./mymaketouch.sh
/mymake.sh
RETVAL=$?
./mymakerestore.sh
rm-f mymaketouch.sh
rm-f mymakerestore.sh
rm-f mymake.sh
触摸src_hash.md5.new,以防没有新内容
mv src_hash.md5.new src_hash.md5
#现在就做,以防有人点击ctrl+c中间构建,而不是所有文件都已构建
退出$RETVAL
如果您正在构建一个大型项目,甚至可以并行运行哈希:

#/bin/bash
如果[!-d../src]];然后
>&2 echo“错误:../src不是目录或不存在”
出口-1
fi
如果[!-d../包括]];然后
>&2 echo“错误:../include不是目录或不存在”
出口-1
fi
echo“扫描../src和../include中已更改的文件”
如果是第一次运行,请触摸src_hash.md5
rm-f mymaketouch.sh
rm-f mymakerestore.sh
touch mymaketouch.sh
触摸mymakerestore.sh
echo-n make“$@”>mymake.sh
CWD=“`pwd`”
rm-f src_hash.md5.new将使用“>>”,请确保删除该文件
查找../src../include-print0|
而IFS=read-r-d$'\0'f;做
如果[!-d”$