如果 foo_user.cpp 依赖于 foo.h,则构建了 foo_user.cpp,然后将 foo.h 的修改时间设置为更早的时间,make 将不会重建 foo_user.cpp(因为 foo.cpp 是“较新的”)。我更希望 make 记录依赖项的修改时间,并且如果它们发生了根本变化(较新或较旧),则认为该依赖项的目标已过时。 GNU 可以做到这一点吗?如果没有,有没有简单的替代方案?
如果您好奇这种情况是如何发生的:foo.h 驻留在符号链接文件夹中。符号链接可能指向foolib-1.0文件夹、foolib-2.0文件夹等。当符号链接指向库的不同版本(甚至是旧版本)时,应该重新构建foo_user.cpp。如果我只是将 symlinkfolder/foo.h 指定为 foo_user.cpp 的依赖项,则 make 仅关注 foo.h 的时间戳,而不是访问 foo.h 的符号链接目录的时间戳。我无法将符号链接本身添加为依赖项,因为 make 规则是由编译器生成的(GCC 有一个特殊的标志,给定该标志后,它会为源文件依赖的所有标头输出 make 规则)。
我试图理解为什么你不能只添加符号链接作为依赖项。我想你的自动依赖关系在一行上,但你可以有任意多的依赖关系。
x.o: a.h b.h
x.o: c.h
x.o: d.h
但话虽如此,似乎很可能make
将统计符号链接的目标,而不是符号链接本身,因此可能不是 DTRT。我想只要你创建符号链接,你就可以在某个地方触摸一个文件,但我也想你已经想到了这一点......
你可以有一个运行的规则ls -id link/. > test
,这会将链接目标目录的 inode 号放入test
。那么你可以cmp test save
, where save
是从上次运行开始的。然后你就可以制定规则了make clean && make target
如果它们不同。
targetwrapper:
ls -id link/. > test
cmp test save || make clean
make realtarget
cp test save
clean:
echo cleaned
realtarget:
echo made
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)