GoGPT Best VPN GoSearch

OnWorks 网站图标

makepp_signatures - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 makepp_signatures

这是命令 makepp_signatures,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


makepp_signatures -- makepp 如何知道文件何时更改

商品描述


C: C,
c_compilation_md5, M: "md5", P: “清楚的”, S: "shared_object", X: "xml",
xml_空间

每个文件都与一个 签名,这是一个字符串,如果文件有
改变了。 Makepp 比较签名以查看它是否需要重建任何东西。 这
文件的默认签名是文件的修改时间和它的
大小,除非您正在执行 C/C++ 编译命令,在这种情况下默认
签名是文件内容的加密校验和,忽略注释和
空白。 如果需要,可以切换到不同的方法,也可以定义自己的方法
签名功能。

签名的实际使用方式由 建立 方法 (见
makepp_build_check)。 通常,如果文件的签名发生变化,则文件本身
认为已经改变,makepp 强制重建。

如果 makepp 正在构建一个文件,而您认为它不应该是,您可能需要检查
构建日志(参见 makepplog)。 Makepp 写下它对每个文件的看法的解释
取决于,以及为什么选择重建。

makepp 中包含了几种签名方法。 Makepp 通常选择最多
自动适当的标准。 但是,您可以更改签名方法
通过在依赖于文件的规则上使用 ":signature" 修饰符的单个规则
您想使用“签名”语句检查或查看 makefile 中的所有规则,或
使用“-m”或“--signature-method”命令行选项一次为所有makefile。

Mpp::签名 方法 包括 in 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 分配
普通(实际上无名)
明文签名方式是文件的修改时间和文件的大小,
串联。 这些值可以从操作系统中快速获取,并且
几乎总是在文件更改时更改。 对于符号链接,它使用
链接者。 如果没有链接者,即它是一个悬空的符号链接,那么它使用自己的
值,但在前面加上 0 来标记事实。

Makepp 过去只看文件的修改时间,但是如果你运行 makepp
一秒内多次(例如,在一个脚本中构建了几个小的
事情),有时修改时间不会改变。 然后,希望文件的大小
将改变。

如果您可能每秒多次运行 makepp 的情况对您来说是个问题,您
可能会发现使用“md5”方法更可靠一些。 如果 makepp 构建一个
文件,即使文件的日期没有改变,它也会刷新其缓存的 MD5 签名。

为了效率起见,makepp 不会重新读取文件并重新计算复杂的
如果这个简单的签名自上次以来没有改变,则在下面的签名
计算它。 这在理论上可能会导致问题,因为可以更改
文件的内容而不更改其日期和大小。 在实践中,这是相当
很难做到这一点,这不是一个严重的危险。 将来,随着更多文件系统切换到
不到一秒的时间戳,希望 Perl 能让我们访问这些信息,
这个故障保险。

C
c_compilation_md5
这是将文件输入到 C 类编译器的方法。 它检查文件名
看起来像 C 或 C++ 源代码,包括 Corba IDL 之类的东西。 如果是这样,这
方法适用。 如果不是,它会回退到二进制文件的普通签名
(由名称或内容决定),否则为“md5”。

这个想法是独立于格式更改的。 这是通过拉
一切都尽可能,并通过消除无关紧要的空间。 话是
免于拉起,因为它们可能是包含“__LINE__”的宏,所以它们
留在原地。

// 忽略注释

#ifdef XYZ
#包括
#ENDIF

整数= 1;

#第 20 行
空f
(
内部
)
{
a += b + ++c;
}

/* 更多被忽略的注释 */

被当作

#ifdef XYZ
#包括
#ENDIF

诠释一个= 1;
#第 20 行
无效 f(

国际 b){

a+=b+++c;}

这样您就可以重新缩进您的代码或添加或更改注释而不会触发
重建,只要你不改变行号。 (这种签名方式
如果行号已更改,则重新编译,因为这会导致调用“__LINE__”和
大多数调试信息要更改。)它还忽略空格和注释 after
最后一个令牌。 如果您的 VC 添加了行,这对于防止无用的重建很有用
签入时在“$”“Log$”标签处。

此方法对于以下情况特别有用:

