英语法语西班牙语

Ad


OnWorks 网站图标

makepp_rules - 云端在线

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

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

程序:

您的姓名


makepp_rules -- 如何告诉 makepp 构建某些东西

商品描述


?: &,
-,
@, B: :构建缓存,
:构建检查, D: :派遣, E: :环境, I: "ignore_error",
:包括, L: :最后的机会, M: 制造商, N: "没有回声", P: :解析器,
"perl", S: :签名

规则告诉 makepp 如何构建一个文件或一类文件。 Makepp 支持
与 make 的其他实现相同的规则语法,加上它自己的一些添加。

规则具有一般格式

目标表达式:dependency_expression [:可选参数]
行动

目标列表可能不包含任何自动变量(“$(foreach)”除外)。 这
依赖列表可能只包含引用目标的自动变量(即,
“$(output)”、“$(outputs)”或它们的同义词)。 该动作可能包含任何自动
变量。

如果makepp决定需要执行规则,则执行规则的每一行
顺序,如果有任何返回非零状态,则不执行余数(并且
除非您在命令行中指定了“-k”选项,否则 makepp 会因错误而中止。)
每个动作应该只有一行。 如果一个动作太长而不能方便地写在一个
单行,你可以把它分成几行并加上一个反斜杠来表示
几行应该合二为一。

为了将动作与下一个规则区分开来,动作应该缩进更多
比包含目标和依赖项的行。 不同于其他的实现
make, makepp 并不关心缩进多少或是否使用制表符
而不是空格。 为了保持与传统 make 的向后兼容性,规则
makepp 用来决定动作何时结束和下一个规则开始的时间有点复杂:

· 第一个动作行必须比包含目标的行缩进更多。

· 如果一行缩进一个制表符或8个空格或更多,则认为是
一个动作线。

· 空白行或右边缘带有“#”字符的注释行结束
规则,除非下一个非空行缩进超过 8 个空格(或超过一个
标签)。

· 如果一行缩进与第一行一样多或更多,那么它就是
被视为额外的行动路线。

有一些特殊的行动项目:

& 这个符号后面应该跟一个命令名称和任意数量的参数。 贝壳
这里没有完全理解语法,只有单引号和双引号以及反斜杠
里面的字符,就像整个makepp一样。 命令名称要么指向一个函数
“C_姓名” 将剩余的字符串作为参数调用。 如果这样的函数可以
找不到,这与从“perl”块调用“run”相同。

这允许有效地调用内置的、makefile 提供的或外部命令。
选择前缀“&”是因为它是 Perl 中的函数调用程序,并且因为
一开始,它在壳牌中是非法的。

$(ROOT)/include/%.h: %.h
&ln $(输入) $(输出)

没有回声
@ 通常,每个 shell 命令在执行时都会打印出来。 但是,如果第一个词
动作是“noecho”(或者如果它以字符“@”开头),那么命令
不打印。 例如,

%.o: %.cxx
noecho $(LIBTOOL) --mode=compile $(CC) -c $(输入)

这意味着当 libtool 命令被执行时,它不会被打印出来。 (库工具
本身通常会打印它执行的修改后的命令,所以它是多余的
打印两次。)

忽略错误
- 通常,如果 shell 命令返回非零状态,则 makepp 中止,因为
命令失败。 但是,某些程序错误地设置了退出状态,或者
可能存在一个真正不是致命的错误,不应中止整个过程
汇编。 您可以通过指定使 makepp 忽略返回状态
“ignore_error”作为命令行的第一个单词(或“-”作为第一个字符)。
例如,

$(虚假分发):
ignore_error rm -r my_program-$(VERSION) # 摆脱以前的垃圾。
&mkdir my_program-$(VERSION)
&cp $(FILES) my_program-$(VERSION)
tar cf my_program-$(VERSION)).tar my_program-$(VERSION)

该命令创建一个目录,将一堆文件复制到其中,然后放入
将所有内容放入 tar 文件中进行分发。 清理一下是个好主意
目录的先前内容,如果先前有任何内容,那就是
第一行做什么。 “rm”可能会失败,但它的返回状态会被忽略。

