这是命令 makepp_build_check 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
makepp_build_check -- makepp 如何决定重建文件
商品描述
A: "architecture_independent", E: “完全符合”, I: "ignore_action", O: "only_action",
T: “target_newer”
Makepp 存储有关上次构建任何给定文件的各种信息。
此信息包括构建命令、体系结构和所有
文件的依赖关系。 (所有存储的信息都在子目录中 .makepp of
每个目录。)如果这些信息中的任何一个发生了变化,makepp 通常会决定
重建文件。 构建检查方法控制 makepp 的重建决定。
它决定查看哪些信息,忽略哪些信息。
Makepp 通常会自动选择正确的构建检查方法。 但是,您可以
使用 :build_check 修饰符更改单个规则的签名方法
规则,或使用 build_check 语句针对 makefile 中的所有规则,或针对所有
使用 -m 或 --build-check-method 命令行选项一次生成生成文件。
用于决定重建或存储库或构建缓存导入的数据存储在
内部构建信息文件。 你可以用makeppinfo、mppi来显示。 下面每个
方法给出了如何查看其密钥的示例。
构建 查 方法 包括 in 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 分配
目前,发行版中包含了五种构建检查方法:
完全符合
此方法使用文件上的修改日期作为签名。 它重建了
目标,除非以下所有条件都为真:
· 每个依赖项的签名与上次构建时的签名相同。
· 每个目标的签名与上次构建时的签名相同(即,没有一个
自从 makepp 构建目标以来,就已经弄乱了目标)。
· 构建命令没有改变。
· 机器架构(或 Perl 认为的)没有改变。
“exact_match”是默认方法,除非您正在重建 Makefile(见下文)。
这是确保正确构建的一种高度可靠的方法,并且几乎总是
你要。 但是,它确实有一些可能令人惊讶的副作用:
· 如果你一直用传统的make编译,然后切换到makepp,
第一次运行 makepp 时,所有内容都会重新编译。
· 如果你破坏了 makepp 关于上次构建发生的事情的信息(例如,
你删除子目录“.makepp”,或者复制所有内容时不要复制它
否则),然后触发重建。
· 如果用旧版本替换文件,则会触发重建。 这是
通常你想要什么,但它可能会令人惊讶。
· 如果您修改了 makepp 控制之外的文件(例如,您运行
自己编译命令),那么下次makepp会重建文件。 (如果
要避免这种情况,请查看“--dont-build”命令行选项。)
· 当您切换到不同的架构时,会重建与架构无关的文件
建筑学。 这通常不是问题,因为它们通常不会花费很长时间
建立。 所有文件都用架构标记的原因,而不是
只是二进制文件,有时甚至 ASCII 文件也是架构-
依赖。 例如,Solaris“lex”程序的输出不会在
Linux(或者至少在我上次尝试时曾经是这样)。
具体来说,文件不会被重建,或者可以从存储库或构建中获取
缓存,如果以下命令输出保持不变,即匹配的签名
依赖项:
mppi -k'COMMAND ARCH SORTED_DEPS DEP_SIGS ENV_{DEP,VAL}S' 文件
架构_独立
“architecture_independent”方法与“exact_match”相同,只是它不
不检查架构。 这对于与体系结构无关的文件很有用,
当您切换到不同的架构时,不需要重新构建。 为了
例如,如果您已经在 Solaris 上运行了“bison”,则可能不需要在其上重新运行
Linux操作系统。
“architecture_independent”方法最好通过使用
":build_check architecture_independent" 修饰符对产生的每个规则
架构独立文件。 默认情况下,Makepp 从不假设任何文件是
架构独立,因为即使 .c 文件可以依赖于体系结构。 为了
例如,Solaris lex 的输出不会在 Linux 下编译,或者至少它不会
不会上次我试过。 所以你必须手动指定这个构建检查方法
任何真正独立于体系结构的文件。
具体来说,文件不会被重建,或者可以从存储库或构建中获取
缓存,如果以下命令输出保持不变,即匹配的签名
依赖项:
mppi -k'COMMAND SORTED_DEPS DEP_SIGS ENV_{DEP,VAL}S' 文件
忽略动作
“ignore_action”方法与“exact_match”相同,只是它不检查
操作字符串(命令)。 有时命令可以更改而您不想更改
强制重建。
例如,您可能希望明确地将日期放入您的命令中以记录何时
构建已完成,但您不想在每次命令执行时强制重建
执行。 例如,
BUILD_DATE := $(shell 日期)
我的程序:$(模块).o
$(CXX) $(inputs) -DBUILD_DATE="\"$(BUILD_DATE)\"" date_stamp.c -o $(output)
这将编译 日期戳.c 带有最后一个构建日期戳,但不会强制执行
当日期改变时重新编译。 不幸的是,如果有关链接的其他内容
命令更改(例如,您更改链接器选项),它也不会触发重建。
这与 $(changed_inputs) 或 $? 变量为
仅更新目标的操作,而不是从头开始重建它。 为了
例如,您可以像这样更新 .a 文件:
libmine.a : *.o : build_check 忽略_action
$(AR) ru $(输出) $(changed_inputs)
如果您忘记指定“:build_check,这仍然可以正常工作
ignore_action"。但是,假设 .o 文件都没有改变。命令
现在将是“ar ru libmine.a”,这可能与上次不同
(例如,“ar ru libmine.a buggy_module.o”),因此 makepp 将运行该命令。 在这
在这种情况下,该命令除了浪费时间之外不会做任何事情。
不鼓励像这样构建 .a 文件,因为它会在里面留下陈旧的 .o 文件
存档。 如果删除源文件,.o 文件仍在 .a 文件中,
这可能会导致不正确的构建。 最好像这样构建一个 .a 文件:
libmine.a : *.o
&rm $(输出)
$(AR) ru $(输出) $(输入)
具体来说,文件不会被重建,或者可以从存储库或构建中获取
缓存,如果以下命令输出保持不变,即匹配的签名
依赖项:
mppi -k'ARCH SORTED_DEPS DEP_SIGS ENV_{DEP,VAL}S' 文件
目标_较新
“target_newer”方法只查看文件日期。 如果有更多依赖
最近比目标,目标被重建。 这是算法
传统的 Unix 使 实用程序使用。
“target_newer”方法不如“exact_match”方法安全,因为它不会
如果您更改构建命令,或者如果您将文件替换为
旧版本。 有时,如果时钟不正确,它也会感到困惑
同步。 例如,如果某个文件以某种方式获得了 4 年 2048 月 XNUMX 日的日期,则
从现在到 2048 年,依赖于该文件的每个文件都将被重建,即使
文件不会改变。 切换到不同的架构也不会触发
重建。 它防止从构建缓存中获取规则的目标,因为没有
唯一的签名,可以关联到无穷无尽的对满足
关系较新。
但在某些情况下,您可能想要使用“target_newer”方法:
· 当用户构建不受 makepp 控制的文件是合理的时。
也许最常见的例子是生成 makefile 的命令
本身,即自动配置程序。 用户通常发出configure
手动命令,但生成文件通常有一种方法可以自我更新
自动地。 在这种情况下,我们不想强制重建 makefile
如果用户手动输入命令,那么“target_newer”方法是
比“exact_match”方法更合适。 事实上,如果 makepp 试图
构建一个makefile,它使“target_newer”成为默认方法,直到它完成
构建makefile。
· 当 makepp 构建文件后用户修改文件是合理的。 为了
例如,如果一个文件不存在,您可能希望从中央复制它
位置,或从存储库中检出; 但应该允许用户
修改它。 如果您使用默认的“exact_match”构建检查方法,makepp 将
检测到用户更改了文件,因此它将强制从
中央位置或全新结帐,抹去用户的更改。
如果您需要手动检查时间戳,请参阅 makeppinfo 示例以了解如何获取
每个依赖的路径。
唯一动作
非常具体的“only_action”方法只会在命令
字符串与上次执行的时间不同。 例如,
$(ROOT)/include/%.h : %.h
&ln -fr $(输入) $(输出)
发布文件,但在文件更改时不会重复此操作。 注意 &ln
命令是内置的,因此很便宜,但是 makepp 仍然必须分叉并监视
执行整个动作的过程。 所以如果你有很多文件要发布,
还是有好处的。 其实我们并没有指定方法,因为,当目标
是符号链接,此构建检查会自动使用。 你只需要
为仅依赖于该命令的其他命令指定它(通常
包含输入的名称):
%.list : %.x : build_check only_action
&echo $(inputs) -o $(output)
具体来说,文件不会被重建,或者可以从存储库或构建中获取
缓存,如果以下命令输出保持不变,即匹配的签名
依赖项:
mppi -kCOMMAND 文件
其他构建检查方法也是可能的。 您可以通过以下方式编写自己的构建检查方法
创建一个模块“Mpp::BuildCheck::MyMethod”。 阅读文档
Mpp/BuildCheck.pm 在 makepp 发行版中。 最有可能的是,你会想要你的构建检查
从“Mpp::BuildCheck::exact_match”继承的方法,所以也请阅读它的文档。
修改签名机制比修改构建检查更常用
机制直接。 在更改构建检查机制之前,请查看您的问题是否是
通过更改签名更好地服务(有关详细信息,请参阅 makepp_signatures)。
以下是自定义构建检查方法可能有用的一些原因:
· 如果你想让makepp 忽略部分命令。 例如,如果您有命令
在你的 makefile 中是这样的:
xo : xc
ssh $(REMOTE_MACHINE) cc $< -o $@
如果 "$(REMOTE_MACHINE)" 更改,您可能希望 makepp 不强制重建。 你
可以修改“exact_match”方法,使其了解 ssh 命令并忽略
机器名称。 检查 :dispatch 以获取另一种实现方式。
使用 onworks.net 服务在线使用 makepp_build_check