· 你想对一个共同包含的头文件中的注释进行更改,或者
你想重新格式化或重新缩进它的一部分。 对于我参与的一个项目
很久以前,我们非常不愿意在一个共同的问题中纠正不准确的评论
头文件,即使它们具有严重的误导性,因为这样做会
触发几个小时的重建。 有了这个签名方法,这不再是
一个问题。

· 你喜欢经常保存你的文件,你的编辑器(不像 emacs)会很乐意
即使什么都没有改变,也要写一个新的副本。

· 你有其他构建自动生成的 C/C++ 源文件
命令(例如,yacc 或其他一些预处理器)。 对于我使用的一个系统,我们
有一个预处理器(如 yacc)产生两个输出文件,一个“.cxx”和一个
“.h”文件:

%.h %.cxx: %.qtdlg $(HLIB)/Qt/qt_dialog_generator
$(HLIB)/Qt/qt_dialog_generator $(输入)

每次输入文件改变时,结果 .h 文件也被重写,并且
通常这会触发包含它的所有内容的重建。 然而,
大多数时候的内容 .h 文件实际上并没有改变(除了
关于预处理器编写的构建时间的评论),因此重新编译
实际上没有必要。

实际上,这在实践中节省的重新编译比您希望的要少,因为仅仅
注释更改通常会添加行。 为了使用“__LINE__”或调试器进行日志记录
要匹配您的源,这需要重新编译。 所以这个签名是特别的
对于来自文学编程的“缠结”工具系列没用,你的代码
驻留在一些更大的文件中,甚至对文档部分的更改与
代码将通过“#line”指令反映在提取的源代码中。

如果您可以在开发过程中忍受错误的行号,则可以设置变量
“makepp_signature_C_flat”(带有大写 C)到某个真实值(如 1)。 然后,
而编译器仍然看到真实的文件,上面的例子将被展平
签署为:

#ifdef XYZ
#包括
#ENDIF
int a=1;void f(int b){a+=b+++c;}

请注意,签名仅在文件更改时重新计算。 所以你可以为
仓库中的每个人都没有这个选项,想要这个选项的人可以设置它
在他们的沙箱中构建时。 当他们第一次在本地更改文件时,即使只有
琐碎地,这将导致重新编译,因为使用此选项完全
计算不同的签名。 但是他们可以重新格式化文件
他们希望无需进一步重新编译。

反之亦然:只需在设置并重新编译后省略此选项
不会修复您的行号。 因此,如果行号很重要,请不要进行生产
在同一个沙箱中构建,无需先清理。

md5 这是默认方法,用于“C”方法无法识别的文件。 计算一个
文件内容的 MD5 校验和,而不是查看文件的日期或大小。
这意味着如果您更改文件上的日期但不更改其内容,
makepp 不会尝试重建任何依赖于它的东西。

如果您有一些经常在此期间重新生成的文件,这将特别有用
其他文件所依赖的构建过程,但通常实际上并不
改变。 如果使用“md5”签名检查方法,makepp 会意识到
即使文件的日期改变了,文件的内容也没有改变。 (当然,这
如果文件中写有时间戳,则无济于事,就像存档文件一样
例如。)

共享对象
此方法仅在您的路径中有实用程序“nm”时才有效,并且它接受
“-P”选项输出 Posix 格式。 在那种情况下,只有符号的名称和类型
在动态加载的库中成为其签名的一部分。 结果是
您可以更改函数的编码,而无需重新链接使用
他们。

在以下命令中,解析器将检测对
$(LIBDIR)/libmylib.so,并在必要时构建它。 但是链接命令只会
每当库导出一组不同的符号时都会重新执行:

myprog: $(OBJECTS) :signature 共享对象
$(LD) -L$(LIBDIR) -lmylib $(输入) -o $(输出)

只要函数的接口不改变,这就会起作用。 但在那种情况下你会
更改声明,因此您还需要更改调用者。

请注意,此方法仅适用于名称看起来像共享库的文件。
对于所有其他文件,它会回退到“c_compilation_md5”,而后者又可能会回退
给他人。

XML
xml_空间
这是两种类似的方法,它们规范地处理 xml,不同之处仅在于它们的
空格的处理。 第一个完全忽略它周围的标签并考虑它
就像其他地方的单个空格一样,使签名不受格式更改的影响。 这
第二个尊重 xml 中的任何空格,即使只是一个小空格也是必要的
部分要求,例如“ " xhtml 文档中的部分。

这两种方法的共同点是它们签署了每个 xml 文档的本质。 在场
或不是 BOM 或“ " 标题被忽略。注释被忽略,就像
文本被保护为“CDATA”或实体。 属性的顺序和引用方式
无关紧要,您如何呈现空标签也无关紧要。

对于任何无效的 xml 文件,或者如果基于 Expat 的“XML::Parser”或
未安装“XML::LibXML”解析器,这回退到方法 md5。 如果你切换
你的 Perl 安装从一个解析器到另一个解析器,makepp 会认为
时间戳改变后,文件就会不同。 这是因为结果
任何一个解析器在逻辑上都是等价的,但它们产生不同的签名。 在里面
这是一个不太可能的情况,您可以强制仅使用“XML::LibXML”
Perl 中的设置:

$Mpp::签名::xml::libxml = 1;

扩展 适用性
"C" 或 "c_compilation_md5" 方法有一个内置的后缀列表,它识别为
是 C 或 C 样的。 如果它被应用于其他文件,它会回退到更简单的签名
方法。 但是许多文件类型在语法上与 C++ 足够接近,因此这种方法可以
有用。 足够接近意味着 C++ 注释和字符串语法和空格是没有意义的
除了单词之间的一个空格(以及 C++ 的问题案例“- -”、“++”、“/*”和“< <”)。

它(及其子类)现在可以轻松扩展到其他后缀。 任何地方都可以
指定一个签名,您现在可以使用这些语法之一来制作方法
接受额外的文件名:

C.后缀 1、后缀 2、后缀 3
一个或多个逗号分隔的后缀可以通过冒号添加到方法中。 为了
示例 "C.ipp,tpp" 意味着除了内置后缀它也适用于
结尾的文件 .ipp or .tpp,您可能将其用于内联和模板
C++ 头文件的一部分。

C。(后缀正则表达式)
这和之前的一样,但不是枚举后缀,而是给一个 Perl
正则表达式来匹配你想要的。 前面的例子是
此语法中的“C.(ipp|tpp)”或“C.([it]pp)”。

C(正则表达式)
如果没有点,Perl 正则表达式可以匹配文件名中的任何位置。 如果它
包含斜杠,将针对完全限定的文件名进行尝试,否则
只针对最后一部分,没有任何目录。 所以如果你有 C++ 风格
目录中的无后缀标题 包括, 使用 "C(include/)" 作为你的签名方法。
然而,上面的后缀示例会很讨厌这样,“C(\.(?:ipp|tpp)$$)”
或 "C(\.[it]pp$$)" 因为 "$" 是 makefile 中的扩展字符。

缺点
签名方法适用于规则的所有文件。 现在,如果您有一个采用 C 的编译器
像源代码和 XML 配置文件一样,您需要一个组合签名
巧妙地处理两种文件类型的方法,或者您必须选择一个现有的方法
将不知道其他文件中的更改是否重要。

以后签名方式配置可能会改成filename-pattern,
可选每个命令。

定制 方法
如果需要,您可以定义自己的方法来计算文件签名和
比较它们。 您将需要编写一个 Perl 模块来执行此操作。 看看
分发中的“Mpp/Signature.pm”以及现有签名中的注释
有关详细信息,请参见“Mpp/Signature/*.pm”中的算法。

以下是您可能需要自定义签名方法的一些情况:

· 当您希望忽略文件中的所有更改时。 说你总是想要 日期戳
成为依赖项(强制重建),但您不想重建
日期戳 已经改变。 您可以定义一个继承自的签名方法
“c_compilation_md5”识别 日期戳 文件名,并且总是
为该文件返回一个常量值。

· 当您想忽略文件的一部分时。 假设你有一个程序
生成一个带有日期戳的文件,但如果只是你不想重新编译
日期戳已更改。 只需定义一个类似于
“c_compilation_md5”可以理解你的文件格式并跳过你不知道的部分
想考虑。

使用 onworks.net 服务在线使用 makepp_signatures


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad




×
广告
❤️在这里购物、预订或购买——免费,有助于保持服务免费。