perl的
编译器
这个和perl语句本质上是一样的,但是每次执行的时候
运行规则,而不是在读取 makefile 时。 第一个变体是普通的 Perl
代码,而第二个变体首先通过 Make-style 变量传递语句
扩张。

对于放置身体支架的两种可能性,请参阅解释
makepp_statements 中的“perl_perlcode”。 请注意,那里解释了第三个变体
在这里没有任何意义,因为所有动作行都必须缩进。 你必须发出信号
Perl 语句中的失败,通过调用“die”。

每个规则 Perl 语句当前在一个公共子进程中进行评估,除了
视窗。 这意味着他们只能读取任何 makefile 变量。 也是
执行非 Perl 操作的进程。 所以调用 exec 或 exit 会混淆
马克普。 但这在未来可能会改变。 调用 Perl 的有效方法
脚本,请参阅上一项“&”或“运行”。

$(假版):
noecho perl {{ # $(target) & $(VERSION) 来自 Perl:
打印“这是“.f_target().” $VERSION\n";
}}
echo 您可以将其与 Shell 命令混合使用
-makeperl { 打印 "这是 $(target) $(VERSION)\n" }

有几种不同类型的规则,每一种都有不同的目的。

明确的 规则
目标 1 目标 2:依赖关系 1 依赖关系 2 ...
要执行的动作

此语法指定为了使 target1 or target2, 所有文件
依赖1, 依赖2等,一定已经做了。 那么给定的动作是
由 shell 执行以制作目标。

文件中的第一个显式规则是默认目标,如果您没有指定
命令行上的任何目标。

与传统的 make 程序不同,makepp 通常假设动作的一次调用
生成所有目标(除非没有依赖项)。 例如,一个调用
of yacc 为此规则创建两个输出文件:

y.tab.c y.tab.h : 解析器.y
$(YACC) -d 解析器.y

请注意,make 的其他实现没有单个命令的概念
生成多个输出文件,因此当您指定多个目标时,它们将
每个目标执行一次规则。 Makepp 将恢复到这种行为,如果它看起来像
这是一个旧式的makefile。 具体来说,它将为每个目标执行一次规则,
如果以下所有条件都为真,而不是仅仅一次:

· 规则动作提到了自动变量$@。 (同义词“$(output)”或
"$(target)" 不会触发此行为。)

· 规则动作未提及自动变量“$(outputs)”(或其同义词
“$(目标)”)。

· 这不是模式规则,也没有foreach 子句。

例如,

所有测试安装:
对于 $(SUBDIRS) 中的子目录; 做 cd $$subdir && $(MAKE) $@; 光盘..; 完毕

是 makefile 中的常用习惯用法,makepp 支持它。 (请注意,您永远不应该使用
在您编写的任何新生成文件中递归生成 - 使用“load_makefile”语句,或
而是隐式加载生成文件。)

如果您想为每个目标执行一次相同的规则(例如,因为目标
有类似的命令),最好使用模式规则(见下文)或
“foreach”子句。 例如,如果使用传统的 make 程序,您将编写:

A B C D:
do_something 来构建 $@ > $@

在 makepp 中,你可能想这样写:

$(foreach) :: foreach abcd
do_something 来构建 $(output) > $(output)

目标

A 目标 是一个永远不会实际存在于文件系统中的目标; 这只是一个
让 makepp 构建一些目标并可能执行一些额外命令的方法。

典型的虚假目标是“all”,通常用于导致所有可以
为建造而建造,像这样:

全部:prog1 prog2 subdir/prog3 subdir2/libmine.a
@&echo "全部完成!"

如果您键入“makepp all”,或者如果您将 all 作为第一个显式目标放在您的 makefile 中
(这是典型的)并只需键入“makepp”,然后它将导致所有依赖项
构建,然后它会打印“全部完成!”。 此时makepp会寻找文件 。/全部
并且会发现它不存在。 它会大声抱怨。

