这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令形状,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
形状 - 从源对象的版本中识别和构建程序配置
概要
塑造
[ -f <描述 档案> ]
[ -R <version 选择 规则> [ -V <variant 姓名> ]
[ -回声 <macro 姓名> [ -力 [ -重建 ]
[ - 德希克普斯 ]
[ -bct [ -救命 [ -nomsg [ -novclass [ -版 [ -xpoff [ -xpon ]
[ target1 target2 ... [ 宏=值 ... [ 宏+=值 ... ]
商品描述
Shape 允许透明地编译作为常规文件的源对象,或者
源对象 版本 在 ShapeTools 版本对象库中。 更一般地,形状
产生一组 衍生 对象 (``targets'') from appropriately selected versions of
对应的源对象之间的依赖关系的描述
对象。 Shape 会跟踪编译的相关参数(源版本、
编译器版本、编译器开关等),从而提供安全高效的构建
机械。
当 shape 编译源对象时,它会将生成的派生对象与
其有效编译参数 衍生 对象 缓存. 推导前
请求对象的进程实际上已启动,shape 尝试查找现有对象
派生对象缓存中与目标要求相匹配的派生对象。
从不可变版本派生的对象的缓存和恢复允许
开发人员从其他团队成员之前的构建中获利。 总编译成本在
项目大幅减少。
在处理构建请求时,shape 会考虑可能的大量版本
为对象存储。 哪个特定版本是 界 到对象的名称
描述文件,由 版本 选择 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。.
Shape 可以并行管理系统不同变体的构建。 形状使用
动态版本选择、动态宏重新定义和派生的组合潜力
对象管理来处理变体构建。 由于大多数(如果不是全部)对象和
构建中涉及的参数定义为 宏, 形状提供了大量
通过允许动态更改部分或全部宏来实现灵活性,具体取决于
应构建变体。 的概念 变种 定义 在形状的描述文件中
为与某个变体相关的所有定义提供明确的焦点。
配置
-f <描述 档案>
塑造 使用提供的参数作为描述文件的名称,用于
建造。 如果不 -f 选项被指定,shape 尝试在下面找到一个描述文件
名称“Shapefile”、“shapefile”、“Makefile”和“makefile”之一(来自
左到右)。 如果找不到具有这些名称之一的常规文件,但是
各个文件的版本在版本对象库中可用,形状将
使用最新版本。 当不止一个 -f <描述 档案> 论点
pair 出现,shape 依次读取每个描述文件。 如果名称
描述文件被指定为“-”,shape将从中读取系统描述
标准输入。 可以在绑定版本中指定描述文件
符号,例如 形状文件[2.8] or 形状文件[Release4] (见 绑定(1) 了解详细信息
关于绑定版本符号)。
-R <selection 排除 姓名>
激活指定的选择规则作为源的初始版本绑定
对象。 如果 -R 选项存在,并且选择规则被定义为第一个
第一个目标的依赖关系,形状将使用通过
命令行,并忽略第一个(也是第一个)选择规则激活
在描述文件中。 该选项可用于覆盖初始默认值
从命令行在描述文件中指定的选择规则。
-V <variant 姓名>
激活由指定的变体 <variant 姓名>. 可以有几个变体
通过指定从命令行同时激活 -V 选项多
次。 所有变体特定定义将在形状读取后立即生效
描述文件中的相应变体定义。
-力
强制 shape 无条件地构建指定的目标,即即使
合适的,先前构建的对象存在。
-回声 <macro 姓名>
宏的价值 <macro 姓名> 写入标准输出。 这个选项是
有助于从系统描述文件中提取信息(例如 shape -echo
SOURCES,或 shape -echo SUBSYSTEMS),或控制变体的效果
激活。
-重建
尝试精确重建 目标 根据一个 界 配置 绪,
在名为的文件中提供 .bct (见说明 -bct 转变)。
-d 在调试模式下运行形状。 打印出有关对象依赖项的详细信息
和属性。
-D 打印版本绑定过程的详细信息,以及形状的推理
关于(重新)构建目标,或从派生对象缓存中检索。 这个
switch 有助于找出确切原因,为什么形状重新派生目标
(或不)。
-e 从环境中导入的宏定义(参见
特殊宏 进口,下面)覆盖描述文件中的宏定义(通过
默认情况下,描述文件中的宏定义优先于导入
来自环境)。
-h 在标准输出上打印使用信息(这是 -救命
开关,见下文)。
-i 忽略命令返回的错误代码。
-k 当调用的命令返回非零错误状态时,
当前目标被放弃,但形状继续与其他没有的分支
取决于失败的目标。
-n 没有执行模式。 Shape 打印出命令,但不执行它们。 甚至
打印以@ 开头的命令行。 如果命令包含 $(MAKE) 宏
但是,始终执行该行以允许跟踪
递归构建过程。
-p 打印出完整的宏定义、目标描述和规则集
分别定义。
-r 不要使用 shape 的内置隐式规则。 中定义的隐式规则
描述文件仍然有效。
-s 以静默模式运行。 在执行命令之前,Shape 不会打印出这些命令。
-bct 将构建记录在一个 界 配置 绪 文件。 一个形状配置线程
包含所有源版本的精确定义、它们的依赖关系、
涉及的工具以及对构建有效的相关选项。 这
生成的顶级目标的配置线程(第一个目标
描述文件,或从命令行请求的目标)存储在一个文件中
命名 .bct. 绑定的配置线程可以用作重建的输入
(见选项 -重建, 以上)。 如果 bct-build 的源版本上下文是
不安全,shape 将在 bct 中记录该事实,并发出警告消息。
-救命 在标准输出上打印使用信息。
-nomsg 关闭跟踪工具 味精 在版本选择规则中。
-novclass
禁用检查已激活变体的不兼容性。
-版
打印形状程序的版本标识。
-xpoff 关闭从对象库检索的源版本中的属性扩展。 经过
默认情况下,为所有直接连接的源对象打开属性扩展
从对象库中检索,并为常规源对象关闭
文件(见 回车(1) 有关属性扩展的详细信息)。
-xpon 为所有源对象打开属性扩展,即使在常规文件中也是如此。 经过
默认情况下,对于常规源对象关闭属性扩展
文件,并为直接从文件中检索的所有源对象打开
对象基础。
目标 ...
目标名称列表可以通过命令行传递给 shape。 如果没有目标
在命令行上给出,并且特殊目标 .DEFAULT 未在其中定义
描述文件中,shape 尝试生成定义的第一个目标
描述文件。
<macro 定义>
可以从命令定义或修改描述文件中的宏
线。 以这种方式定义的宏优先于所有其他定义。
命令行宏定义有两种形式之一:
NAME = VALUE
和
名称+=值
- 您的姓名 作为一个词和 VALUE 任意字符串。 如果 VALUE 包含空格,使
一定要引用它。 命令行宏定义集的第一种形式 您的姓名 以及
代换 VALUE。 如果 VALUE 为空,宏被重置。 第二种形式追加 VALUE
前导空格字符 当前 代换 of 您的姓名。 目前
替换可以在描述文件中定义,也可以通过之前的设置来定义
命令行。 有关宏定义和替换的语义的详细信息,请参阅
以下各节。
商品描述 FILES
shape 的操作由系统描述文件(通常是一个 生成文件)
提供有关要管理的系统的结构信息。 以外 使(1),
形状在上面起作用 在FS (At致敬 F小号 System),版本化对象的存储库,
而不是普通文件。 因此,真正的形状描述文件(通常称为 形状文件)
除标准 Makefile 之外的功能版本选择规则和变体定义
依赖规则。 形状的描述文件是向上兼容的扩展 使(1) 的
描述文件,Makefile。 一个有用的形状描述结构约定
files 是并行维护一个 Makefile 和一个 Shapefile。 只有真正的形状
结构(例如版本选择规则或变体定义)保存在
形状文件,而大部分目标规则和宏定义都保存在 生成文件。 该
Makefile 应为 包括 in 形状文件 (见说明 包括 指令,见下文)。
这种结构化约定的优势在于,使用
ShapeTools 系统的支持可以作为源分发发送到不支持的站点
使用形状工具。
虽然 shape 很大程度上向下兼容原始 make 程序,但它应该是
注意到原始 make 程序的几个流行扩展,例如 GNU Make 或
Sun Make,提供功能 而不去 以形状存在。 参见已知部分
下面的不兼容。
描述文件为各种产品提供了理想的中央信息库
相关定义。 Shape 鼓励开发一组(项目或
组织特定的)系统描述的约定,并提供了一种简单的方法来
提取此信息以供其他工具使用(请参阅 -回声 选项,如上)。 说明
文件语法不仅用于指定与构建相关的组件依赖项
流程,但允许对面向产品的任务进行一般的、分层的定义。 这
递归依赖的概念直接映射到任务的逐步细化
定义。 此类任务可以根据需要完全、部分或根本不自动化。
因此,某些活动可能是自动化和标准化的,而其他活动则是
只是非正式地描述以记录它们或对它们进行推理(参见
形状有效值(1) 举些例子)。
句法 结构
形状描述文件的基本句法结构由以下部分组成:
留言
注释以“#”字符开始并延伸到行尾。 在
Shapefiles,行尾定义为未转义的换行符(``\''),
或文件的结尾。 注释字符不能转义,但可以引用
在单引号或双引号中。 目标规则命令行中的注释字符
被形状忽略。
指令
指令是特殊的关键字,已知的形状。 指令从 a 的第 0 列开始
线并延伸到线端。 目前,形状识别的唯一指令
is
包括 <列表 of 文件 姓名>
宏 定义
宏定义具有一般形式:
您的姓名 <macro 定义 符号> VALUE
您的姓名 必须是由一系列名称字符组成的单个单词。 名称字符
除以下字符外,都是可打印的字符:
$#:=; \t\n
宏定义符号为“=”、“+=”或“:=”。 VALUE 是任意的
以行尾或注释结尾的字符串。 宏定义通常以
一行的第一列,但可以在前面 人物。 宏
定义不得包含前导 字符(见章节 宏 定义,
下面,了解更多详情)。
宏 案例
宏引用具有以下形式之一:
$(<macro 姓名>)
${<macro 姓名>}
$<single 字符 姓名>
宏替换操作符(``$'')不能被转义,但可以用
替换“$$”。 宏替换发生在描述文件的任何地方,除了
注释、宏名称、版本选择规则和变体定义的左侧
标头(见下一节)和变体类定义(见关于 宏
替换,下面,了解更多详情)。
规则 规则由一个 排除 头, 和一个可选的 排除 身体. 规则头
由一个 左 手 侧,以 排除 定义 符号, 和一个可选的 右 手
侧. 左侧通常从一行的第 0 列开始,并且可以放在前面
通过领导 人物。 规则标题的左侧不得包含
领导 人物。 规则标题的可选右侧扩展到
行的结尾,或规则体的开头。 规则体包括
以 a 开头的连续行 特点。 规则的主体是
由不以 a 开头的下一行终止 字符,或结束
文件中。
Shape 识别三种不同类型的规则,通过它们各自的区别
规则定义符号:
·
目标 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。. 目标规则有一个单冒号字符 (``:'') 作为规则
定义符号。 目标规则标题的左侧是一个空格-
分隔的名称列表。 可选的右手边包含一个空格-
分开的名称列表,后跟可选的生产成分列表
(请参见 目标 规则,如下)。
·
版本 选择 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。. 版本选择规则有规则定义符号
``:-''。 版本选择规则的规则头在其左侧有一个单词
右手边,没有右手边(见 版本 选择 规则,
下文)。
·
变种 定义. 尽管变体定义是——顾名思义——
定义, 不是规则(从语义的角度来看),它们的句法
代表是规则的代表。 变体定义具有规则定义
符号``:+''。 变体定义的规则标题上有一个词
左侧,没有右侧(见 变种 定义,
下文)。
变种 增益级 定义
变体类定义具有以下形式
类 ::=(变体1, 变体2, ...)
(请参见 变种,如下)。
LINE 延续
如果输入行的结尾被反斜杠 (``\'') 转义,则下一行是
视为延续线。 反斜杠换行符序列是
由一个空格代替。
宏 定义
宏定义将名称与将被替换的字符串相关联
的宏被引用(见下一节)。 宏对于编写可维护的、
和一些通用的描述文件。 即使是中等规模的项目也会找到它
为某些宏的命名和使用定义约定是非常有益的
贯穿整个产品描述文件。
存在三种不同类型的宏定义:
简易 宏 定义
一个简单的宏定义看起来像
您的姓名 = <任意 字符串>
与宏名称关联的字符串可以包含宏引用。 如果一个宏
在一个描述文件中多次定义,最后一个定义将是
有效的。 在命令行上定义的宏优先于相同的定义
描述文件中的宏。
添加剂 宏 定义
这种类型的宏定义看起来像
您的姓名 += <任意 字符串>
定义右侧的字符串附加到任何现有值
与 您的姓名, 以空格字符分隔。 多个附加宏定义
按照它们在描述文件中出现的顺序连接。 如果是添加剂
宏定义发生在命令行上,最后一个字符串值定义在
描述文件被附加到命令行上定义的字符串值。 添加剂
描述文件中的宏定义附加到定义在
命令行。
评价性 宏 定义
评估宏按以下方式定义:
您的姓名 := <任意 字符串>
首先,字符串值关联到 您的姓名 和简单的宏一样
定义。 什么时候 您的姓名 第一次被替换,右侧
定义被评估,并且这个评估的结果替换原始字符串
相关联的价值 您的姓名. 因此,右侧的评估恰好发生一次。
如果定义字符串是命令替换,这特别有用(请参阅下一个
部分)。
宏 替换
宏替换是替换一个 宏 参考 通过字符串值
与宏名称相关联。 对未定义宏的引用被替换为空
细绳。 宏引用具有以下两种形式之一:
$(您的姓名)
${您的姓名}
$<任意 单 字符>
以下是有效的宏引用:
$(CFLAGS)
$7
${源文件}
$(X)
$X
最后两个引用具有相同的替换。 宏参考
$$
将替换单个美元符号。
在替换宏引用之前,将评估关联的字符串。
字符串值的评估包括
-
替换字符串值中的所有宏引用
-
命令替换。 用反引号 (```'') 括起来的字符串值的任何子字符串
将作为命令传递给 shell,并被命令的标准替换
输出。
-
字符串替换。 如果宏引用具有以下形式
$(您的姓名:=)
参考将被评估值取代 您的姓名, 所有出现的
字符串 替换为字符串 . 这对于维护特别有用
相关列表,例如 资源 和 对象 例如,自动:
CSOURCES := `echo *.c`
对象 := $(CSOURCES:.c=.o)
Shape 尽可能晚地替换宏引用。 宏引用发生在
宏定义仅在定义的宏本身被替换时才被替换。 宏
当规则为
评估。 目标规则目标端的宏引用被立即替换
在 shape 读取描述文件之后,即在任何生产开始之前。 宏
当指令执行时,包含指令中的引用被替换,而
shape 读取描述文件。
内建的 和 Special 目的 宏
为了提供形状的内置隐式规则的参数化,一些
预定义的宏是按约定提供的。 这些宏具有有意义的初始值
可以由用户更改。 还有几个宏有特殊意义
为形状。
宏 目的 初始 折扣值 备注
@当前全名 特别
目标
? 目标依赖列表 特别
< 第一个目标的名称 特别
依赖
* 目标共享的前缀 特别
和依赖文件名
# 当前绑定的版本号 特别
依赖
$ 字符``$'' $
+ 绑定对象名称 特别
到一个版本(选择规则
只要!)
AS 程序,用于按常规进行组装
ASFLAGS 汇编器标志 常规
用于编译 C ccconventional 的 CC 程序
程式
C 编译器的 CFLAGS 标志 常规
用于编译 Fortran f77conventional 的 FC 程序
程式
Fortran 编译器的 FFLAGS 标志 常规
HOSTTYPE 的主机架构 特别
运行形状的计算机。
这个宏的值是
由形状用于构造
派生键属性
对于派生对象
IMPORT 环境变量列表 特别
应作为进口
宏定义
LD 程序链接程序 ldconventional
链接器的 LDFLAGS 标志 常规
LEX 程序将 Lex 语法转换为 lexconventional
进入 C 或 Ratfor 程序
LFLAGS 词法分析器的标志 常规
法
LOGNAME 下的名称或网络 ID 特别
拥有该用户的用户
形状进程已登录
编译Modula2 m2cconventional的M2C程序
程式
Modula2 编译器的 M2FLAGS 标志 常规
MAKE 与 $(MAKEFLAGS) 特殊形状的命令行
形状已被调用。
这个宏用于
递归调用形状
MAKEFLAGS 命令行标志相关 <defined ,特别
用于对 shape 的递归调用 命令 线>
用于编译 Pascal pcconventional 的 PC 程序
程式
Pascal 编译器的 PFLAGS 标志 常规
Fortran 编译器的 RFLAGS 标志 常规
用于 Ratfor 程序
SHAPEPID 进程ID 特别
跑形程序
SHAPEVERSION shape_CM-4.4special 的版本号
形状程序(或以上)
SHELL /bin/shspecial 的命令处理器
目标规则命令
线。 引用的命令
处理器必须能够
接受它的命令
标准输入(见章节
on 命令 执行,
下面)
VPATH 搜索路径扩展 特别
本地化源组件
YACC 将 Yacc 语法转换为 yaccconventional 的程序
进入 C 程序
YFLAGS yacc 的标志 常规
vpath 动态搜索路径扩展 特别
对于源组件的变体
专用宏的功能 主机类型, 进口, MAKE, 路径和 路径 旨在
在下面关于操作和变体的部分中进行了描述。
目标 规则
目标规则定义了目标如何以及在什么条件下从一组
源对象和/或其他目标。 目标是可以引用文件但需要的名称
不要这样做。 目标规则具有以下格式:
... : [ 绑定>] [+ ...] [ ...] \
[: ...] [; ]
\t[ ]
...
目标规则的标题(请参阅 句法 结构, 上面) 包含一个列表
目标, 以冒号结尾,后跟可选列表 依赖和一个
可选列表 最佳的 成分, 从第二个冒号字符开始。 这
规则头以换行符或分号结束,后跟可选规则
身体。 规则体包括 命令 生产线 在需要目标时执行
重新派生。 第一个命令行可以紧跟在终止的分号之后
规则头。 后续的命令行必须以 特点。 目标
规则主体由不以 a 开头的第一行终止 ,或者到最后
文件。
目标
当规则标题的左侧出现多个目标时,推导
过程需要启动,shape 将在一次运行中导出所有目标。
依赖
Shape 从左到右检查目标的依赖关系。 检查第一个依赖项
是否是版本选择规则的名称。 如果是,则形状设置选择
规则激活(覆盖所有先前的选择规则激活),并继续下一个
依赖性。 接下来,shape 检查依赖项是否为变体激活。 如果
依赖以“+”字符开头,后跟变体的名称,变体是
已激活(请参阅有关 变种, 以下)。 形状继续检查变体
激活,直到找到第一个不是变体激活的依赖项。 下一个,
形状通过剩余的依赖项列表进行,并且 结合 (或 衍生品) 每一个
根据需要,对依赖图执行深度优先遍历(参见
进行了 项目运营,如下)。
生产 成分
在绑定了所有依赖项之后,shape 构造了 求导 键 等加工。为
目标。 派生键是定义完整参数集的属性
决定是否需要重建目标。 除了所有绑定依赖项,
派生密钥包含 最佳的 成分 在目标规则中指定的
标题。 生产成分通常是宏的完整定义,这些宏是
在规则正文的命令行中引用。 因此,工具版本和开关
影响工具操作的部分可以作为推导参数的一部分
目标。 为了将宏定义包含到目标的派生键中,
特别参考
+(姓名1) +(姓名2) ...
必须代替生产原料。
命令 线
当 shape 断定需要(重新)派生目标时,目标中的命令
规则体被执行。 规则体由连续的行组成,这些行被视为
单独的命令。 每个命令行都按照以下部分中的描述进行评估 宏
换人,上面,并传递给宏定义的命令解释器 SHELL.
每个命令行都作为一个单独的进程执行。 如果需要复杂的命令
不适合在一行中,或者如果重复进程调用的开销应该是
避免,可以通过使用反斜杠转义换行符来扩展逻辑命令行
特点 (\),并在下一个物理行上继续。
命令行前面可能有一个或两个特殊字符:
- 形状忽略由第一个命令行返回的任何非零错误代码
字符是减号。 减号不会传递给shell。 当一个
命令返回非零返回状态,形状通常考虑推导
目标的进程为失败并终止,除非 -i or -k 开关,或
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 。忽略 特殊目标生效。
@如果命令的第一个字符是“@”,则形状不打印命令
在执行之前。 ``@'' 不会传递给 shell。
@- 如果前两个非 字符为“@-”,形状忽略非零返回
代码,并禁止打印命令行。
如果在中调用形状 没有 执行 模式 (-n),评估的命令行打印在
标准输出,显示什么形状 将 如果没有调用则执行 -n. 命令行
包含宏引用 $(制作) 总是被执行,即使 -n 设置。 这个做完了
允许模拟可能跨越子目录的递归构建。 参考资料
$(制作) 由具有所有相关命令行的形状命令调用代替
开关设置。
在规则体的命令行中,目标规则头的某些部分可以是
动态引用。 当评估命令行时,以下替换是
可能
参考法案 换人
$@ 当前目标的全名
$? 依赖列表
$< 第一个依赖的名称
$* 前缀由当前文件名和相关文件名共享
$# 当前依赖的绑定版本ID
(仅限隐式规则)
隐含的 规则
Shape 的目标规则有两种不同的风格:显式和隐式。 隐含规则
可以看作是定义了适用于大多数目标的依赖模式的模板
给定的种类。 出于这个原因,隐式规则有时被称为 模式 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。. 形状
将 make 的旧式隐式规则(例如 .co:)转换为模式规则,同时读取
描述文件。 一个典型的依赖模式是,例如,文件的依赖
包含可链接的目标代码,例如 模块.o 到包含源的相应文件
代码,例如 模块.c. 大多数这些源/派生对的派生过程是
完全相同的。 而不是为一个的所有源/派生依赖项编写单独的规则
系统,可以编写一个单一的通用规则,称为隐式规则。 隐含的
规则格式如下:
%[. ] %[. ] ... : %[. ] %[. ]... \
[: ...] [; ]
\t[ ]
\t[ ]
...
虽然隐式规则的结构与上述相同,但目标的名称
和依赖项分别被目标模式和依赖项模板替换。
目标模式中的百分比字符充当通配符,与所有
目标的名称直到可选的尾随后缀。 对于形状,对象名称 后缀 is
名称中最后一个句点字符 (``.'') 括起来的字符序列,
和 终止名称的字符。 下面的例子说明了形状的
后缀的概念:
姓名 后缀
样本.cde CDE
样本.xycc
样本_c
.sample.c c
以下是一个隐式规则的示例,该规则从以下位置派生可链接目标代码
对应的C源文件:
%.o : %.c : +(CC) +(CFLAGS)
\t@echo 形状 - 执行:$(CC) -c $(CFLAGS) $#;
\t@$(抄送) $(CFLAGS) -E %.c |
sed 's;^\(# [0-9][0-9]* \"\)%.c\(\".*\)$$;e1$#\2;' > %.i;
\t@$(CC) -c $(CFLAGS) %.i;
\t@rm %.i;
注意:此规则是 shape 用于编译 C 源文件的内置隐式规则。 神秘的
命令序列的目的是将完整的文件版本 id 编码到对象中
代码(例如 sample.c[3.4] 而不是 sample.c)。 这对结合非常有用
与 -g 大多数 C 编译器和版本敏感调试器的切换,例如
数据库.
如果目标是使用隐式规则派生的,则目标的名称将与
隐式规则的目标模式。 如果规则匹配,则匹配部分
目标名称( 干, 由 ``%'' 引用) 始终替换所有其他
在整个规则中出现的通配符。 完成此操作后,隐式
规则被视为明确的目标规则。
明确的 规则
显式规则将显式目标名称与显式依赖项相关联。 显式规则
最常用于指定隐式规则无法覆盖的依赖项,
例如通过链接许多目标代码模块来导出可执行程序。 在许多
在这种情况下,显式规则仅用于指定那些不属于
由隐式规则暗示(例如包含目标文件的依赖项),而
假定存在“自然”依赖性。 如果一个描述文件只包含
这种显式依赖,省略的隐式依赖(和一个适用的
规则体)按形状自动添加到目标依赖项的总列表中。
内建的 隐含的 规则
Shape 提供了许多预定义的隐式目标规则,涵盖了许多常见的
源/目标派生。 下表列出了目标模式和依赖项
形状的内置隐式规则的模板。
目标 依赖 求导
%.a %.c 从 C 源代码编译归档库
%.c %.l 从 Lex 语法生成 C 程序
%.c %.y 从 Yacc 语法生成 C 程序
%.o %.l 从 Lex 语法编译目标代码
%.o %.y 从 Yacc 语法编译目标代码
%.o %.s 将汇编程序翻译成目标代码
%.o %.r 编译 Ratfor 源代码
%.o %.F 编译 Fortran 源代码
%.o %.f 编译 Fortran 源代码
%.sym %.def 编译 Modula 定义模块
%.o %.mod 编译 Modula 实现模块
%.o %.p 编译 Pascal 源码
%.o %.c 编译 C 源代码
% %.sh 从 shell-script 生成可执行程序
% %.r 从 Ratfor 源代码构建可执行程序
% %.F 从 Fortran 源代码构建可执行程序
% %.f 从 Fortran 源代码构建可执行程序
% %.p 从 Pascal 源代码构建可执行程序
% %.mod 从 Modula 源构建可执行程序
% %.c 从 C 源代码构建可执行程序
要获得 shape 的内置隐式规则的完整定义,请运行 shape -p。
Special 目的 目标
形状操作的几个方面由特殊目的目标控制,这些目标可以
放入描述文件。 按照惯例,特殊目的目标以句号开头
字符,并且没有关联的命令。
目标 目的
.DEFAULT:规则体中的命令 。默认 对所有人执行目标规则
不能通过显式或隐式目标规则导出的目标。 如果不
命令完全应根据规则执行,但 。默认 其他需要
目标,该规则可以被赋予一个空命令(或者一个 ``;'' 在
规则标题,或以开头的空行 )。 如果 。默认 具有
依赖项,并且没有从命令行请求目标,这些
依赖项被视为从命令请求的目标
线。
.IGNORE:导致形状忽略调用命令的非零返回代码。 相等的
以及 -i 开关
.SILENT:静默命令执行。 执行前不打印命令行。
相当于 -s 开关
.BPOOL:只有与此目标关联的依赖项存储在派生的
对象缓存
.NOBPOOL:与此目标关联的依赖项是 而不去 存储在派生对象中
缓存。
如果两者兼而有之, .BPOOL和 .NOBPOOL 被定义,只有两个依赖的差异集
列表将存储在派生对象缓存中。
版本 选择 规则
当 shape 构建目标时,它使用 版本 选择 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。 将唯一版本绑定到
先决条件源对象的每个名称。 版本选择规则由名称、
和一组相关的 谓词 名单 在规则体中。 版本选择格式
规则是:
[( , ,...)] :-
\t[ ,] (...), (...);
\t[ ,] (...), (...);
...
\t。
版本选择规则的主体由一系列 替代品,以
分号。 每个替代项都是一个可选模式,后跟一个逗号分隔的
列表 谓词. 选择规则以句点字符结束。 分号——
版本选择规则中的备选方案的分离序列构成了一个逻辑 OR
表达。 替代项中以逗号分隔的谓词列表构成了一个逻辑
AND 表达。
版本 捆绑
版本绑定是确定给定源对象的一个版本的过程
来自所有可用版本的集合。 据说版本绑定 走向成功 如果其中之一
规则替代成功。 替代方案成功,如果它导致识别
正好一个版本。 据说 失败 除此以外。 当形状将版本绑定到名称时
的源对象,它尝试使用匹配模式的每个备选方案,直到名称为
明确绑定到一个版本。 如果模式被省略,将尝试替代方案
无条件。
版本选择规则的功能是形状最重要但也是最重要的功能之一。
微妙的方面。 为了提供直观理解的基础
选择规则机制,举例说明。 规则 最近的,下面,绑定:
- 由形状调用用户检出以进行修改的文件
- 最近修改的文件版本(→ 状态 保存) 由同一用户
- 最近提出的版本(→ 状态 建议) 其他用户修改的文件,
- 或上一版本的文件版本。
LASTRELEASE := `lastrelease`# "lastrelease" 返回名称
# 上次发布
最近:-
eq(状态,忙碌),存在($+[locked_by($(LOGNAME)):]);
ge(状态,保存),最大值(mtime),
max(版本),eq(作者,$(LOGNAME));
ge(状态,建议),最大值(mtime),
最大(版本);
eq (__SymbolicName__, $(LASTRELEASE));
cut($_rule$:无法按要求绑定 $+!)。
lock_by (user_id) :-
max(版本),eq(储物柜,$_user_id$)。
有关版本选择规则语法、语义和列表的更详细说明
内置谓词,请参阅 绑定规则(7).
活化 of 版本 选择 规则
通过指定特定目标的名称来调用特定目标的版本选择
选择规则作为目标的第一个依赖项,或通过提供选择规则名称作为
论证 -R 选项。 如果未明确指定选择规则,则形状使用其
尝试绑定常规文件或最新版本的内置版本选择规则
版本到对象的名称。
变种
期限 变种 是指管理必须符合的产品的意图
不同的外部约束作为一个单元。 独立于特定
可能与变体概念相关联的语义,存在少量
在技术层面上实现软件变体的技术。 这些技术是:
的 分割 的变体组件。 这是通过维护单独的副本来实现的
不同目录中的组件,或通过在
版本控制系统;
资源 预处理 的变体组件。 使用这种技术,多个逻辑变体
源组件的信息保存在包含预处理器的单个文件中
指示。 在访问特定变体之前,预处理器必须提取它
来自共同的来源。 这种技术的一个流行例子是 有条件 汇编,
由 C/C++ 编程领域内的 #if 和 #ifdef 指令控制;
写作 变异 复杂的产品变体。 该技术解决了以下情况
复杂产品(例如程序)的不同变体由不同的
组件集;
求导 变异 (或过程的变化)产生不同的变体
通过修改派生参数从同一组源派生对象
过程。 这种情况的一个典型例子是交叉编译相同的源代码
不同的目标平台,或用于各种目的的代码检测,例如
调试、测试、分析或优化。
根据项目的特定需求,所有这些技术可能都在
同时使用,也可酌情混合使用。 形状允许关联
具有一组定义的逻辑变体名称控制上述所有内容
技术,使得请求构建特定系统变体成为可能(和
兼容变体的组合)而无需担心这些变体如何
是在技术上实现的。
变种 定义
形状从使用中获得其灵活性 宏 代换 在描述文件中
尽可能。 形状变量定义基本上是一组宏定义
当为构建激活变体时生效。 变体定义具有
以下格式:
:+
\t 名称1>=
...
当一个变体被激活时,与该变体关联的宏定义变为
有效的。 在描述文件中或在
命令行由变体宏替换替换。 如果宏定义在
一起激活的几个变体,将连接相应的值。
定位 物理 分开 变种 来源 对象
Shape 提供了一个特殊的宏, 路径,旨在用于变体定义。
这个 路径 宏定义了源版本存档时形状的搜索优先级
位于。 如果 路径 非空,shape 尝试在
首先是 vpath 目录。 如果多个激活的变体定义了 vpath,变体搜索
路径从右到左连接和搜索,即最后一个变体
激活优先。 仅当在任何一个中都找不到引用的源组件时
vpath 目录,搜索当前目录。 如果源对象已
找到后,会受当前版本选择规则的约束,暂时被
安装在构建目录中。 这意味着维护在一个
vpath 子目录临时移动到主目录。 因此,它不是
必须在目标规则中对 vpath 子目录路径进行任何引用。
变种 活化
在配置和构建产品时,变体通常通过提供
变体名称作为参数 -V 选项。
还可以通过指定各自的“+”前缀来为给定目标激活变体
变体名称作为依赖项(请参阅上面的目标规则部分)。 变体激活
目标必须出现在依赖行上的任何真实对象依赖之前,并且
在可选版本选择规则激活后。
变种 增益级 定义
通过 变种 程 定义, shape 提供了一个构造,允许定义
不相容 变种,即不能同时激活的变体。 形状
变体类定义具有以下格式:
类 ::=( , ...)
相同的变体名称可以出现在多个变体类定义中。 如果组合
使用属于同一变体的任何两个变体名称来请求变体
类,形状将发出错误消息,并终止。 检查变体类可以
通过指定禁用 -novclass 打开命令行。
注意:变体类定义必须出现在描述文件中 before 任何变体
在变体类中引用的定义。 之后定义的变体类
引用的变体不能强制互斥不兼容的变体。
An 例如:
以下示例将说明变体定义的使用,以及变体
类:
vclass 编译器 ::= (gnu, prop)
牛:+
CC = gcc -Wall
优化 = -O2 -inline-functions
调试 = -g -g3
配置文件 = -pg -a
STDC = -ansi
道具:+
抄送 = 抄送
优化 = +O3
调试 = -g -z +Y
简介 = -G
标准差 = -Aa
vclass 质量 ::=(调试、配置文件、优化)
调试:+
VARCFLAGS = $(调试)
简介:+
VARCFLAGS = $(配置文件)
优化:+
VARCFLAGS = $(优化)
CFLAGS += $(VARCFLAGS)
如果一个变体需要修改具有预定义含义的宏,有时
一个好主意 而不去 在变体部分重新定义宏本身。 在这种情况下是
可以通过使用形状的附加宏定义来增加现有的宏值
设施,以及为此目的定义的变体定义中的宏(例如 变量标志
在上面的例子中)。
项目运营
调用时,shape 首先解析命令行。 Shape 记录了变体的名称
通过命令行从命令行激活 -V 选项。 接下来,形状初始化
内置的和特殊的宏。 此外,shape 的内置推导规则被初始化。
阅读 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 描述 文件
之后,在命令行上进行的所有宏定义都将生效。 形状然后
找到并打开其描述文件。 如果没有指定描述文件作为参数
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 -f 选项,shape 尝试查找其中一个文件 形状文件, shape文件, 生成文件或
生成文件. 对于这些名称中的每一个, shape 首先尝试查找常规文件,如果没有
此类文件存在,以在版本控制中查找该文件的最新版本
档案。 如果找不到这样的版本,shape 会尝试下一个名称。
当 shape 读取描述文件时,它会收集所有宏定义,并将它们
立即生效,除非在命令中定义了同名宏
线。 如果特殊宏 进口 遇到,列出的环境变量是
定义为宏。 如果出现与导入的环境变量同名的宏
在描述文件中,它优先于环境中的定义,
除非 -e 开关生效。
当形状读取一个 包括 指令,它评估行的其余部分(即
指令之后的字符),并将每个单词解释为
要读取的文件。 每个文件名都绑定到一个普通文件,或者最
文件的最新版本。 Shape 打开每个包含的文件,暂停读取
当前描述文件,并继续读取包含文件的内容,
在它恢复读取原始控制文件之前。 如果有多个文件名
在 include 指令中指定,shape 依次读取每个文件,从
最左边,并以最右边的文件名结尾。 如果包含的文件不能
打开,形状发出警告。
shape 读取其描述文件时,版本选择规则和目标规则是
集。 他们是 定义 只有在 shape 读取完描述文件后。
宏、变体和变体类定义一经生效就生效
被认可。
这个 构建 流程
读取描述文件后,shape 确定哪些目标已被读取
要求。 如果从命令行请求目标,shape 将尝试
构建它们中的每一个,从最左边的目标开始并朝着
最右边。 如果没有从命令行请求目标,形状将搜索
名为目标的描述文件 。默认. 如果存在这样的目标,并且有任何
与之关联的依赖项,shape 将尝试构建这些依赖项中的每一个,
从左到右。 如果不 。默认 目标规则已在描述文件中定义,
形状将尝试构建 第一 目标 定义 in 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 描述 文件.
当 shape 构建目标时,它会按如下方式进行:
1)
通过遍历给定目标来确定源对象的名称
依赖图,使用内置和用户提供的目标规则。 依赖图
是先遍历深度。 记录所有应用规则的 ID。
2)
对于每个所需的源对象,在存储库中找到源版本存档。
源版本档案的定位采用当前 路径 考虑到了。
3)
将每个源对象的名称绑定到适当的版本,如
当前活动的版本选择规则。 记录每个绑定依赖的id。 如果一个
依赖本身是一个派生对象,使用它的 缓存 键 作为身份证。
4)
构建 求导 键 从目标名称和当前目标
步骤 1) 和 3) 产生的记录。
5)
在派生对象缓存中搜索派生密钥与以下对象相同的对象
在步骤 4 中构造的密钥)。
6a)
如果找到合适的派生对象,则在构建中安装它的副本
目录,而不是从其来源派生。
6b)
如果没有找到合适的派生对象,则通过从它的派生对象来创建它
部分。 生成的派生对象被放入派生对象缓存中,并且
与步骤 4) 产生的派生密钥相关联。
具有空依赖项列表的目标 - 因此是空的派生键 - 总是
(重新)派生。
当 shape 确定请求目标的依赖关系时,它通过评估
要么是显式的目标规则,要么是通过应用——可能是内置的——隐式规则。 如果
显式目标规则指定对象相关性,但规则中没有派生脚本
body, shape 将尝试提供适当的默认派生脚本。 什么时候
搜索这样一个默认的派生脚本,shape 试图找到一个适用的隐式
当前目标的规则。 隐含规则被认为是适用的,如果它具有
其目标列表中的当前目标(模式替换后),以及所有 - 显式,
和隐含的 - 存在依赖关系。 如果没有发现适用的隐式规则,则形状
寻找 。默认 目标规则。 如果这样的规则存在,并且它有一个关联的
派生脚本在其规则正文中,此脚本将作为默认派生提供
脚本。 如果两种可能性都没有导致默认派生脚本,形状
放弃。
派生 摆件 高速缓存
在请求目标的派生过程开始之前,它试图找到一个
派生对象缓存中与所需属性匹配的合适派生对象。
形状基于 求导 键 目标对象的概念。 推导键是
根据上述算法构造。 相关参数进入
推导键是 名单 of 依赖 IDS, 目标 排除 id, 名单 of
最佳的 成分, 建立 平台 (通常由宏定义 主机类型; 如果这
宏未定义,形状以主机 ID 作为构建平台),并且 属性
扩张 状态 每个源对象。 当一个对象被派生时,形状存储它
在派生对象缓存中,并用派生键属性标记它。 为一个
形状的派生对象缓存处理的详细跟踪,以及派生键的使用,
运行形状与 -D 开关。
命令 执行
当需要(重新)派生目标时,shape 会执行与目标相关的命令
目标。 在执行命令之前,shape 设置命令执行上下文。 这
目标依赖项的版本对象作为常规文件安装在文件中
系统。 如有必要,shape 从版本控制档案中检索源对象。 如果
具有对象名称的文件已存在于版本所在的位置
安装,形状将暂时将其移动到 在FS 子目录。 命令后
脚本完成后,shape 将恢复所有受影响目录的原始状态。
Shape 通过启动引用的程序来执行命令行 $(壳牌) 宏,
并打开管道到由此产生的过程。 命令行被写入管道,并且
因此发送到 $(壳牌) 过程的标准输入。
规则主体中的每个命令行都由单独的进程执行。 就这样
不保留单独命令的执行状态。 如果需要多个命令
依赖于先前命令的执行状态,所有这些命令必须发生在一个
单命令行。 这是可能的 线 延续 (请参见 句法
结构, 以上)。
注意:许多命令解释器使用 ``$'' 字符作为特殊符号(通常作为
变量引用)。 确保将命令中的“$”字符传递给 $(壳牌)
使用 ``$$'' 特殊宏进行处理(参见 宏 案例, 以上)。
不兼容
为了方便从 使(1),形状被设计为向上兼容
与生成文件。 尽管大多数 make 的描述文件功能都以形状呈现,
可能需要处理许多不兼容性。 那里存在
还有一些原始 make 程序的流行扩展(例如 Sun 的 Make、HP 的
Make、GNU Make、nmake 等)提供各种不支持的特殊功能
其他进行扩展,或按形状。 当计划从制造到形状的迁移时,它
应该检查是否使用了特殊扩展或不兼容的功能。
功能 而不去 支持的 by 塑造
双 结肠 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
双冒号规则将同一目标与不同的派生脚本相关联。
这种类型的规则对于支持目标的不同派生非常有用
哪些依赖项已过时。 因为形状决定是否
衍生于 求导 键,而不仅仅是文件的修改时间戳,
这种规则在形状上毫无意义。
存档 会员 目标
归档成员目标是存在于归档文件中的对象(请参阅 ar(1)) 相当
比文件系统。 在这些档案中,根据
源文件的修改时间戳和存档条目日期。 不可能
用于形状模拟存档成员的派生键的概念。
然而,档案的维护很容易形状,因为所有数据都用于编译
对象文件保存在派生对象缓存中。 如果对象的来源
存储在存档中的内容被修改,形状可以重新派生此对象,并且
有选择地替换存档中的条目。
供应链服务中心 东西
为了为面向团队的开发过程提供基础支持,使
允许从 SCCS 档案中检索最新版本的源文件。
由于 SCCS 版本存档文件的命名约定笨拙,因此特殊的
必须在 make 中内置对处理这些档案的支持。 因为形状是
与 在FS 版本对象存储库,不需要
任何特殊的 SCCS 支持。
Special 目标
形状不识别特殊目标 。宝贵的:和 .后缀:。 该
Makefiles 中的 .PRECIOUS 目标旨在防止昂贵的删除
派生的中间目标(默认情况下,make 删除中间目标)。
因为 shape 在派生对象缓存中存储中间目标,所以没有
需要 .PRECIOUS 功能。 为了防止缓存可能很大的、无用的
中间目标,使用 .NOBPOOL: 特殊目标(见章节 Special
目标, 以上)。 Makefiles 中的 .SUFFIXES 目标旨在引入新的
后缀类型进入 make 的派生引擎,并确定其中的顺序
隐含规则(后缀 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。 在 make 术语中)被应用。 在形状上,新的后缀
类型可以动态添加,只需引入新的隐式规则即可。 而且,
shape 具有智能算法,可确定适用的隐式规则。
功能 - 不同 语义
环境 变量
许多 make 程序将整个环境变量集作为宏导入
定义到构建过程中。 这有时会产生令人惊讶的结果。
在形状中,环境变量是显式导入的 进口 特别
宏。
? 宏
在 make 的目标规则中,特殊宏引用 $? 由名称代替
自当前目标已更新的那些依赖文件名中
被导出。 因为形状决定是否派生的概念是
求导 键,而不仅仅是文件修改时间戳, ? 宏不能
被正确定义。 相反,形状替换了整个依赖列表
名称 - 更新与否。
使用 onworks.net 服务在线使用 shape