这是命令 makepp_statements 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
makepp_statements -- 生成文件中的各种语句
商品描述
A: 自动加载, B: 构建缓存,
构建检查, D: “定义”, E: 出口, G: 全球, I: 如果定义,
如果,
ifmakeperl,
如果定义,
如果,
ifnsys,
如果属实,
ifperl,
如果系统,
如果是真的,
-包括,
包括,
_包括, L: 加载生成文件, M: 制作,
制造商,
化妆, N: "no_implicit_load", P: 珀尔,
"perl_begin",
预建, R: register_command_parser,
注册输入后缀,
注册解析器,
资料库
运行, S: 签名,
"子", V: 路径
语句是任何以没有“:”的单词开头的行。 (一个冒号
暗示该行是一条规则。)例如,这些是陈述:
包括 extra_rules.mk
load_makefile 子目录
Makepp 有许多内置语句,您可能偶尔需要使用它们。
请注意,无论您在哪里看到下划线,都可以使用破折号,因为 makepp 会转换
语句名称中的破折号到下划线。
条件语句
条件是特殊的语句,它控制 Makeppfile 的哪些行
实际见过。 最简单的形式(其中“ifxxx”代表任何条件
下面记录的语句)是:
如果xxx ...
如果语句评估为真,看到的行
ENDIF
要么:
如果xxx ...
如果语句评估为真,看到的行
其他
如果语句评估为假,则看到的行
ENDIF
也有可能做这样的复杂组合:
如果xxx ...
和 ifxxx ...
和 ifxxx ...
或者如果xxx ...
和 ifxxx ...
如果组合语句评估为真,则看到的行
否则如果xxx ...
或者如果xxx ...
和 ifxxx ...
如果第一个组合的评估结果为 false,则会看到行
并且这些组合语句评估为真
其他
如果上述语句评估为错误,则看到的行
ENDIF
正如缩进所建议的那样, “和” 优先级高于 “或者”. 换句话说
an “或者” 在两组之间进行选择 “和”`s. 可能有任意数量的“and ifxxx”,
“或 ifxxx”和“else ifxxx”。
“ifxxx”条件语句的独特之处在于它们可能出现在规则的中间
操作,如上例所示,而不会破坏规则。
伊埃克 字符串1, string2
IFNEQ 字符串1, string2
ifeq ($(STR1),$(STR2))
生成文件行如果为真
其他
如果为假,makefile 行
ENDIF
如果两个字符串完全匹配(前导或尾随空格除外),则
使用第一组线; 否则使用第二个。 else 子句是
可选的。
“ifeq”和“ifneq”语句还有另外两种可接受的语法:
ifeq 字符串 1,字符串 2
ifeq 字符串 1 字符串 2
它们是等效的。 当然,您可以根据需要引用字符串。
"ifeq" 和它的朋友 "ifneq", "ifdef", "ifndef", "ifperl", "ifmakeperl", "ifsys" 和
“iftrue”主要用于当您必须在几个不同的环境下构建程序时
使适应。 例如,
BUILD_TYPE := debug # "调试" 或 "生产"
ifeq ($(BUILD_TYPE), 调试)
CFLAGS := -g
其他
CFLAGS := -O2
ENDIF
程序:*.o
$(CC) $(CFLAGS) $(输入) -o $(输出) $(LIBS)
ifeq ($(BUILD_TYPE), 生产)
剥离 $(输出)
ENDIF
%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)
如果这是一个生产版本,所有文件都使用“-O2”选项编译,而不是
“-g”选项。 此外,程序“strip”在生成的二进制文件上运行(在
如果您碰巧链接了一些在调试模式下编译的库)。
有时使用“$(if)”函数或“$(perl)”函数更容易
而不是“ifeq”语句。
如果您只想查看一个符号是否为空白,您只需要提供一个
单个参数,如下所示:
ifneq $(EXE_SUFFIX)
# 如果 $(EXE_SUFFIX) 不为空怎么办
ENDIF
如果定义 变量 ...
如果定义 变量 ...
这些语句类似于“ifeq”和“ifneq”语句,除了
他们测试是否定义了任何变量(即没有定义)
定义)。 在以下情况下定义变量:
· 它在makefile 中的早期赋值中被赋予了一个值。 看
makepp_variables 了解详情。
· 在“perl_begin”块中,它被赋予一个作为 Perl 变量的值。
· 变量存在于环境中。
· 该变量存在于命令行中,例如,要调用您的 makefile,您
类型
makepp CFLAGS=-O2
例如,
ifndef CFLAGS
CFLAGS := -g
ENDIF
在这种情况下,“CFLAGS”仅在尚未定义时才设置为“-g”。 注意
这个语句可以很容易地使用“?=”赋值来编写,比如
这个:
CFLAGS ?= -g
飞利浦 代码
ifmakeperl 代码
这些语句类似于“ifeq”和“ifneq”语句,除了
测试在 Perl 中进行。 第一个变体是普通的 Perl 代码,而第二个变体
首先通过 Make 风格的变量扩展传递语句。
版本:= 3.0
# VERSION 自动也是一个 Perl 变量:
ifperl $VERSION <= 2
CPPFLAGS := -DNEW
ENDIF
# CFLAGS 需要引号,因为 Perl 只能看到值:
ifmakeperl 我的 $$x = '$(CFLAGS)'; $$x =~ /-g/
CFLAGS := -g -O2
ENDIF
如果系统 通配符 ...
信息系统 通配符 ...
测试当前运行的系统 makepp 是否匹配任何通配符
任何(即没有)。
ifsys i[3-6]86
和 ifsys Linux SunOS
... # 带有 Linux 或 Solaris 的 Intel 平台
否则 ifnsys sparc 功率*
... # 也不是 Sparc 或 PowerPC
ENDIF
您最多可以匹配六个不同的字符串。 实际的字符串是
不规范。 其中三个反映了 Perl 实例的构建目的(不是
必须与它运行的地方相同),其他来自系统和
所有的形式都千差万别。 您可以通过以下方式找到当前平台匹配的所有内容
在 Shell 中键入以下命令:
perl -MConfig -e'print "$^O @Config{qw(archname myarchname)} "'; uname -mps
如果是真的 表达
如果为真 表达
测试表达式的计算结果是否为零或空字符串以外的某个值。
其他 多线 声明
条件可以控制整个多行语句,但它们不能在这样的内部
语句。
定义
{export|global|override}* 定义
定义变量 [赋值运算符]
变量值第 1 行
变量值第 2 行
恩德夫
将 $(VARIABLE) 的值定义为“define”语句和
“endef”声明。 请参阅多行变量。 关键字“export”和“global”可能
不能同时给予。
perl_开始
这与“perl”相同,但使用 GNU make 样式语句语法。 这个说法
引入了一个由 perl 逐字解释的代码块。 它可能很有用
用于定义函数,但您可以使用“sub”语句更简洁地完成此操作。
makefile 中的 Perl 代码块对于执行更容易的操作很有用
在 Perl 中使用 makepp 函数和规则。
忽略“perl_begin”语句后面的行的其余部分。 所有文字
直到以“perl_end”开头的左边距的一行被逐字发送到
perl 解释器。 “perl_end”之前不能有空格。
我使用它的一个例子是创建可能不一定的目录
存在。 在 makefile 中,将所有 .o 文件放在一个子目录中是很常见的(例如,一个
有名字的目录 i386或 SPARC,或取决于机器类型的东西)。
但是如果目录还不存在呢? 您可以使每个 .o 文件依赖于
子目录,并在其中放置规则以构建子目录。 但这要容易得多
去做这个:
OBJDIR := $(ARCH) # 我们放置 .o 文件的位置。
perl_开始
-d $OBJDIR 或 mkdir $OBJDIR; # 确保目录存在。
perl_结束
这样,每次运行 makefile 时,如果执行,就会创建子目录
不存在。
有些操作用正则表达式比 makepp 的表达更好
文字功能。 例如,
perl_开始
if ($ARCH =~ /^i[56]86/) { # 你可以这样做: ifsys i[56]86
$CFLAGS = '-O6 -malign-double'; # 在英特尔机器 > 486 上,有
# 是一个相当大的速度惩罚
# 对于不是四字的双打
#对齐。
} {
$CFLAGS = '-O6';
}
perl_结束
%.o: %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)
任何 make 变量都可以作为 Perl 标量直接访问。 在这种情况下,我们已经设置
“CFLAGS”的值根据正则表达式匹配而不同
建筑标志。
作为最后一个例子,一些信息更容易直接从 Perl 访问
比来自makepp。 例如,您可以访问所有配置信息
perl 了解您的系统,包括如何构建共享库等。
(如果您想查看 Perl 有哪些配置信息,请输入“perldoc Config”
可用。)
perl_开始
使用配置;
$ARCH = $Config{'archname'}; # 使用 perl 的架构知识。
$CC = $Config{'cc'}; # 使用与 Perl 相同的 C 编译器。
$SHARED_OBJ_CFLAGS = $Config{'cccdlflags'};
# 编译对象所需的标志
# 进入共享库。
$SHARED_OBJ_LDFLAGS = $Config{'ccdlflags'} 。 “ ”。 $Config{'lddlflags'};
# 链接器标志以创建共享库。
$SHARED_CC_LINK = $Config{'ld'}; # 生成共享库的命令。
$SHARED_EXTENSION = $Config{'dlext'}; # 共享库的扩展。
perl_结束
%.o: %.c
$(CC) $(CFLAGS) $(SHARED_OBJ_CFLAGS) -c $(输入) -o $(输出)
libmylib.$(DLEXT): *.o
$(SHARED_CC_LINK) $(输入) -o $(输出) $(SHARED_OBJ_LDFLAGS)
注意我们如何在 Perl 块中定义一堆变量,然后我们使用它们
之后在makefile的其余部分。 您可以使用 perl 的全部功能
解释器以任意复杂的方式设置变量。 你可以运行shell
来自 Perl 代码的命令、访问数据库或任何你想要的。
perl的 代码
编译器 代码
这与“perl_begin”相同,但使用 Perl 风格的大括号。 第一个变体是
普通的 Perl 代码,而第二个变体首先通过 Make 传递语句-
样式变量扩展。 注意解析Perl的大括号的难度有导致
到以下简单的启发式:
· 如果在同一行或下一行发现双开大括号,则双闭
大括号将终止块。 它必须在一行的开头,但也可以是
前面有空格。
· 否则,如果右大括号在“perl”行的最后,这是一个
衬垫。
· 否则右大括号必须在下一行的开头,
即没有前导空格。
有关调用 Perl 脚本的有效方法,请参阅“运行”。 与“$(perl)”函数不同,
忽略此块的返回值。
perl { 打印“在 makefile 中通过了这一点\n”}
perl的
{
打印“还有这个\n”;
}
ifdef 嘈杂
Perl {{
打印“以及这个\n”
}}
ENDIF
您可以在嵌入式代码中使用 Perl 调试器,方法是在
调试器,其中 ... 是参数,如果有的话,你通常会通过:
perl -d -S mpp ...
很难在尚未加载的 Perl 代码中设置断点。 你可以工作
通过将此行放入您的嵌入式 Perl 中,就在您想要的位置之前
打破:
$DB::单 = 1;
然后你可以在调试器的提示下输入“c”,继续到那个点。
分
代购
该语句提供了一种在 makefile 中定义 Perl 子例程的方法。 这
第一个变体是普通的 Perl 代码,而第二个变体首先通过语句
通过 Make 风格的变量扩展。 语法与 Perl 相同
sub 语句,除了原型是没有意义的。
关于放置身体支架的三种可能性,请参阅以下说明
“perl”语句。
每当看到一个语句,或者当一个表达式像
看到“$(name words)”。 例如,假设由于某种原因您需要加载
将文件的内容转换为 make 变量。 (你可以这样说
“$(shell cat filename)”,但可以在不调用 shell 的情况下执行此操作。)
这可以通过将以下内容放入您的 makefile 中来完成:
子 f_file_contents {
我的 ($file) = @_; # 命名参数。
打开我的 $fh, $file 或死亡 "$file: $!\n";
本地 $/ = undef; # 一次性读取文件。
<$fh>;
}
ifdef 新订阅
makesub f_VAR2
{{
$(VAR) * 2;
}}
ENDIF
makesub f_VAR1 { $(VAR) + 1 }
现在,定义此函数后,您可以编写
X = $(file_contents filename) # 相当于内置 $(&cat filename)
并且变量“$(X)”将在每次获取时获取给定文件的内容
扩大了。 使用 ":=" 只执行一次,或使用 ";=" 最多执行一次。
有关更多详细信息和示例,请参阅 makepp_extending。
简易 声明
自动加载 文件名 ...
指定一个或多个要加载的 makefile,如果尝试在其中查找文件的规则
否则此目录将失败。 当 makefile 具有以下规则时,这很有用
定义依赖(可能是间接的)依赖于另一个目录中的文件
(可能间接地)在此目录中的其他文件上(由执行的规则构建 而不去
取决于另一个目录中的文件)。
例如,您的 生成文件 可能看起来像这样:
规则到构建文件-otherdir/x-depends-on
more_rules.makeppfile: otherdir/x
行动建立更多_rules.makeppfile
自动加载 more_rules.makeppfile
请注意,我们不能在这里可靠地将“自动加载”替换为“包含”,因为如果
规则之外的东西 more_rules.makepp 文件 试图建立 其他目录/x
首先,然后 more_rules.makepp 文件 可能会失败,因为 其他目录/x 不会存在
然而,因为已经有人尝试建造它,当 生成文件 is
代表它隐式加载。
警告:在自动加载的 makefile 中执行会更改
目录的其他生成文件中的规则行为,因为这将导致
行为取决于某些先前构建的目标是否导致 makefile
自动加载。
构建缓存 /路径/到/构建/缓存
[全局] build_cache /路径/到/构建/缓存
指定构建缓存的路径。 有关详细信息,请参阅 makepp_build_cache。 构建
缓存必须已经存在; 请参阅 makepp_build_cache 中的“如何管理构建缓存”了解
如何首先做到这一点。 生成文件中的“build_cache”语句覆盖
生成文件中规则的“--build-cache”命令行选项,但它可能是
在每个规则的基础上被 ":build_cache" 规则修饰符覆盖。
关键字“global”可以在此语句之前,与命令的效果相同
行选项,即构建缓存适用于每个生成文件。 这应该是最好的
在一个 根Makepp文件 可以肯定的是,它已经足够早了。
如果要禁用构建缓存,请指定“none”而不是目录路径
对于此 makefile 中的所有规则。
构建检查 构建检查方法
[全局] build_check 构建检查方法
指定此 makefile 中所有规则的默认构建检查方法。 看
makepp_build_check 了解详情。 “build_check”语句覆盖
生成文件中所有规则的“--build-check-method”命令行选项,但可能是
在每个规则的基础上被 ":build_check" 修饰符覆盖。
关键字“global”可以在此语句之前,与命令的效果相同
行选项,即构建检查方法适用于每个不
指定自己的。 这应该最好在一个 根Makepp文件 确定它是
看的够早。
如果要返回默认值,请指定“build_check default”而不是名称。
使用关键字“global”这意味着“exact_match”方法,否则这将恢复
当前的 makefile 没有自己的特定方法。
出口 VAR ...
出口 分配
导出路径 := $(PWD):$(PATH)
标记要导出到子流程的给定变量。 请参阅设置变量。
全球化 VAR ...
全球化 分配
全局 MYPROJECT.INFO = 要在所有 makefile 中看到的信息
将给定的变量标记为所有 makefile 的全局变量。 请参阅设置变量。
包括 生成文件
这会将另一个 makefile 的内容插入到当前的 makefile 中。 有可能
如果您有包含许多规则或变量的样板文件,并且每个
目录只需要做一些修改。 还使用了“include”语句
与自动包含文件一起用于传统make
扫描仪,但这对于 makepp 不再是必需的。
“include”首先考虑当前目录,然后是当前目录的父目录
目录,然后是它的父目录,等等。当它到达
文件系统的根目录或文件系统设备 ID 更改时。 (这意味着
它不会找到位于其他 NFS 挂载中的文件。 这是为了防止出现问题
网络文件系统或自动挂载器和死服务器。)如果它没有找到
搜索停止时的给定名称,然后在 makepp 数据中查找
目录(/usr/本地/共享/makepp 如果你安装了 makepp 在/ usr /本地) 对于其中之一
makepp 附带的包含文件。
如果您想在整个目录的每个 makefile 中包含一个模板文件
层次结构,您可以将 makefile 模板放在顶级目录中。 生成文件
不必确切知道它们在层次结构中的位置; 每个 makefile 可以包含
像这样的一行:
包括standard_definitions.mk
而不是更复杂的东西,像这样:
include ../../../standard_definitions.mk # 这是正确的 .. 数量吗?
您可以根据需要指定任意数量的文件,并且允许使用变量:
包含文件 1 文件 2 文件 3 $(other_include_files)
如果您正在处理需要同时使用 GNU make 和 makepp 的构建,
有时使用完全相同的 makefile 但包含不同的包含会很方便
文件。 例如,您的所有 makefile 都可能包含如下一行:
包括 $(TOPDIR)/standard_rules.mk
你想要 标准规则.mk GNU make 和 makepp 不同。 为方便
这,“包含”语句 第一 查找带有后缀的文件 .makepp before
寻找你要求的文件。 在这种情况下,它会首先寻找一个文件
被称为 标准规则.mk.makepp,如果存在,它将加载它而不是
标准规则.mk. 这样,当您使用 GNU make 运行 makefile 时,它会加载
标准规则.mk,但是使用 makepp,它会加载 标准规则.mk.makepp.
因为很多遗留文件把规则放在include之后生成一个include文件
声明,makepp 会将有关不存在或陈旧的包含的决定推迟到最后
生成文件加载。 也就是说,除非它是用“--rm-stale”调用的。 对于尽可能多的
到那时情况有所改善(因为出现了规则)makepp 将
重新加载 makefile,这可能会再次出现更多此类规则。 这显然是
加载 makefile 的一种低效方式,因此请尽量避免这种情况。 更糟糕的是,如果你的 makefile
加载有副作用(比如附加到一个全局变量或一行
"do_it_now := $(shell cat a >>b)" 或者它的 makepp 等价物 "&cat a -o>>b") 他们会
发生的次数与需要加载 makefile 的次数相同,因此,再次尝试避免这种情况!
_包括 生成文件
-包括 生成文件
“include”的一个小变种,“_include”语句包含文件(如果存在)
但如果没有,则不会产生致命错误。 “_include”语句用于
对于使用 GNU make 扫描包含文件很重要,但对 makepp 不太有用。
加载生成文件 /一些/目录/某处/生成文件
加载生成文件 子目录
加载生成文件 VAR1=值1 VAR2=值2 子目录
此语句使 makepp cd 到包含 makefile 的目录并加载
将其规则写入 makepp 的内部数据库。 如果您只指定一个目录而不是
一个makefile,“load_makefile”在其中查找“Makeppfile”、“makefile”或“Makefile”
目录。
您使用语法“VAR=value”(或“VAR=”value1 value2“”)指定的任何变量都是
传递给加载的makefile。 它们会覆盖那些 makefile 中的任何设置,只是
就像您在命令行中输入它们一样。
使用“load_makefile”与命令不同
包括目录/makefile
有两种方式。 首先,“load_makefile”不会从顶层传输任何变量——
级makefile进入下级makefile; 每个 makefile 都独立存在
命名空间。 下级makefile不能影响顶层变量
以任何方式生成文件。
其次,每个构建命令都标有它来的生成文件的目录
从。 当 makepp 从不同的 makefile 执行规则时,它首先 cd 到
在执行命令之前包含该 makefile 的目录。 Makefile 是
用“include”语句看到的实际上被视为makefile的一部分
包括它们,因此它们的规则没有用不同的目录标记。
您通常不必显式加载 makefile,除非它有一个不寻常的名称,
或者它的目标不包含在与 makefile 相同的目录中
本身,或者您已禁用隐式生成文件加载。 默认情况下,如果 makepp 是
试图构建一个文件但没有构建它的规则,或者它正在评估一个
目录中的通配符文件名,它将自动尝试加载生成文件
从那个目录。 有关信息,请参阅 makepp_cookbook 中的“多个目录的提示”
关于构建多个目录。
您不能使用“load_makefile”来加载适用于相同的多个 makefile
目录。 对适用于相同的 makefile 的几个部分使用“include”
目录,以及“load_makefile”用于适用于不同目录的生成文件。
无隐式负载
此语句关闭从一组目录中隐式加载 makefile。
如果您想从大多数目录自动加载 makefile,这会很有用,
但是有一些目录出于各种原因您不希望 makepp
尝试更新。 (例如,也许该目录有其他版本的 makefile
makepp 不理解的 make。)例如,
no_implicit_load dir1 dir2/*
上述语句将关闭“dir1”中生成文件的隐式加载 和 所有 of
它的 子目录. 它还将为所有人关闭隐式生成文件加载
“dir2”(及其所有子目录)的子目录,但不适用于“dir2”本身。
您可以在语句中使用通配符。 匹配通配符的非目录文件
被忽略。 您还可以使用函数来进一步指定您要使用的目录
感兴趣,例如,
no_implicit_load $(过滤掉 dir1 dir2, *)
将关闭所有子目录的隐式加载,除了 dir1 和 dir2 和他们的
子目录。
预建 目标
使 目标
参数(经过 Make 风格的变量扩展)立即构建。
当 Makefile 可以构建的目标列表依赖于
在另一个目录中生成的文件。
目前,如果之间存在依赖循环,它将悄悄地无法构建目标
预构建的目标和必须加载以构建它们的 Makefile,但是
应该被视为错误。
注册命令解析器 命令字 解析器
注册解析器 命令字 解析器
在词法分析规则操作时,使用 解析器 命令字,这可能是
完整路径或只是基本名称。 基名通常就足够了,因为词法分析器
两者都试。
- 解析器 可以是带或不带前导的类名
“Mpp::CommandParser::”。 这样的类必须有一个名为“工厂”的成员函数
返回该类的对象。 如果类名包含冒号,则必须是
引用,以免使这条线看起来像一条规则。
或者,由于该类通常尚未加载,因此工厂函数可能
驻留在 Makefile 命名空间中。 这些函数有一个前缀“p_”,它必须
不被给予。 这是内置解析器的情况。
效果与 ":parser" 规则选项相当。 但是对于多命令规则
这是更好的方法。
注册输入后缀 命令字 后缀 ...
将“后缀”...添加到操作时识别的输入文件后缀列表中
解析以“command_word”开头。 解析器通常会通过
Mpp::CommandParser::input_filename_regexp,但它可能会完全忽略这一点。
解析器通常不会选择所有未被识别为选项的参数,
因为它们可能是无法识别的选项的参数。 (例如, i386v is 而不去
命令“gcc -b i386v foo.c”的输入文件。)相反,他们只拿起
看起来像输入文件名的位置参数。
使用带有特定站点的非标准后缀的标准工具并不少见
为了表示这些文件需要特殊处理,例如不同的命令
选项和/或后处理步骤。 例如:
注册输入后缀 cpp .vpp
%.v: %.vpp
cpp $< > $@
知识库 目录
知识库 目标目录=源目录
指定一个或多个存储库目录。 指定的第一个存储库具有
如果同一个文件存在于多个存储库中并且存在相同的文件,则优先于其他文件
没有针对它的构建命令。 有关更多详细信息,请参阅 makepp_repositories
仓库。
如果在“repository”之后只指定一个目录,它的内容将链接到
当前目录。 您可以将其内容链接到文件中的任意位置
系统通过在等号前指定位置,例如,
存储库 subdir1/subdir2=/users/joe/joes_nifty_library
您应该将存储库语句放在 makefile 顶部附近,在任何之前
可能需要使用它的规则。
运行 程序,库
将“库”存储为“程序”的运行时依赖项。 “程序”和“库”
可能包含多个单词,在这种情况下,“库”中的每个单词都存储为
“程序”中每个单词的运行时依赖性。 自动添加“程序”时
作为“Mpp::CommandParser”基类命令的可执行依赖项,它的
还添加了运行时依赖项(如果有)。 为了让这件事发生,
“程序”必须在带有目录组件的规则中指定,并且没有任何
外壳元字符。 此语句的目的是捕获对
经常由程序加载的库和其他可执行文件,而无需
将它们明确指定为调用“程序”的每个规则的依赖项,或者
扫描“程序”以确定这些依赖项(这可能会令人望而却步
难的。)
运行时依赖是递归遍历的,所以如果“a”有运行时依赖
"b" 和 "b" 对 "c" 有运行时依赖,那么任何使用 "./a" 的规则都将具有
对“b”和“c”的隐式依赖(除非它使用特殊的
覆盖此行为的“Mpp::CommandParser”类)。
请注意,添加此语句后不一定会添加缺少的依赖项
到生成文件,除非重新扫描规则。 使用“--force-rescan”命令行
选项以确保发生这种情况。
签名 姓名
[全局] [覆盖] 签名 姓名
签名 md5
签名C
签名 c_compilation_md5
签名xml
签名xml空间
签名默认
为“签名”语句之后的所有规则设置签名方法,为此
没有命令解析器选择一种方法。 您可以使用
":signature" 规则修饰符。
如果添加关键字“覆盖”,则此方法将覆盖甚至选择
由命令解析器生成,但不是由 ":signature" 规则修饰符指定的那些。
如果添加关键字“global”,则效果适用于所有尚未阅读的规则,
除非他们的 makefile 也有自己的“签名”声明。 这相当于
如果在读取任何规则之前给出“--signature”命令行选项,例如在
根Makepp文件 可以肯定的是,它已经足够早了。 同样,关键字“全球
覆盖”这个语句等效于“--override-signature”命令行
选项。
如果要返回默认值,请指定“签名默认值”而不是名称。
使用关键字“全局”这意味着简单的修改时间和文件大小
方法。 否则这会将当前的 makefile 恢复为没有自己的特定方法,
如果设置了全局方法,则使用全局方法。
有关签名方法的更多信息,请参阅 makepp_signatures。
路径 模式 目录 ...
从每个给定目录中获取所有匹配模式的文件。 模式可能包含在
最多一个“%”通配符。 这使用透明存储库机制(与 gmake 不同
重写文件名),但它不会递归到子目录中。
命令
所有内置和自定义命令(参见内置命令和扩展 makepp),以及
因为外部干净编程的 Perl 脚本可以像语句一样使用。 在这种情况下
它们与规则操作的不同之处在于它们在与 makepp 和任何输入相同的进程中运行
或输出文件不会被标记为依赖项或由 makepp 构建。
与所有语句一样,如果它们的缩进小于
上一条规则的操作,如果有的话。
这可用于在读取 makefile 时输出消息:
&echo $$(VAR) 的值为 $(VAR)
或者,不是制定许多规则,每个规则都依赖于目录创建规则,您可以简单地
即时创建。 请注意,创建文件的命令每隔
读取 makefile 的时间。,这就是为什么我们用测试来保护这个文件——尽管在这个
不需要的特殊情况,因为此命令在重复时不会造成伤害:
ifperl !-d '包括'
&mkdir -p include # 如果不存在则创建
ENDIF
使用 onworks.net 服务在线使用 makepp_statements