防止 makepp 期待文件 。/全部 要退出,你需要告诉它这是一个
虚假目标。 只需在您的 makefile 中添加如下一行即可(这没有区别
在哪里):

.PHONY:全部

有时更方便的等效替代方法是使用“$(phony)”
函数,像这样:

$(虚假全部):prog1 prog2 subdir/prog3 subdir2/libmine.a

一个 makefile 中的虚假目标可以引用另一个 makefile 中的虚假目标。 这是
通常使用“干净”目标完成,如下所示:

# 顶级生成文件:
# 这里有很多规则和东西
# ....
$(虚假清洁):subdir1/clean subdir2/clean
&rm -fm my_program

然后在子目录中,makefile 可能如下所示:

# 子目录下的Makefile
#...
$(虚假清洁):
&rm -fm $(通配符 *.o *.a)

但是现在你会使用“makeppclean”命令,而不是一个干净的目标。

通配符

在依赖项列表中指定通配符是安全的。 通配符不仅匹配文件
存在,但是可以根据 makefile 中的规则创建的文件。 例如,
要从目录中的所有 .o 文件构建一个库,你可以这样写:

libmine.a: *.o
&rm -f $(输出)
ar cr $(输出)$(输入)

即使尚未创建任何“.o”文件,这也将起作用,因为 makepp 的
通配符匹配尚不存在但可以构建的文件。 这甚至会捡起来
稍后发现其规则的文件(在同一个 makefile 中,或尚未读取的文件中)。 在这
最后一点它与“通配符”功能不同,后者仅限于已知规则,
因为它在展开时必须返回其结果。

Makepp 支持所有常用的 shell 通配符(“*”、“?”和“[]”)。 它还有一个
通配符“**”匹配任意数量的中间目录。 (这个想法被盗了
来自 zsh。)例如,“**/*.c”匹配所有 .c 整个源代码树中的文件。
"objects/**/*.o" 匹配所有 .o 包含在子目录中任意位置的文件 对象
或其任何子目录或其任何子目录。 “**”通配符不会
按照软链接到任何级别的目录。 它也永远不会返回虚假目标。

Makepp 的通配符将忽略存在但无法读取的文件或目录。 后
总之,这些文件无论如何都不能在构建过程中使用。 将无法读取的文件放入
目录主要用于禁止从一个给定的文件自动导入
库。

最初的断言是这是安全的。 这是因为它是否有效
文件已经存在,或者需要先构建。 然而,它在这个意义上是不安全的
它仍然会匹配由 makepp 构建的文件,但不再有规则(例如
您删除了 .c 文件,但 .o 文件仍然存在。)为防止这种情况,请使用
“--rm-stale”选项。

模式 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
模式规则是基于某种文本模式应用的规则。 这用于
对整类文件应用相同的规则。 语法与 GNU make 的相同
模式规则:

%.o: %.c
$(CC) -c $(输入) -o $(输出)

这表示当前目录中匹配“*.c”的任何文件都可以转换为
使用给定命令的相应 .o 文件。

请注意,可能会提供多个模式依赖项。 例如,如果您的 xyz.o 文件
取决于对应的 xyz.cpp文件 文件,还有一个名为 moc_xyz.cflags
包含编译器选项,这可以表示为:

%.o: %.cpp %.cflags
$(CXX) `cat $(stem).cflags` -c $(输入) -o $(输出)

您可能还有多个模式目标。 例如,

%.tab.h %.tab.c : %.y
yacc -d $(输入)
&mv y.tab.h $(stem).tab.h
&mv y.tab.c $(stem).tab.c

通常,模式规则只查找当前目录中的文件。 你可以强迫
他们通过设置在当前目录和它下面的所有目录中搜索

makepp_percent_subdirs := 1

例如,在您的 makefile 或命令行中的第一个模式规则之前。

"%" 和通配符 "*" 之间有明显的区别,尽管两者都匹配任何
字符串:通配符返回当时完全使用的文件列表。 所以
这取决于所有人 .o 可在此处构建的文件:

编:*.o
$(LD) $(LDFLAGS) $(输入) -o $(输出)

这无法通过将“*”替换为“%”来实现,因为后者是一对一的
输入与输出的匹配,在内部为每个匹配的词干生成一个规则。

静止 模式 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
静态模式规则是仅应用于有限文件集的模式规则:

$(SPECIAL_MODULES).o : %.o : %.cpp
$(CXX) -c $(输入) -o $(输出)

这表示模式规则仅适用于“$(SPECIAL_MODULES).o”中的文件。

这主要是为了与 GNU make 兼容; foreach 规则(见下文)是一个更多
做同样事情的强大方法。

佛瑞奇 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
上面的模式规则语法足够强大,可以支持几乎所有的构建,但是
有时需要做一些更复杂的事情。 Makepp 提供了更多
强大的语法:规则的“:foreach”子句。

target_expression :dependency_expression :foreach 文件列表
行动

最简单的一种 foreach 规则就是一个模式规则,它的应用受到限制
到特定的文件列表。 例如,假设您有一个模式规则,它告诉
makepp 如何编译所有 .c 文件。 但是,您有一个列表 .c 你的文件
想做一些不同的事情。 你可以这样做:

# 这是适用于所有事物的规则:
%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

%.o : %.c : foreach $(SPECIAL_MODULES)
$(CC) $(SPECIAL_CFLAGS) -c $(输入) -o $(输出)

foreach 规则的一个更强大的用途是利用变量
"$(foreach)" 依次设置为匹配文件列表和目标的每个文件,
依赖表达式被评估。 文件列表可能包含通配符,这些
甚至匹配尚不存在但可以构建的文件(参见“通配符”
makepp_规则)。

这是一个笨拙的语法,但它非常灵活,因为“$(foreach)”变量
可以以任何方式出现在表达式中。 首先,请注意模式规则实际上是一个
foreach 规则的特殊情况; 模式规则

%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

完全等同于:

$(patsubst %.c, %.o, $(foreach)) : $(foreach) : foreach *.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

(实际上,它已在内部转换为近似值。)

作为如何使用“:foreach”子句的示例,其中没有模式规则
足够了,假设你有一些 .c 使用某种预处理器构建的文件
它以输入文件作为输入文件 .k 延期。 你想编译那些 .c 带有一个
与通常不同的编译选项集 .c 普通源文件
文件。 你可以这样做:

# 普通 .c 文件的规则:
%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

# 从 .k 文件生成 .c 文件的规则:
%.c : %.k
$(预处理器)$(输入)> $(输出)

# 由 .k 文件构成的 .c 文件的特殊构建规则:
$(foreach:%.k=%.o) : $(foreach:%.c=%.k) : foreach *.k
$(CC) $(SPECIAL_CFLAGS) -c $(输入) -o $(输出)

(这使用稍微更简洁的替换引用语法,而不是调用
“patsubst”明确。)

请注意,如果您只想更改变量的值(此处为“CFLAGS”)
case) 有时使用特定于目标的变量更方便。

遗产 后缀 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
为了向后兼容,makepp 支持旧式的后缀规则。

.suffix1.suffix2:
行动

相当于

%.suffix2: %.suffix1
行动

但要记住要困难得多。 (哪个后缀先出现?)通常会出现一个规则
在像这样的遗留 makefile 中:

.co:
$(CC) $(CFLAGS) -c $*.c -o $*.o

这完全等同于

%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

冲突的 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。
当制作文件的方法不止一种时,makepp 使用一个简单的程序来
确定要使用的规则。

· 构建文件时存在冲突的显式规则是错误的。

· 带有通配符的模式规则和 foreach 规则永远不会覆盖显式规则。 因此
显式规则可用于指定模式规则的例外情况。 (注意简单地
使用 ":foreach" 子句不会使某事成为模式规则。 它必须有一个
通配符(如“*”或“?”)作为“:foreach”子句中文件名的一部分。 如果是
只是一个明确的文件列表,它被视为每个文件的明确规则
文件。)

