这是命令 makepp_build_cache_control 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
makepp_build_cache -- 如何设置和使用构建缓存
商品描述
C: 清洁,
创造, M: makepp_build_cache_control,
民政总署, S: 显示,
统计
A 建立 缓存 是一个包含 makepp 之前目标副本的目录
建成。 当 makepp 被要求构建一个新目标时,它会查看它是否已经构建了它
在相同条件下的其他地方,如果是这样,只需链接或复制它而不是
重建它。
构建缓存在以下情况下很有用:
· 您正在编写一个程序并对其进行优化编译。 然后你发现一个bug,
并在调试模式下重新编译整个东西。 您找到了错误,现在想要
以优化模式重新编译它。 大多数文件将是相同的。 如果你使用了
在所有编译中构建缓存,makepp 将简单地提取未更改的文件
从构建缓存中删除,而不是重新编译它们。
类似的情况是,如果您通常在一种架构上工作,但短暂地切换到
一个不同的架构,然后你切换回来。 如果旧文件还在
构建缓存,makepp 将不必重新编译任何东西。
· 您已从版本控制中检出特定程序的多个副本
系统,并对每个目录层次结构进行了不同的更改。 (例如,你是
解决不同目录层次结构中的不同错误。)大多数文件将
在两个目录层次结构中相同。 如果您使用构建缓存构建两者,则
在第二个目录层次结构中构建将能够简单地从
构建缓存而不是重新编译相同的文件。
· 您有多个开发人员在处理同一组资源。 每个开发者都是
进行更改,但大多数文件在开发人员之间是相同的。 如果所有的
开发者共享一个构建缓存,那么如果一个开发者的构建编译了一个文件,任何
其他开发人员的构建必须编译相同的文件(具有相同的
包括等)可以只复制缓存的文件而不是重新运行编译。
如果满足以下所有条件,构建缓存会有所帮助:
· 您有足够的磁盘空间。 通常 makepp 会缓存许多副本
每个正在更改的文件,因为它不知道将实际使用哪些文件。
您可以关闭某些文件的构建缓存,但如果构建缓存要
有用,它可能必须有很多文件。
· 您的文件构建时间明显长于复制时间。 如果构建缓存在
相同的文件系统,makepp 将尝试使用硬链接而不是复制文件。
Makepp 必须在构建文件时将文件链接或复制到缓存中,然后它
再次需要时,必须从缓存中链接或复制文件。 此外,
检查所需文件是否实际在
构建缓存,并复制有关文件的构建信息以及文件
本身。
例如,您可能会发现使用构建缓存来编译非常
小模块。 几乎可以肯定不值得让命令产生静态
库(存档文件, libxyz.a),除非您使用链接来节省磁盘空间。
· 很有可能在另一个文件中再次需要某些文件
汇编。 如果你只编译一个软件一次,构建缓存可以
只会减慢速度。
使用构建缓存需要一些设置和维护工作。 请不要
尝试使用构建缓存,直到您了解它们是如何工作的、如何创建它们以及如何
防止它们不断增长并耗尽您的所有可用磁盘空间
系统。
创新中心 a 建立 缓存 运作方式
如果启用构建缓存,则每次构建文件时,makepp 都会将副本存储在
构建缓存。 文件名是一个键,它是所有文件校验和的散列
输入和构建命令和架构。 下次makepp要重建
文件,它会查看构建缓存中是否已经存在具有相同校验和的文件。
如果是这样,文件将从构建缓存中复制出来。
为了提高效率,如果构建缓存与构建位于同一文件系统上,makepp
不会实际复制文件; 相反,它将建立一个硬链接。 这更快更
不会占用任何额外的磁盘空间。 类似的,当makepp想要拉出一个文件时
构建缓存,如果可能,它将使用硬链接,或者在必要时复制它。
警告: 马克普 决不要 除非明确要求,否则从构建缓存中删除文件。
这意味着除非您清理,否则您的构建缓存将继续无限增长
它们会定期更新(有关详细信息,请参见下文)。
构建 缓存 和 资料库
构建缓存和存储库(参见 makepp_repositories)可以解决类似的问题。 为了
在某些情况下,存储库更合适,而对于其他情况,构建缓存更合适
适当。
您也可以将两者结合起来。 如果你有一个巨大的目录结构,有很多
源,您不希望每个开发人员都拥有一份副本,然后您可以提供它们
作为存储库。 生成的文件,带有不同的调试选项等等,然后可以
通过构建缓存更灵活地管理。
构建缓存和存储库之间的主要区别是:
· 构建缓存只能存储构建过程创建的文件。 一个存储库可以
也有原始源文件。
· 存储库中的文件应该 而不去 在构建过程中更改。 构建缓存
没有任何此类限制。
· 存储库中的文件必须与存储库中的文件位于相同的相对位置
构建目录。 例如,如果 makepp 需要文件 子目录1/子目录2/xyz.abc,然后
只看 repository_root/subdir1/subdir2/xyz.abc. 构建缓存中的文件具有
丢失了所有目录层次结构信息,仅根据输入进行查找
以及生成它们所需的命令。
· 存储库中的文件被软链接到它们在构建中的新位置
目录。 构建缓存中的文件被复制或硬链接到它们的新文件中
地点。 如果需要副本,存储库肯定会更快。
· 构建缓存需要花费一些时间将文件放入其中。 存储库没有
任何额外成本(对于当前运行,也就是说,当然有创建成本
事先),但通常需要更多的提前计划。
一般来说,如果您有一个想要的单一中央构建,那么存储库会更有用
所有开发人员从中获取文件。 如果你有一个构建缓存是你想要的
去中心化系统,其中一个开发人员应该从任何其他人那里借用编译的文件
开发人员。
构建缓存和存储库都可以帮助进行变体构建。 例如,如果你想
编译优化的所有源代码,然后再次调试,然后再次优化,
您可以通过使用存储库或
构建缓存。 要使用存储库执行此操作,您必须提前考虑并明确告诉
makepp 使用存储库进行调试编译,否则它会清除您的
初始优化编译。 使用构建缓存,makepp 继续并清除
初始优化编译,但可以快速恢复。
构建 缓存 分组
组是构建缓存的松散耦合。 在 makepp 没有的意义上它是松散的
处理它,以免减慢其构建缓存管理。 从中受益,你
必须使用离线实用程序。 值得注意的是,“clean”命令还执行
复制。 如果您给出不切实际的清洁标准,例如“--mtime=+1000”,则不
清洗发生,只有复制。
分组允许与更多人共享文件,特别是如果您有构建缓存
在开发人员的磁盘上,从硬链接中受益,从而节省提交时间和
磁盘空间。 然而,单独的硬链接仅限于每个磁盘的好处。
通过分组,文件将在 makepp 提交后的某个时间被复制到
构建缓存。 这意味着该文件只会为所有磁盘一起创建一次。
在允许硬链接到符号链接的文件系统上——这似乎仅限于
Linux 和 Solaris——该文件将另外物理存在于一个磁盘上。
此外,它保留在复制之前创建的每个磁盘上,但仅作为
只要它在这些磁盘上使用。 在这种带有符号链接的场景中,您可以选择一个或
更多您希望文件在其上的文件系统。 意识到
成功构建的文件可能会变得不可用,如果它们所在的磁盘物理消失
离线。 重建将解决这个问题,并且可以通过传播
多个首选磁盘上的文件。
复制有几个有趣的用途:
NFS(也可以复制)
您有一个提供首选构建缓存的中央 NFS 服务器。 每台机器
并且开发者磁盘具有用于快速提交的本地构建缓存。 你要么装回去
所有开发者磁盘到NFS服务器,并进行复制和清理
集中,或者您在每个 NFS 客户端机器上本地复制,只处理部分
在那里可见的组。
不安全的磁盘(也可以复制)
如果您在 RAM 磁盘上编译(希望在安全的存储库中编辑您的源代码)
磁盘),您可以将安全磁盘设为首选磁盘。 然后复制将
将文件迁移到安全磁盘,它们在重新启动后仍然存在。 每次重启后
您必须重新创建 RAM 磁盘构建缓存并将其添加到组中(这将
给个警告,这种情况下无害,因为其他组员还记得
它)。
完整磁盘(仅硬链接到符号链接)
如果您的一个磁盘非常满,您可以在所有磁盘上创建构建缓存
其他磁盘优先。 这样复制会将文件从
完整磁盘,随机到任何其他磁盘。
创新中心 至 使用 a 建立 缓存
创新中心 至 展示 制造商 至 使用 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 建立 缓存
创建构建缓存后,它现在可用于 makepp。 有几种
您可以在创建过程中指定的选项; 有关详细信息,请参阅“如何管理构建缓存”。
使用 --build-cache 命令行选项指定构建缓存,使用
makefile 中的 build_cache 语句,或使用 :build_cache 规则修饰符。
到目前为止,我发现使用构建缓存的最有用的方法是:
· 在环境变量 MAKEPPFLAGS 中设置构建缓存路径,像这样(首先
Korn Shell 或 bash 的变体,csh 的第二个):
导出 MAKEPPFLAGS=--build-cache=/path/to/build/cache
setenv MAKEPPFLAGS --build-cache=/path/to/build/cache
现在您运行的每个构建都将始终使用此构建缓存,并且您不需要
修改其他任何东西。
· 在你的 makefile 中用这样的一行指定构建缓存:
BUILD_CACHE := /路径/到/build_cache
构建缓存 $(BUILD_CACHE)
你必须把它放在所有使用构建缓存的 makefile 中(或在一个常见的包含
所有 makefile 使用的文件)。 或者把这个放到你的 根Makepp文件:
BUILD_CACHE := /路径/到/build_cache
全局 build_cache $(BUILD_CACHE)
在多用户机器上,您可以为每个主磁盘设置一个构建缓存
链接的优势。 您可能会发现使用这样的语句更方便:
build_cache $(向上查找 our_build_cache)
它从当前文件系统中的当前目录向上搜索,直到它
找到一个名为的目录 我们的构建缓存. 这对所有人来说都可以是相同的陈述
用户并且仍然单独指向他们磁盘上的缓存。
Solaris 10 可以重新挂载主目录。 你家会
显然是它自己的挂载点,称为 / home /$日志名称,当它实际上打开时
之一。 /出口/家* 磁盘和其他用户的磁盘。 因为它不是
真的是一个单独的文件系统,链接仍然有效。 但是你不能向上搜索。
相反,您可以这样做:
BUILD_CACHE := ${makeperl }
构建 缓存 和 签名
Makepp 根据签名在构建缓存中查找文件。 如果您正在使用
默认签名方式(文件日期+大小),makepp只会拉出文件
如果输入文件的文件日期相同,则构建缓存。 取决于你的构建方式
工作,文件日期可能永远不会相同。 例如,如果您将文件检出到
两个不同的目录层次结构,文件日期很可能是您检查的时间
文件输出,而不是文件签入的时间(当然,取决于您的
版本控制软件)。
您可能想要的是从构建缓存中提取文件,如果文件 Contents 旨在
相同,无论日期如何。 如果是这种情况,您应该使用某种
基于内容的签名。 Makepp 默认情况下为 C 和 C++ 编译执行此操作,但它
将文件日期用于任何其他类型的文件(例如,目标文件或
构建过程未被明确识别为 C 源代码或包含文件)。 如果你想
与构建缓存一起使用的其他类型的文件(即,如果您希望它与
除了 C/C++ 编译命令之外的任何东西),那么你可以放置这样的语句
靠近makefile顶部的某个地方:
签名 md5
强制 makepp 使用基于文件内容而不是日期的签名。
创新中心 而不去 至 缓存 一定 档
可能有些文件你知道你永远不想缓存。 例如,如果
您将日期戳嵌入文件中,您知道在任何情况下都不会
想要从构建缓存中获取文件的先前副本,因为日期戳
是不同的。 在这种情况下,将其复制到磁盘中只是浪费时间和磁盘空间
构建缓存。
或者,您可能认为您不太可能希望缓存最终的可执行文件。
您可能希望缓存用于制作
可执行文件,但通常不太可能构建一个 究竟 相同
可以从相同的输入执行。 同样,在这种情况下,使用构建缓存是一种浪费
磁盘空间和时间,因此禁用它是有意义的。
有时一个文件可能生成的非常快,把它放进去只是一种浪费
构建缓存,因为它可以像复制一样快速生成。 你可能想要
有选择地禁用这些文件的缓存。
您可以通过在中指定“:build_cache none”来关闭特定规则的构建缓存
一个规则,像这样:
our_executable: dateStamp.o main.o */*.so
: build_cache 无
$(CC) $(LDFLAGS) $(输入) -o $(输出)
这个标志意味着这个特定规则的任何输出永远不会被放入
构建缓存,makepp 也不会尝试将它们从构建缓存中拉出。
创新中心 至 管理 a 建立 缓存
makepp_build_cache_control 命令 ...
公会 命令 ...
makepp_build_cache_control, 公会 是一个管理 makepp 构建缓存的实用程序。
什么是 makepp_build_cache_control do 由其参数的第一个词决定。
事实上,这个小脚本是以下命令的包装器,您可能想要
直接在您的 cron 作业中调用,其中可能需要“makeppbuiltin”的路径:
makeppbuiltin -MMpp::BuildCacheControl 命令...
您还可以在加载后从 makefile 使用这些命令,并带有“&”前缀作为
下面以“创建”为例:
perl { use Mpp::BuildCacheControl } # 这是一个 Perl 模块,所以使用而不是包含。
我的缓存:
&create $(CACHE_OPTIONS) $(output) # 调用一个加载的内置函数。
build_cache $(预构建 my_cache)
有效的命令,也采用了一些描述在
makepp_builtins,是:
创建信息图 [选项 ...] 路径/到/缓存 ...
使用给定的选项创建构建缓存。 有效的选项是:
标准选项:“-A、--args-file、--arguments-file=filename、-v、--verbose”
-e 组
--扩展=组
--扩展组=组
将新的构建缓存添加到“组”。 这可能是一个单独的独立
建立缓存到现在。
-f
- 力量
这允许创建缓存,即使 路径/到/缓存 已经存在。 如果它是
它被删除的文件。 如果它是一个目录,它将被重用,无论
它的内容。
-p
--首选
此选项仅在组中有构建缓存时才有意义,这允许
硬链接到符号链接。 在这种情况下,清理会将成员迁移到
首选磁盘。 您可以使用此选项在一个组中创建多个缓存,在
在这种情况下,文件将随机迁移到它们。
-s n1,n2,...
--subdir-chars=n1,n2,...
控制创建多少级子目录来保存缓存文件,
以及每个子目录中有多少文件。 首先 n1 的字符
文件名形成顶级目录名称,来自的字符 n1 至 n2 申请
二级目录名,依此类推。
构建缓存中的文件使用 makepp 使用的数据的 MD5 哈希命名,因此
每个文件名是 22 个 base64 数字加上原始文件名。 如果构建缓存
文件名是 0123456789abcdef012345_module.o,它实际上存储在构建中
缓存为 01/23/456789abcdef012345_module.o 如果您指定“--subdir-chars 2,4”。
事实上,"--subdir-chars 2,4" 是默认值,用于巨大的构建缓存
最多 4096 个目录和 416777216 个子目录。 甚至“--subdir-chars 1,2”或
“--subdir-chars 1”会让你走得很远。 在为巨大而优化的文件系统上
您甚至可以说“-s ''”或“--subdir-chars=”将所有文件存储在
最高水平。
-m 烫发
--模式=烫发
--访问权限=烫发
指定文件添加到构建时的目录访问权限
缓存。 如果您希望其他人将文件放入您的构建缓存中,您必须使
它组或世界可写。 必须使用八进制表示法指定权限。
由于这些是目录权限,如果您授予任何访问权限,您还必须授予
执行访问,否则你会得到一堆奇怪的失败。 即0700意味着
只有这个用户可以访问这个构建缓存。 0770 表示该用户和
组中的任何人都可能对构建缓存具有写访问权限。 0777 意味着
任何人都可以访问构建缓存。 合理的八进制数字是 7
(写)、5(读)或 0(无)。 3(写)或 1(读)也是可能的,允许
要使用的缓存,但不能被浏览,即对于
恶意用户查找要操纵的文件名。
在一组构建缓存中,每个缓存都有自己的值,因此您可以强制执行
不同磁盘的写权限不同。
如果你不指定权限,你在创建时的 umask 权限
适用于构建缓存的整个生命周期。
清洁 [选项 ...] /路径/到/缓存 ...
清理缓存。 Makepp 从不从构建缓存中删除文件; 它是由你决定
使用此命令删除文件。 对于多用户缓存,系统管理员可以做到这一点。
只删除链接数为 1 的文件(否则,文件不会被删除
无论如何都被物理删除了——你只是取消缓存某人显然是的文件
仍然有兴趣,所以其他人可能也有兴趣)。 您提供的标准与
实际缓存的文件。 每个构建信息文件将在其主文件被删除时被删除。
不会留下空目录。 无论链接数和选项如何
给,任何与其构建信息文件不匹配的文件都将被删除,如果它是旧的
超过 10 分钟的安全裕度。
以下选项将时间规范作为参数。 时间规格以
一个“+”表示很久以前,一个“-”表示最近或之间没有任何意义
你给的号码,还有一个。 数字,可能是小数,默认是天数。
但它们后面可能跟有字母“w”(周)、“d”(天,默认值)之一,
“h”(小时)、“m”(分钟)或“s”(秒)。 请注意,天只是 24 小时
忽略夏季和冬季时间之间的任何变化。 例子:
1 24 到 48 小时前
24 小时到 24 小时前的 25 小时
0.5 到 12 小时前 36 天
1 小时前 7 到 14 次之间 24w
-2 不到 48 小时前
+30m 超过 30 分钟前
以下所有选项都与“和”组合。 如果你想要几套
与“或”组合,您必须使用不同的组重复调用此命令
选项。 先做你期望删除最多的那些,然后其他人可以
更快。
标准选项:“-A、--args-file、--arguments-file=filename、-v、--verbose”
-a 规格
--时间 规格
--访问时间 规格
上次读取文件的时间。 对于链接文件,这可能随时发生。
否则,这是最后一次复制文件。 在表现不佳的系统上
这也可能是最后一次磁带备份或搜索索引创建时间。 你可以
尝试从此类操作中排除缓存。
某些文件系统不支持 atime 字段,即使文件系统
确实,有时人们会关闭其文件系统上的访问时间,因为它增加了
大量额外的磁盘 I/O 可能对电池供电的笔记本电脑有害,或者
磁盘速度优化。 (但这可能是可以修复的——请参阅
Mpp/BuildCache.pm 中的 UTIME_ON_IMPORT 注释。)
-b
- 混合
--混合组
通常每个 /路径/到/缓存 您指定将单独对待构建组
缓存它所属的。 每个组只被处理一次,即使你指定
来自同一组的多条路径。 使用此选项,您可以暂时混合所有
您指定的组为一组。
如果您可以硬链接到符号链接,则为干净执行此操作可能会产生不良影响,
因为它可能会将成员从一个组迁移到另一个组。 后续非混合
清理,然后可能会过早地清理它们形成原始组。
-c 规格
--ctime 规格
--更改时间 规格
文件 inode 的最后更改时间。 在链接情况下,这可能是
最后一个用户以不同方式重新创建文件的时间,切断了他的链接
缓存。 这也可能是下面的“--set-user”选项必须的时间
更改用户。 在表现良好的系统上,这也可能是
上次磁带备份或搜索索引创建通过重置
时间。
-m 规格
--时间 规格
--修改时间 规格
文件的最后修改时间。 正如其他地方所解释的那样,不鼓励
让 makepp 更新文件。 所以最后的修改通常是时间
的创作。 (但将来 makepp 可能会选择更新 mtime
删除文件。 这样一来,atime-less 文件系统或副本上的链接就可以
跟踪。)
-g 组
--newgrp=组
--新组=组
将有效和真实的组 ID 设置为组(名称或数字)。 只有 root 可能是
能够做到这一点。 当您使用分组构建缓存时,这是需要的,并且您
根据组 ID 提供对缓存的写访问。 通常不会
root 的组和因此复制将创建不可写的目录没有这个
选项。
这个选项是以等效的实用程序“newgrp”命名的,唉不容易
用于“cron”作业或类似设置。
-i
--构建信息
--构建信息检查
检查构建信息是否与成员匹配。 这个测试相当昂贵所以
您可能会考虑在白天不提供此选项。
-l
--符号链接检查
--符号链接检查
此选项使“干净”读取每个没有外部硬连接的符号链接
链接以验证它是否指向所需的成员。 由于这有点
价格昂贵,建议只在晚上进行。
-M 规格
--及时 规格
--传入修改时间 规格
传入目录中文件的最后修改时间。 这个目录是
用于具有进程特定名称的临时文件,这些名称可以自由写入
并发访问,然后以原子方式重命名为缓存的活动部分。
文件通常只存在于写入它们所需的时间,但它们可以
如果写入它们的进程在它之前异常终止,则成为孤儿
可以删除它们。 这部分缓存先清理,因为链接数
缓存的活动部分可能会受到孤立文件的不当影响。
“--incoming-modification-time”的时间规范必须以“+”开头,并且是默认值
到“+2h”(至少 2 小时前的文件被认为是孤立的)。
-w
--工作日
这会影响时间选项的计数方式。 周末被忽略,好像他们
不在。 一个例外是如果您在周末提供此选项。 然后
周末正常。 所以你可以在从星期二开始运行的 cronjobs 中使用它
通过星期六。 夏令时被忽略。 所以夏季周末可以从周六开始
1:00 至周一 1:00,或南半球冬季周末周五 23:00 至
星期日 23:00 或无论您的时区如何更改时间。 节假日也是
没有考虑到。
-p 代码
--perl=代码
--谓词=代码
TODO:根据组更改调整此描述!
这是瑞士军官的刀。 这 代码 在标量上下文中调用一次
对于每个缓存条目(即不包括目录和元信息文件)。 这是
在 "File::Find" "wanted" 函数中调用,因此请查看那里的变量
用。 已执行“lstat”,因此您可以使用“_”文件句柄。
If 代码 返回“undef”就好像它不存在一样,那就是另一个
选项决定。 如果返回 true,则删除文件。 如果返回 false,则
文件被保留。
-s 规格
- 尺寸 规格
文件大小规范就像时间规范一样,“+”代表
大于或“-”表示小于,但单位必须是“c”(字节、
默认)、“k”(千字节)、“M”(兆字节)或“G”(千兆字节)。
-u 用户
--用户=用户
--设置用户=用户
这个选项非常不同。 它没有说明何时删除文件。 相反它
适用于未被删除的文件。 请注意,在许多系统上只有 root
允许设置文件的用户。 请参阅“使用构建的注意事项
缓存”为什么如果您使用,您可能需要将所有权更改为某些中立用户
磁盘配额。
此策略仅在您可以信任您的用户不会破坏构建时才有效
用于存储超出磁盘配额的任意(即非开发)文件的缓存。
保留关联元数据文件的所有权,因此您始终可以看到
谁缓存了文件。 如果您需要此选项,则可能需要为其提供多个
白天的时候。
有不同的可能策略,这取决于您拥有多少空间以及
构建缓存是否包含链接文件或用户是否只有副本。
几种策略可以组合起来,通过一个接一个地调用它们或以不同的方式调用它们
次。 “show”命令旨在帮助您找到合适的策略。
每晚(从周二到周六)运行可能会指定“--atime +2”(或“--mtime”
如果您没有时间),删除两天内无人阅读的所有文件。
如果您使用链接,您还可以防止在以下情况下发生的快速无用增长
连续的标题更改,永远不会得到版本控制,导致很多对象
正在迅速创建。 类似于每小时运行一次“--mtime=-2h --ctime=+1h”
白天会在不到一个小时内抓到那些被创作者删除的人,
从那以后就没有其他人想要了。
显示 [选项 ...] /路径/到/缓存 ...
这是一种递归的“ls -l”或“stat”命令,显示原始所有者
同样,当缓存文件的所有者已更改并且元数据文件
保留原始所有者(根据“clean --set-user”)。 它显示给定的文件,或
所有在给定的目录下。
字段是,在简短的标准和详细的形式:
模式,模式
缓存文件的八进制模式,通常是它被放入时,减去
写位。
EL,分机链接
组内所有成员的外部硬链接数量。
仅当此值为 0 时,文件才有资格进行清理。
C、副本(仅适用于分组构建缓存)
所有构建缓存中相同文件的副本数。 理想情况下这个
是允许硬链接到符号链接的系统上的一种,但这可能
暂时不可能,同时有多个副本的外部链接
(在这种情况下,如果我们删除它,我们将失去链接计数。
S,符号链接(仅适用于分组构建缓存)
构建缓存之间的符号链接数。 理想情况下,这是
在允许硬链接到符号链接的系统上构建缓存减一。
但正如前一个字段所解释的,可能会有比必要更多的副本,
从而减少链接。
UID 缓存文件的所有者。 这可以通过“clean --user”选项改变。
唯一标识符
构建信息文件的所有者。 这不会被clean改变,允许看到
谁首先构建了文件。
尺寸
(一份副本的)大小(以字节为单位)。
时间,时间,时间
在冗长的形式中,您可以获得文件访问(读取)时间,修改
时间和 inode 更改时间(例如,当某些用户删除他的外部链接时
缓存文件)。 在简短的标准形式中,您只能获得三次中的一次
在三个单独的列中:
广告、医学博士、CD
访问、修改或 inode 更改的工作日。
日期、MDATE、CDATE
访问、修改或 inode 更改的日期。
ATIME、MTIME、CTIME
访问、修改或 inode 更改的日期时间。
MEMBER
缓存文件的完整路径,包括密钥,来自缓存根。
使用 "-v, --verbose" 为每个命令显示的信息允许您获得
给“clean”命令提供哪些选项的印象。 时间显示在
可读形式,以及此文件的寿命的天数、小时数或分钟数
刚刚超过。 如果您将选项加倍,您还会获得每个选项的信息
小组成员。
标准选项:“-A、--args-file、--arguments-file=filename、-f、--force、-o、
--output=filename, -O, --outfail, -v, --verbose"
-a
--时间
--访问时间
在非详细模式下显示文件访问时间,而不是文件修改时间。
-b
- 混合
--混合组
通常每个 /路径/到/缓存 您指定将单独对待构建组
缓存它所属的。 每个组只被处理一次,即使你指定
来自同一组的多条路径。 使用此选项,您可以暂时混合所有
您指定的组为一组。
-c
--ctime
--更改时间
显示 inode 信息更改时间,而不是非详细的文件修改时间
模式。
-d
--可删除
仅显示可删除的文件,即外部链接数为 0 的文件。
-p 模式
--模式=模式
模式 是一个 bash 风格的文件名模式(即 ?, *, [], {,,})
下划线后的成员名称将它们与键分开。
-s 名单
--排序=名单
在非详细模式下更改排序顺序。 列表不区分大小写
列标题的逗号或空格分隔顺序。 有两种特殊情况:
“成员”只考虑键后的名称,即文件名
在缓存之外。 并且有一个特殊的名字“age”,它以任何一个分组
正在显示日期和时间。 此选项默认为“成员,年龄”。
如果你有一个巨大的缓存,排序需要很长时间,或者需要更多
内存超过您的进程允许的内存,您可以通过给出一个空来跳过排序
名单。
统计 [选项 ...] /路径/到/缓存 ...
这会输出几个关于构建缓存内容的统计数据表。 每桌
分为三个列组。 第一列因每个表而异,是
行标题。 其他两组属于总和 尺寸 文件数量和数量 FILES
对于那个标题。 目录和构建信息文件不计算在内,所以这是一个
大小比实际磁盘使用量少一点,文件数量大约一半。
后两组中的每一组都由三列对组成,其中一列带有一个值,
一个是该值所代表的总数的百分比。 第一对显示
文件的大小或文件的数量。 另外两对显示
累积量一次从最小到最大,一次反过来。
前三个表,第一列是 AD, CD or MD 显示访问时间,inode
按天分组的更改时间或修改时间。 天实际上是 24 小时块
从 stats 命令的开始时间开始倒数。 第一个的“0”行
因此,表将显示大小的总和以及不到一天访问的文件数
前。 如果没有文件被访问,那么将没有行“0”。 第三行中的“1”
表将显示 24 到 48 之间修改(即写入构建缓存)的文件
几个小时前。
下一张桌子, EL, 显示外部链接,即有多少构建树共享来自
构建缓存。 这是构建缓存有用性的度量。 唉,只有
当开发人员在自己的磁盘上有大量缓存时有效,否则他们必须复制
这没有留下任何全球性的踪迹。 外链数量越大的内容越多,
更大的构建缓存的好处。
下一张,再来一张 EL, 显示与前一个相同的信息,但加权
通过外部链接的数量。 外部链接计数为 XNUMX 的每个字节或文件
算作一。 但如果计数为十,则这些值将计数十次。 这就是为什么
标题更改为 *尺寸 和 *文件. 这是一个假设值,显示如何
如果使用相同的构建树,会有多少磁盘使用量或有多少文件
没有构建缓存。
再来一张桌子, CS 复制到符号链接,仅适用于分组缓存。 理想情况下所有
成员存在于一个副本中,并且比组中的缓存少一个符号链接。
符号链接保持“0”,直到清除已复制。 副本可能不止一份,
如果几个人在复制之前创建了相同的文件,或者
复制将文件迁移到首选磁盘,但原始文件仍在
用。 当清理发现它们不再有多余的副本时,它们会变成符号链接
外部链接。
标准选项:“-A、--args-file、--arguments-file=filename、-v、--verbose”
-h
- 小时
以更精细的粒度显示前三个表。 列标题
改成 AH, CH or MH 因此。
-p 模式
--模式=模式
模式 是一个 bash 风格的文件名模式(即 ?, *, [], {,,})
下划线后的成员名称将它们与键分开。 所有统计
仅限于匹配文件。
注意事项 加工 - 建立 缓存
在以下情况下,构建缓存将无法正常工作:
·如果makepp运行的命令实际上只是建立一个文件 更新 文件和
不新鲜,那么你应该 不是 使用构建缓存。 (一个例子是
命令更新静态库中的模块(存档文件或带有扩展名的文件)
的扩展 .a)。 正如 makepp_cookbook 中所解释的,在现代机器上几乎
更新存档文件总是一个坏主意——最好从头开始重建它
每次都是因为各种原因。 这是不更新的另一个原因
存档文件。)原因是,如果构建缓存恰好位于
相同的文件系统,makepp 进行硬链接而不是复制文件。 如果你那时
随后修改该文件,makepp 在构建缓存中的文件将
实际上被修改了,你可能会搞砸别人的编译。
在实践中,makepp 通常可以检测到一个文件自从它被修改以来就被修改了。
放置在构建缓存中,它不会使用它,但有时它实际上可能不会
检测修改。
·对于 .o 文件这可能有点错误,因为它们可能(取决于编译器
和调试级别)包含构建它们的源的路径。 这可以使
调试难。 调试器可能会让您编辑原始创建者的副本
源,或者甚至可能找不到文件,如果创建者不再有副本。 马克普
可能有一天会提供一个修补路径的选项,这当然意味着一个副本,
而不是一个有效的链接。
· 任何其他包含路径编码的文件都不应放入构建缓存中
(如果您在多个目录层次结构或多个
开发人员)。 在这种情况下,在不同目录中构建的结果不是
就好像它在同一个目录中一样,所以构建缓存的整个概念是
不适用。 如果在命令行指定目录路径就可以了,比如
这个:
&echo prog_path=$(PWD) -o $(输出)
因为那样命令行会有所不同,makepp 不会错误地拉取
文件从构建缓存中删除。 但是如果命令行没有不同,那么有
可能是个问题。 例如,
echo prog_path=`pwd` > $(输出)
将无法正常工作。
· 使用链接并与同一磁盘上同一项目的许多活跃开发人员时,
构建缓存可以节省大量磁盘空间。 但同时对于个人用户
反之亦然:
想象一下,Chang 是第一个进行完整构建的人。 随之而来的是Ching并获得了一个链接
所有这些文件。 Chang 做了一些根本性的改变,导致大多数事情
重建。 他签入它们,Chong 签出它们并获取指向构建缓存的链接。
Chang 再次进行更改,生成第三组文件。
在这种情况下,无论您使用何种清理策略,都不会删除任何文件,
因为它们都还在使用中。 问题是他们都属于张,
这可以使他达到他的磁盘配额,而他对此无能为力
大多数系统。 请参阅“如何管理构建缓存”下的“clean --set-user”命令
了解系统管理员如何将文件更改为无配额缓存所有者。
· 如果您使用时间戳/大小签名来交叉检查目标及其构建
info(默认),那么就可以得到一个签名别名,其中非
不会检测到相应的文件。 例如,MD5_SUM 构建信息值
可能与目标的 MD5 校验和不匹配。 这通常不是问题,因为
由于构建缓存键匹配,构建缓存中的目标
可替代与构建信息文件对应的目标。
但是,如果您有依赖于构建信息的规则操作,那么这可能会让您
陷入困境(所以不要那样做)。 如果这让您担心,请使用 --md5-check-bc
选项。
同时 ACCESS
构建缓存需要支持并发访问,这意味着实现必须
宽容种族。 特别是,文件可能会在这段时间内变老(删除)
makepp 决定导入目标和导入完成的时间。
此外,有些人在 NFS 上使用构建缓存,这不一定是一致的。 在
换句话说,作者在一台主机上创建和删除文件的顺序不会
必须与阅读器在另一台主机上看到的顺序相匹配,因此竞争 不能
可以通过特别注意文件操作的顺序来解决。 (但是还有
通常大约 1 分钟的 NFS 缓存超时保证写入不会花费
比传播给所有读者的时间长。 此外,通常在
练习至少 99% 的写入在 1 秒内随处可见。)因此,
我们必须容忍缓存目标及其构建信息文件似乎没有的情况
对应。 此外,当文件被删除时,可能会发生一种特殊的竞争。
同时老化和替换,其中文件即使在 NFS 之后也不对应
缓存刷新。 这似乎是不可避免的。
使用 onworks.net 服务在线使用 makepp_build_cache_control