· 当冲突的模式规则来自不同的 makefile 时,规则来自“nearer”
生成文件覆盖来自“更远”生成文件的规则。 “Nearer”表示makefile
位于更靠近目录层次结构中的目标(即
相对于运行 makefile 的目录的目标较短)。 如果这
不区分生成文件,然后规则与加载的生成文件
使用的是最新的。

这意味着您可以指定适用于您的所有文件的模式规则
整个目录树仅在顶级 makefile 中,但是您可以在其中覆盖它
一个较低级别的 makefile。 例如,您的顶级 makefile 可能包含:

%.o : %.c : foreach **/*.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

并且您可以在其中一个子目录中创建一个 makefile,其中显示:

%.o : %.c
$(CC) $(SPECIAL_CFLAGS) -c $(输入) -o $(输出)

· 推理链较短的模式规则优于其他模式
规则。 例如,如果您有以下规则(基于来自
Linux内核):

%.s: %.c
$(CC) -s $(输入) -o $(输出)

%.o: %.s
$(AS) $(输入) -o $(输出)

%.o: %.c
$(CC) -c $(输入) -o $(输出)

如果我们需要构建“xyz.o”,我们可以构建中间的“.s”文件,然后
使用前两条规则通过汇编程序运行它,或者我们可以直接转到
“.o”文件使用最后一条规则。 首选最后一条规则,因为数量较少
推理链中的步骤(一个而不是两个)。

· 生成文件中较晚的模式规则会覆盖较早的模式规则。 (这是
从 GNU make 向后。)这意味着你应该把你的更一般的规则
更早,更具体的规则稍后。 例如,

%.o: %.c # 一般编译规则。
行动

special_%.o: special_%.c # 带有
不同的动作#“special_”前缀。

选项
有时需要提供额外的选项来修改 makepp 如何执行
规则。 这些选项被指定为 ":optionname value",或者在包含
依赖项,或在下一行。

在单独的行上提供选项可能使您可以使用相同的选项
带有 makepp 和传统 make 的 makefile。 例如,

目标:依赖
: 签名 target_newer
行动

将与传统的 Unix make 一起工作,因为它解释了“:签名”行
作为 shell 命令,以冒号开头的命令什么也不做。

:构建缓存 /路径/到/构建/缓存
目标:依赖
: build_cache /put/cache/files/over/there
行动

指定要用于此规则生成的文件的构建缓存的路径。 这个
覆盖“build_cache”语句或“--build-cache”命令的效果
此规则的行选项(如果有)。 有关构建的详细信息,请参阅 makepp_build_cache
缓存。

如果指定“none”而不是路径,则为此禁用构建缓存
特定规则。 这可用于避免在您的文件上浪费磁盘空间
知道对缓存没有用,或者因为您非常确定它们永远不会
重用或者因为它们构建得太快以至于不值得缓存它们。

:构建_检查 构建检查方法
目标:依赖
: build_check target_newer
行动

这告诉 makepp 使用什么算法来决定是否需要重建目标。
有关更多详细信息,请参阅 makepp_build_check。 这覆盖了
“build_check”语句或“--build-check-method”命令行选项(如果有),用于
这个规则。

:环境 变量 ...
添加对命名环境变量值的依赖。 如果其中任何一个
与之前的构建不同,则目标被认为是过时的,如果
build_check 方法如此规定。 (所有内置的构建检查方法,除了
target_newer 尊重这一点。)

VARIABLE 的形式可能是“PATH_VARIABLE 中的文件名”(在引号中),在这种情况下
如果来自冒号分隔的第一个目录,则目标被视为已过期
存在文件名的 PATH_VARIABLE 值与上次构建不同。
这可用于避免在 PATH_VARIABLE 更改时重建目标
无关的方式。

:派遣 命令 ...
将每个 shell 操作(但不是 Perl 操作或 Perl 命令)包含在“sh -c '...'”中
并以命令为前缀,但假设目标不依赖于命令。
如果您想将操作发送到作业排队系统,这很有用,但结果是
假设独立于排队参数,以及排队是否
系统完全使用。

:包括 文件或模式
规则因编译器而异:

%.o : %.c
: 包括 %.d : 签名 C
gcc -MD -c ...

%.o : %.c
: include %.u : 签名 C# IBM 使用不同的后缀
xlc -M -c ...

subdependify { # 把微软的闲聊变成有用的格式
s/\$/\$\$/克;
s/(注意:包括文件:*)?(.+?)\r?\n/$1 ? "'$2' ": "'".f_output()."': "/e;
}
%.o : %.c
: 包括 %.d : 签名 C
cl -showIncludes -c ... >$(stem).d
&sed &dependify -o +<$(stem).d

一些编译器(Intel 的 icc 就像上面的 gcc,或者 IBM 的 xlc)可以产生依赖
动态文件。 也就是说,当他们编译时,他们会编写一个 makefile ,makepp 可以
包括。 比makepp的扫描仪的优点是保证100%
正确,我们可能只会接近。

此选项以特殊方式利用:如果文件不存在,即
通常在第一次构建时,会进行正常扫描。 但如果文件存在,则不
扫描发生(这就是我们在上面指定智能签名的原因——而不是扫描瀑布
回到时间戳和大小的愚蠢默认值)。 相反,它包含文件,之前
执行规则。 成功执行规则后,它忘记了它
考虑到文件可能已过时,请第一次阅读。 相反它读
再次使用该文件(如果更改),以获得最新的构建信息。

警告:这本质上是不可靠的。 依赖文件由非常
它是一个依赖项的规则。 另一方面,编译器知道所有
它是内部子包含,makepp 通常会忽略它。 这是一个可靠性
仅适用于编译器补丁仅修复子包含的情况。 这
代价是 makepp 最终会查看更多文件,这需要时间。

删除“#include”语句时有一个问题 对应的文件:
它仍然会在上次的依赖文件中提到,当时它是
需要。 在这种情况下,您必须编辑依赖文件以删除依赖
这不再是可实现的。

此功能不能与构建缓存一起使用,因为从那里获取文件
需要了解有关文件的所有信息。 但是依赖文件依赖于那些
makepp 通过阅读了解文件。 这种循环依赖通常不是
在可靠的构建系统中是可能的。 这是一个例外,因为在重建之后
并重新阅读依赖文件一切都再次正确。

如果您在存储库中构建,makepp 将从
第一个存储库,其中包含一个。 这与其他文件不同,它需要第一个
带有预期的签名。 这比构建缓存更好,因为缺少
签名,它甚至找不到文件。

:最后的机会
启用开放式规则,例如

%.foo foo%.bar::last_chance
&echo $@ -o $@
&cp $(输出)

因为像这样的规则可以产生无限数量的目标,
此规则的目标将不匹配 $(wildcard) 函数或模式规则,除非
其他东西已经通过具体引用目标来实例化规则。
此外,如果指定了“--rm-stale”,那么从前一个遗留下来的目标
如果构建它的唯一方法是通过 last_chance 规则,makepp run 将显得陈旧
尚未为目标实例化,这是一种理想的行为,因为
当构建错误地依赖通配符时,它会更一致地失败
匹配上一次运行的目标。

":last_chance" 选项旨在提醒人们注意
关于匹配通配符的规则。

:解析器 解析器
这告诉 makepp 如何解析用于检测(包含)文件的命令。 通常,
makepp 根据命令本身中的字词猜测如何执行此操作(请参阅
makepp_scanning 了解详情)。 但是,如果 makepp 猜错了,您可能想要
明确指出解析器,如下所示:

%.o: %.abc
: 解析器 c_compilation
在这里行动

这会导致 makepp 执行与 C/C++ 相同的解析和扫描
构建命令,即使它不将该操作识别为 C 编译。

默认解析器取决于命令。 如果你没有指定 ":parser" 选项,
然后检查每个命令的第一个单词。 例如对于编译或链接
命令,makepp 将使用“c_compilation”解析器; 或者如果命令看起来像
GNU 变体,“gcc_compilation”。 如果未找到解析器,则使用“none”解析器。 为了
有关此的更多详细信息,或者如果您想编写自己的解析器或更改 makepp 的
默认解析器,请参阅 makepp_scanning。

请注意,这适用于规则中的每个命令,这可能不是您想要的:

%.o: %.c : 解析器 c 编译
@echo '构建 $(output)'
@有趣的_cc ...

这也会将“echo”解释为编译器并推导出它的参数“Building
mymodule.o' 作为隐式依赖。 这将导致投诉
不知道如何构建这样的文件。 在这种情况下,您最好使用
“注册解析器”。 在那里你会找到一个解释 解析器 可以作为
类名或作为函数名。

:签名 签名方法
目标:依赖
: 签名 md5
行动

这会告诉 makepp 使用什么算法来确定依赖项是否已更改。
有关更多详细信息,请参阅 makepp_signatures。 随附的签名方法
makepp 发行版是“plain”、“md5”、“C”或“c_compilation_md5”,以及
“共享对象”。 这将覆盖使用“-m”或
“--signature-method”命令行选项,或与“signature”语句一起使用。

Special 字符
Makepp 可以支持包含特殊字符(如冒号或空格)的文件名。
例如,假设您想从文件“b:thing”创建一个名为“a:thing”的文件。
你不能这样写规则:

a:thing : b:thing # 这是一个语法错误
&cat $(输入) -o $(输出)

因为 makepp 不知道哪些冒号将目标与依赖项分开,哪些是
文件名的一部分。 相反,只需将名称括在引号中,如下所示:

"a:东西" : "b:东西"
&cat $(输入) -o $(输出)

现在规则是明确的。

Makepp 的引用语法与 shell 的非常相似。 例如,您可以使用单个
引号而不是双引号,或者您可以使用反斜杠转义特殊字符:

a\:东西 : 'b:东西'
&cat $(输入) -o $(输出)

例如,假设您的文件名是 "'"!;\$"。现在为什么您想要这样的文件名
我不知道,但您可以通过以下几种方式将其指定给 makepp(和 shell):

\''"!;\$$'
"'\"!;\\$$"

请注意 makepp 何时剥离引号以及 shell 何时剥离。 马克普看着
仅在以下情况下引用:

· 在“ifeq”系列测试中

· 规则冒号前后

· 在 makepp 内置命令中

· 在与文件有关的函数中

与 shell 不同,makepp 在将引号分配给变量时不会扩展引号。 因此
以下规则相同:

FILE = '带空格的名称'
x := $(print $(FILE)) # 只是为了检查引号是否仍然存在
$(FILE): # makepp 删除的单个文件周围的引号
&echo hello -o$(FILE) # makepp 删除的单个文件周围的引号
echo there >>$(FILE) # Shell 剥离的单个文件周围的引号
'带空格的名称':
&echo hello -o'带空格的名字'
echo there >>'$(output)' # 上面的引号被去掉了,再次添加

请注意(与 Shell 不同)以“$”开头的变量即使在单个内部也被扩展
引号。 美元符号不受引号或反斜杠的保护。 得到一个字面量
美元符号,使用双美元符号,例如,

$(全部都是假的):
@&echo 这是一个美元符号:$$
@for abcd 中的 val; 做回声 $$val; 完毕

通常,您应该能够通过引用来处理任何特殊字符
某种程度上来说。 这包括空格、控制字符等。但是,请注意,在
目前,makepp 的注释剥离有点简单,任何“#”字符
前面有空格将被解释​​为注释,无论它们如何引用。

当一个目标或依赖名被放入一个像“$(output)”这样的自动变量中时,那么
引号和任何反斜杠都被删除了。 这意味着如果你想引用
操作中的文件名,您可能需要再次引用它,如下所示:

“带空格的文件名”:
echo "特殊内容" > "$@"

如果你不把引号放在 $@ 周围,那么 shell 会看到命令

echo "特殊内容" > 带空格的文件名

它将字符串“带空格的特殊内容文件名”写入名为 a.
这可能不是你想要的。

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


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad