英语法语西班牙语

Ad


OnWorks 网站图标

makepp_variables - 云端在线

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

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

程序:

您的姓名


makepp_variables -- 如何在makepp中使用变量

商品描述


?: $*,
$+,
$/,
$<,
$?,
$@,
$^,
=,
!=,
&=,
+=,
:=,
;=,
?=, A: 增强现实,
护旗,
作为, C: 抄送,
CFLAGS,
"changed_dependencies",
改变的输入,
库迪尔,
CXX,
CXX标志, D: “依赖”,
“依赖”, F: F77,
足球俱乐部,
"foreach", I: 输入,
投入, L: ,
莱克斯,
工具, M: 制作,
制定目标,
标志,
制作信息,
MAKEPP_DEBUG,
MAKEPPFLAGS,
_MAKEPPFLAGS,
MAKEPP_LN_CP,
"makepp_percent_subdirs",
"makepp_require_phony",
makepp_signature_C_flat,
"makepp_simple_concatenation",
MAKEPP_VERSION, O: “输出”,
“输出”, P: 珀尔,
残疾人, R: R M,
根, S: 贝壳,
"sorted_dependencies",
sorted_inputs,
“干”, T: 目标,
目标, V: 路径, Y: 亚克力

Makefile 通常在许多地方使用变量。 使用的重要原因之一
variables 是为了确保信息只包含在 makefile 中的一个地方,所以
如果它发生变化,则不会有信息的两个副本丢失的危险
同步。

变量名区分大小写。 理论上,变量名可以由许多
字符,但是如果您执行任何操作,makepp 可能无法理解它
字母数字字符、“_”和“-”。

每个 makefile 都有自己的一组变量,在一个 makefile 中设置一个变量会
对其在任何其他 makefile 中的值没有影响。 如果你想设置变量
许多makefile,最好的方法是让它们中的每一个都包含一个共同的定义
文件(请参阅包含语句)或使用“全局”变量。

变量 转让
变量可以通过几种不同的方式取值:

· 可以在makefile 中设置变量。 有许多不同的方法可以做到
这个; 见下文。

· 一个变量的值可以在命令行中指定,像这样:

makepp CFLAGS=-O2 my_program

如果加载了多个 makefile,则 CFLAGS 变量将传播到所有
生成文件。 在命令行上设置的变量会自动覆盖
任何生成文件中的变量。

如果需要,makefile 必须依次显式覆盖命令行设置。
目的不是忽略用户请求的内容,而是一种修改它的方法。
“覆盖”修饰符可以在任何赋值语句之前。 但是在这种情况下
关键字语句,顺序很重要,这就是覆盖变体的原因
始终显示在下方。 “覆盖”修饰符仅适用于任何赋值
存在,并且不影响以后对变量的赋值。

· 如果在环境中设置了变量,则可以将其作为makepp 变量进行引用。
通常对 makefile 中的变量赋值会覆盖来自
环境,但您可以使用“-e”或“--environment-overrides”来更改它
命令行选项。

变量被赋值为几个赋值表达式之一,像这样

X = 1
模块:= abcd
抄送?= gcc
CFLAGS += -墙
定义VAR
第 1 行
第 2 行
结束定义
导出路径 := $(PWD):$(PATH)
全局 MYPROJECT.INFO = 要在所有 makefile 中看到的信息

值周围的前导和尾随空格总是被剥离。

不同的赋值运算符有一些不同的含义。

简易 分配 运营商

=
变量 = 文本字符串
覆盖变量 = 文本字符串

这是所有 make 实现都支持的常用赋值语句。 这
直到 "$(VARIABLE)" 的值为
实际在某处使用。 因此,如果您执行以下操作:

X = 1
Y = $(X)
X = 2

然后生成文件中稍后的“$(Y)”将评估为“2”。

通常,您通常希望使用“:=”(见下文)而不是“=”,因为它
提供更可预测的变量评估。 但是,有时您需要
推迟变量评估。 另外,如果您正在编写一个必须是
与 GNU make 以外的某些版本的 make 向后兼容,那么你就没有
选择:您只能使用“=”。

:=
变量 := 表达式
覆盖变量:= expr

这与“VARIABLE = expr”相同,只是评估右侧
在分配时一劳永逸。 因此如果

X:= 1
Y := $(X)
X:= 2

然后在makefile后面的“$(Y)”将评估为“1”,因为这就是“$(X)”
当“$(Y)”被定义时。

;=
变量 ;= 表达式
覆盖变量 ;= expr

这与 "VARIABLE := expr" 相同,除了评估右侧
只有在第一次使用的时候,然后才记住。 这对于昂贵的
命令,它们总是返回相同的值,但你不想在什么时候执行
构建不相关的目标:

VAR1 ;= $(perl 昂贵的计算)
VAR2 ;= $(shell 外部命令)

请注意,旧的 makefile 在这里通常会使用“:=”,至少只执行一次。
但是有了这个运营商,你甚至可以不这样做,如果你目前不这样做
需要价值。 对于多个目录中相同的值,您可以
使用下面讨论的“全局”进一步优化它。

然而,这并不是强制执行评估顺序的巧妙方法。 如果一个
像这样定义的变量包括另一个变量的值,而另一个变量的值
有一个目标特定的值,第一个扩展是针对那个目标,然后
目标特定值也将适用于所有其他上下文。 这是一个错误和
有望在未来得到修复。

+=
变量 += 表达式
覆盖变量 += expr

将字符串附加到变量的先前内容中,以空格分隔。 如果
变量之前被赋值为“:=”,然后评估右侧
在追加之前。

&=
变量 &= 表达式
覆盖变量 &= expr

将字符串置于变量的先前内容之前,以空格分隔。
如果变量之前用“:=”赋值,那么右边是
在追加之前评估。

例如,保证“CFLAGS”的一种方法,无论用户可能输入什么,
总是以“-Wall”开头的是这两行:

CFLAGS = -O2 # 可能在命令行中被覆盖
覆盖 CFLAGS &= -Wall # 无条件前置

在旧的 makefile 中,你通常必须做这样的事情,它有一面
强制类型为“:=”以防止无限递归的效果:

变量 := expr $(变量)

?=
变量 ?= expr
override VARIABLE ?= expr # 无用,但合法

设置变量的值,但前提是变量没有在前面指定
makefile,在命令行上,或在环境中。 上面的赋值是
完全等同于

ifndef 变量
变量 = 表达式
ENDIF

!=
VARIABLE != shell 命令
覆盖 VARIABLE != shell 命令

运行 shell 命令并将变量设置为包含命令的标准输出。
这完全等同于

变量 := $(shell 命令)

多线 变量

“define”语句是上述简单语句的多行等效语句。 这
变量后的运算符是可选的。 如果缺失,则相当于“define VARIABLE
="。"&=" 和 "+=" 运算符在这里略有不同,因为它们将其粘合到
带有换行符而不是空格的旧值。 除了一个
语句后的注释,即值从下一行开始。

定义变量:=
变量值的第一行
变量值的第二行
变量值的第三行
恩德夫

覆盖定义变量
...
结束定义

“define”之前的关键字可以是“export”或“global”之一的组合,
“覆盖”。

如果你需要一个变量的值来包含换行符,你必须使用“define”语句作为
显示(或者您可以直接在 Perl 中分配值)。 (“endef”被选为
与 GNU make 的兼容性。 您也可以使用“enddef”。)这主要用于
“固定命令序列”,例如,像这样:

定义 COMPILE_C_PROGRAM
@&echo "编译 $(input)"
@$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c $(输入) -o $(输出)
恩德夫

然后你可以在几个规则中使用这个多行变量,如下所示:

%.o : %.c
$(编译_C_程序)

$(ARCH)/%.o : $(ARCH)/%.c
$(编译_C_程序)

请注意,您通常可以通过使用分号而不是换行符来达到相同的效果,
因为 shell 也将其解释为命令分隔符。 例如,

COMPILE_C_PROGRAM = @echo "编译 $(input)"; \
$(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) -c $(输入) -o $(输出)

将具有相同的效果,除了分号强制 Perl 将其传递给 shell,
而不是直接更高效地执行命令。 你还必须把每个
内置在自己的一行中,这意味着您必须切换到外部回声
分号情况。

在“define”中扩展时有一个特点,即“define X :=”或在
已经是 ":=", "define X &=" 和 "define X +=" 的变量。 在这种情况下
"$(shell command ...)" 或内置的 "$(&command ...)" 不会将换行符转换为
空格。

导出 变量 子流程

导出 VAR ...
出口 VAR = 价值
覆盖导出 VAR += 值

第一种形式标记给定的变量以导出到子流程,具有任何值
变量然后有。 第二种形式,仅适用于一个变量,另外
立即赋值。 允许所有的赋值变体。

共享 变量 横过 生成文件

全球 VAR ...
全局 VAR = 值
覆盖全局 VAR &= 值

第一种形式将给定的变量标记为所有 makefile 的全局变量。 如果其中任何一个
已经有一个值,该值从 makefile 局部变量移动到全局变量
一。 但是,如果在看到此语句时,任何其他 makefile 已经具有
它们中的任何一个的值,那么这些 makefile 将不会看到全局的。

第二种形式,仅适用于一个变量,另外赋值一个值
离开。 允许所有的赋值变体。 请注意,“:=”会立即展开
到本地 makefile 中的值。 相反,“=”变量会扩展到
使用时的值。

全局变量可能很难处理,因为 makepp 可能会以任何方式加载 makefile
顺序,因为需要构建一些没有加载规则或生成文件的目标。
出于这个原因,建议有一个 根Makepp文件 并显式加载所有
其他修改或使用带有“load-makefile”的变量。

全局 GLIBLIBS ;= $(shell pkg-config --libs glib-2.0)

另请注意,您的项目可能有一天会与其他项目一起构建。 为了这
建议始终将项目名称作为任何全局变量名称的一部分的原因。

特定目标 任务

目标:变量 = 字符串
目标:变量:=字符串
目标:覆盖 VARIABLE += 字符串

设置变量的特定于目标的值。 特定于目标的值有效 仅由
在产生给定目标的动作中。 这主要用于诸如
这个:

CFLAGS := -O2

my_prog: file1.o file2.ospecial_file.o

Special_file.o : CFLAGS := -g

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

这里发生的是所有“.c”文件都将使用优化(“-O2”)进行编译
“special_file.c”,在调试模式下编译(“-g”)。 这是一种方便的方式
仅为少数文件指定不同的编译选项。

像这样的特定于目标的变量赋值仅适用于规则的操作; 他们
在评估目标或规则的依赖项时无效。 如果一个规则
有多个目标,特定于目标的变量赋值仅取自
第一 目标。 还要注意 makepp 的 target-specific 变量略有不同
来自 GNU make,因为它们仅适用于提到的一个文件的规则,而不适用于
它的任何前身。

在目标上执行通配符扩展,因此您可以执行以下操作:

test_*.o : CFLAGS += -DTEST

为了与 GNU make 兼容,可以使用“%”代替“*”。

变量 换人
Makepp 的变量替换规则与其他 make 的规则相似,但有些
更有力。 与所有品牌一样,“$(CC)”或“${CC}”都代表
可变CC。 如果您需要文字美元符号,请输入双美元符号 ($$),例如
这个:

目标:dep1 dep2 dep3 dep4
&rm -f $(输出)
对于 $(inputs) 中的文件; do cat $$file >> $(output); 完毕

此外,makepp 有一个“$[VARIABLE]”语法,它与另一个语法相同
两个,但在 makepp 理解其他任何东西之前。 这允许将其用于完整规则
和/或条件:

定义括号规则 =
ifdef SOME_VAR
括号:
&echo 这是一条规则 -o $(output)
ENDIF
结束定义

$[括号规则]

rc风格 代换

默认情况下,makepp 使用 rc-style 替换(之所以这么称呼是因为它是由
rc 外壳)。 最好通过一个例子来说明这一点:

模块 = abcd

mylib.a : 模块目录/$(MODULES).o $(OTHER_OBJECTS)
$(CXX) $(依赖) -o $(目标)

MODULES 中的每个单词都加上前缀“module_dir/”,后缀“.o”是
附加到每个单词。

您还可以使用 rc 样式替换,甚至无需将单词列表放入
多变的; 语法是“$(word1 word2)”。 注意括号和括号之间的空格
第一个字。 所以上面的例子可以写成:

mylib.a : module_dir/$(abcd).o $(OTHER_OBJECTS)
$(CXX) $(依赖) -o $(目标)

一个变量只有在有多个单词时才会给出 rc 风格的替换。
一言以蔽之,就像传统制造。 唉,当变量为空时,有一个
冲突。 传统使简单地将其扩展为空字符串。 但是当你想到
它作为一个列表,你希望“-I$(DIRLIST)”消失,而不是给一个孤独的“-I”。 这
解决方案是将它包装成一个以空格开头的列表:“-I$( $(DIRLIST))”给你
与列表中的单词一样多的选项。

如果将多个变量放在同一个单词中,这些变量会扩展为单词数组,rc-style
替换实际上采用笛卡尔积,所以你可以做这样的事情,如果
你要:

目录 = s1 s2
模块 = abc
后缀 = .o .c
文件 := $(DIRS)/$(MODULES)$(后缀)

和 FILES 将包含字符串

s1/ao s1/ac s1/bo s1/bc s1/co s1/cc s2/ao s2/ac s2/bo s2/bc s2/co s2/cc

除了空格之外,rc 样式的替换停止在任何引用处,任何圆形、卷曲或方形
括号,以及“, : ; = # @”中的任何一个。 请注意,这可能会令人惊讶,并且再次需要
一个明确的清单。 假设您想在所有目录中通过通配符查找标题
以大写字母开头:

坏 := [AZ]*/**/*.$( hpp h) # [AZ]*/**/*.hpp */**/*.h
好的 := $( [AZ]*/**/*.)$( hpp h) # [AZ]*/**/*.hpp [AZ]*/**/*.h

如果 rc 样式替换妨碍了,或者如果您需要有前导或尾随
make 变量中的空格,然后您可以通过设置关闭 rc 样式替换
变量“makepp_simple_concatenation=1”。 您可以在命令中全局关闭它
行或作为环境变量。 或者在每个makefile的基础上通过在
你的生成文件。 您应该在 makefile 顶部附近执行此操作,否则您可能会遇到
rc 样式替换用于某些评估而不是其他评估的有趣情况。
(在赋值之前计算的所有表达式都将使用 rc 样式替换,并且所有
之后评估的表达式将不会。 由于表达式的评估时间
makefiles 很复杂,而且从语句的顺序来看并不总是很明显
makefile,最好尽早设置“makepp_simple_concatenation”。)你可以
甚至只为一个目标设置它:

目标:makepp_simple_concatenation = 1
目标:
&echo before_first$(LIST)after_last -o $(output)

因为 "$[VARIABLE]" 的计算早于 "$(VARIABLE)",所以在 rc-
替换不会给出您可能期望的结果,除非您将它包装在一个显式
列表:

A = ab
N = 1 2
坏 := $(A)$[N]
好 := $(A)$( $[N])

最后几行读作

坏 := $(A)1 2 # a1 b1 2
好 := $(A)$( 1 2) # a1 a2 b1 b2

换人 参考资料

替换引用的形式为“$(VAR:A=B)”,其中 A 是要匹配的模式,B 是
替换它的模式。 替代参考是
“patsubst”功能。 例如:

source_files = ac bc cc dc
object_files = $(source_files:%.c=%.o)

将“$(object_files)”设置为“ao bo co do”。 “%”是特殊字符匹配
任意字符串。 如果A和B都以“%”开头,替换时的常见情况
后缀,它们可以省略:

object_files = $(source_files:.c=.o)
object_files = $(source_files:c=o) # 相同,因为 . 并不特别

空格 in 变量

如果您需要控制变量中的空格,则必须(当前)禁用 rc-style
替换(通过设置“makepp_simple_concatenation=1”),然后使用这样的语法:

空 =
T = -o $(空)

或者,使用空评估:

T = -o $()

执行此操作时,变量“T”包含后跟一个空格的“-o”。

不推荐使用这种处理空格的技术。 如果你需要变量
在你的 makefile 中包含空格,你应该认真考虑你在做什么。
如果您需要处理空格,通常最好将 Perl 代码放入您的
makefile 来处理它(使用“perl_begin”或“sub”语句),或处理它
在 shell 语句中的动作规则。

当人们试图对不同的人使用相同的规则时,通常会出现这些情况。
不使用典型 Unix 命令语法的体系结构。 例如,有时人们看到
makefile 中的类似内容:

ifeq ($(ARCH),weirdarch)
O := /输出=
其他
空:=
O := -o $(空)
ENDIF

%.o : %.c
$(编译器) $(输入) $(O)$(输出)

如果您真的想这样做,您可以使用 makepp 执行此操作,但是您可能会发现您的
如果您的变量不那么复杂,makefile 的可读性会大大提高
替代,例如,

ifeq ($(ARCH),weirdarch)
%.o : %.c
$(WEIRD_COMPILER) $(输入) /OUTPUT=$(输出)
其他
%.o : %.c
$(CC) -c $(输入) -o $(输出)
ENDIF

变量名中不允许有空格,只允许在它们的值中。 这是不同的
来自一些 make 实现。

自动表 变量
自动变量是根据规则取不同值的变量
它们在其中进行评估。 Makepp 支持大多数其他自动变量
使用的版本。 此外,对于其中的大多数,它的名称不那么神秘,更长
你可以用它来代替。 (对于碰巧重新定义这些名称的遗留 makefile,
makefile 中的定义会覆盖默认含义。 例如,如果你说
makefile 中的“target = abc”,那么“$(target)”将始终扩展为“abc”,并且不会
不再等同于 $@。)

以下是 makepp 支持的所有自动变量的完整列表:

产量
目标
$@ 当前规则的目标。 实际上,由于 makepp 支持多个目标
任何规则,这是 第一 目标。 例如,在以下规则中

y.tab.c y.tab.h : 解析器.y
$(YACC) -o $(输出) $(YFLAGS) $(输入)

"$(output)" 将包含值 y.tab.c. 由于这些魔法变量实际上是
函数,您还可以将索引作为参数传递。 这从 1 或向后计数
从-1。 所以 "$(output 2)" 或 "$(output -1)" 将包含值 y.tab.h.

虽然此变量的所有三种形式都具有相同的值,但在
多目标规则的解释。 如果您使用旧式神秘名称 $@,
makepp 会将其解释为旧式规则集,而不是现代规则
一口气生成所有这些目标:

ab:# 真的:a 和 b 各有一个规则
触摸 $@

cd: # error: mpp 抱怨这没有构建 d
触摸 $(输出)

输出
目标
当前规则的所有目标。 与 "$(target)" 相同,除非有多个
目标。 在上面的例子中,“$(outputs)”将是 y.tab.c y.tab.h。 你可以通过一个
索引列表,所以“$(输出 2 1)”将是 y.tab.h y.tab.c。

依赖
输入
$< 规则的第一个显式依赖项。 例如,在这个规则中

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

"$(input)" 将是 .c 文件,不管 .h 文件makepp
发现。 如果您指定多个依赖项,您可以通过传递一个
索引:“$(input $(INDEX))”是第 INDEX 个依赖项。

依赖
输入
$^ 目标的所有显式依赖,不包括 .h 发现的文件
makepp_scanning 用于包含。

例如,在规则

我的程序.o : *.o
$(CC) $(CFLAGS) $(输入) -o $(输出)

"$(inputs)" 将是目录中的所有 .o 文件。 你只能选择那些你
想要通过传递索引列表。 如果您明确指定不同类型的文件,
你可以在“$(inputs 2 3 4)”中选择它们(但使用通配符这不是太
有希望)。

排序依赖项
排序输入
$+ 目标的所有依赖项,按排序顺序,删除重复项。
相当于“$(sort $(inputs))”。

改变的依赖关系
改变的输入
$? 已更改的目标的依赖项。 这仅包括明确的
依赖项(即您在 makefile 中列出的那些),未隐式发现
扫描的依赖项(例如 .h 文件)。

这通常用于这样的命令:

libmine.a : $(MODULES) : build_check 忽略_action
$(AR) 你 $@ $?

ar 被告知只替换那些已更改的模块。 (注意
“ignore_action”构建检查规则。 如果您不指定此项,makepp 将强制执行
每当它改变时要执行的动作。 如果没有依赖项发生变化,则
动作字符串将是“ar ru libmine.a”,这可能与原来的不同
上次运行它时,如果没有“ignore_action”,makepp 将执行它。 在这
在这种情况下,它是无害的,但是对于其他命令,它可能是一个问题。 看
makepp_build_check 有关“ignore_action”的详细信息。)

像这样构建档案不是一个好主意,因为它会使你的构建更少
可靠的。 问题在于,如果您构建存档,则删除其中之一
MODULES 列表中的模块,这些模块仍将在存档中,并且
制造商


$* 模式规则中的词干(即,任何匹配的 '%')。 或者,如果这
不是模式规则,返回没有扩展名的文件名(即,它是
相当于“$(basename $(input))”。

这主要是为了向后兼容。 例如,在旧版本的 make
告诉它如何编译任何的唯一方法 .c 文件到相应的 .o 文件就像
这个:

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

这是编写规则的糟糕方法。 使用 GNU-make 风格更清晰
模式规则,像这样:

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

的foreach
“foreach”子句中的当前文件名。 “foreach”子句很少使用,
但它们是 makepp 支持的最通用的一种模式规则。 为了
例,

#
# 使用某种特殊的预处理器构建 .c 文件:
#
%.c : %.k
$(预处理器)$(输入)> $(输出)

#
# 将 .c 文件编译为 .o 文件:
#
%.o : %.c
$(CC) $(CFLAGS) -c $(输入) -o $(输出)

#
# 派生的 .c 文件的特殊备用编译标志
# 来自 .k 文件:
#
$(foreach:%.k=%.o) : $(foreach:%.k=%.c) : foreach *.k
$(CC) $(SPECIAL_K_FLAGS) -c $(输入) -o $(输出)

有关更多详细信息和示例,请参阅关于规则中 foreach 子句的文档。

$/ 这本质上是一个常量,要么是“/”,要么是原生 Windows 上的“\”。 你需要它,如果
您想以可移植的方式启动一个程序,例如您在当前目录中构建的程序:

我的输出:
.$/myprog >$(输出)

对于作为参数传递的文件名,它不是必需的,因为 Windows 可以处理 Unix
那里的语法。

附加选项 变量
您可以通过上述所有方式设置这些(除非另有说明)进行修改
makepp 的行为。 默认情况下,它们都是未定义的。

MAKEPP_DEBUG
如果你在调用 makepp 之前用真值导出它,你会得到更多的调试
信息。 这是在以下情况下生效时构建的文件的“RULE_SOURCE”
makeppinfo、mppi 以及有关下的变量扩展和规则匹配的详细信息
makepplog, mppl. 这还将显示 makepp 是否耗尽内存或挂起,
因为它无休止地扩展相同的变量:

A = $A # 延迟评估,需要 :=
B=$C
C=$B

MAKEPP_LN_CP
请参阅 &ln 下的注释。

makepp_percent_subdirs
将此设置为某个真实值(如 1)以使目标或依赖项中的“%”匹配
跨越多个目录。

makepp_require_phony
将此设置为某个真值(如 1)以防止隐式虚假(即,如果规则
成功而不产生目标)。 默认情况下,此变量应为 true,以
防止损坏的依赖链,但这会破坏与
草率的makefile。

makepp_signature_C_flat
这是签名 C 的一个选项。将其设置为某个真实值(如 1)以对待您的
源为扁平化,即所有换行符(预处理器语句除外)都是
像空格一样对待,“#line”指令被忽略。

makepp_simple_concatenation
将其设置为某个真实值(如 1)以防止“rc 样式替换”。

PERL
您可以将其设置为用于在 makepp 中运行脚本的确切 perl
套件,并导出它。 这有助于使用相同的 perl 运行子脚本。 这是
主要用于测试套件、安装和递归构建。

路径
将此变量设置为某个值会隐式调用“vpath % value”。

预定义 变量
Makepp 预定义了一些您可以覆盖的变量:

AR 默认: “阿”。

标志
默认: “房车”。

AS 默认: “作为”。

CC 默认: 第一个在 "gcc"、"egcc"、"pgcc"、"c89" 或 "cc" 中找到,或在 Windows 上
另外“cl”或“bcc32”。

标志
默认: 如果 "$(CC)" 是 GNU 编译器 "-g -Wall",如果它是两个 Windows 之一
编译器什么都没有,否则“-g”。

库迪尔
当前 Makefile 所在的目录。

CXX 默认: 第一个在 "g++"、"c++"、"pg++"、"cxx"、"C"、"C" 或 "aCC" 中找到,或
Windows 还添加了“cl”或“bcc32”。

CXX标志
默认: 如果“$(CXX)”是GNU编译器“-g -Wall”,如果它是两个Windows之一
编译器什么都没有,否则“-g”。

F77 默认: 第一个在“f77”、“g77”或“fort77”中找到。

FC 默认: “$(F77)”。

LD 默认: “ld”。

LEX 默认: 第一个在“lex”或“flex”中找到。

工具
默认: “库工具”。

MAKE
这个变量有两个不同的值,取决于是否存在
“--traditional-recursive-make”。 Makepp 识别何时使用此变量并
关闭某些功能,甚至在递归实际发生之前。 这可以
在您逐渐消除它时不受欢迎,因此首先将调用转换为
makepp 特定的“$((MAKE))”,它不会关闭功能。 你不应该设置它
因为这打破了我们的智能递归工作。

制定目标
此变量已设置但未由 makepp 使用。 只有在以下情况下,您才能查询它以执行某些操作
请求了某个目标。

默认: 提供的任何显式目标用户(或递归调用)。
隐式构建默认目标时为空。

ifneq $(过滤特殊目标,$(MAKECMDGOALS))
# special-target 是当前显式目标之一
否则 ifeq $(MAKECMDGOALS)
# 没有明确的目标
ENDIF

MAKEFLAGS(出口)
调用 makepp 的标准选项。 那些只有一个字母的
形式在开头组合,没有前导“-”(天知道为什么 gmake 选择了
去掉“-”)。

制作信息
默认: “制作信息”。

MAKEPPFLAGS(出口)
这被设置为与 MAKEFLAGS 相同的值,但前提是该变量存在于
makepp 的环境。

_MAKEPPFLAGS(导出)
POSIX/gmake 兼容性所需的 makepp 特定选项,与 makepp
被称为。 它们位于一个单独的变量中,因此遗留的 makefile 不会被破坏
通过取消设置 MAKEFLAGS 来实现兼容性。 这仅设置为
“--traditional-recursive-make”。

MAKEPP_VERSION 版本
您正在运行的 makepp 版本。 如果是测试版,它将有一个
连字符后跟 YYMMDD 加上一些更多的内部数据。 您可以将其用于“ifdef”
从其他品牌隐藏 makepp 特定的构造。

默认: “makepp --version”显示的相同值

PWD “CURDIR”的别名。

RM 默认: “rm -f”。 这适用于旧版 Makefile。 对于新的最好使用
直接内置 &rm 命令。 如果你想写一个虚假的干净规则,看看
“makeppclean -r”命令代替。


构建系统根目录的相对路径,即更上一层的目录
你有一个“RootMakeppfile(.mk)”。 如果你没有,这个变量是
空的。

SHELL
此变量仅在您“导出”它时才受到尊重。 在这种情况下,它是壳牌
它用于执行带有一些特殊字符的非内置操作(普通
直接执行的)。 在 Windows Strawberry 或 ActiveState Perl 上,如果您有
类 Unix 的 Shell,您必须改为将 SHELL 变量设置为以“sh”结尾的值
或“sh.exe” before 调用makepp。

默认: 第一个在“/usr/xpg4/bin/sh”(例如Solaris)或“/sbin/xpg4/sh”中找到
(例如 Reliant Unix)或“/ bin / sh的".

亚克力
默认: 第一个在“bison -y”或“yacc”中找到。

变量 Perl的
变量值存储为普通 Perl 标量,因此您可以直接从
Perl 代码,如果您需要对它们进行任何复杂的操作; 见 makepp_extending
了解详情。

从 Perl 访问全局变量是通过在它们前面加上“Mpp::global”来实现的
包裹。 实际上,当前makefile中尚未出现的任何变量,以及您
从此包中的assign to 将成为全球性的,就好像您刚刚发布了
它的“全局”声明。

然而,这种直接访问容易出错! 用户可能已经覆盖了这些变量
在命令行或通过环境。 在此之前加载的其他一些 makefile
人们可能已经将变量设为全局或特定于目标。 在这些情况下,你不会
找到变量的值,或者在赋值时,可能会带走它的属性
(相当于“覆盖”修饰符,目标细节除外。)

通过直接访问,您还可以绕过这些变量的扩展,如果它们是类型
“=”或“;=”。 像“$(CC)”这样的特殊变量从函数开始,直到它们
分配给。 所以在很多情况下你不会看到它们的价值。

由于这些原因,最好让 makepp 确定正确的值。 您可以使用
“makeperl”变体,其中在 Perl 代码获取之前已经评估了变量
解释:

makeperl { $$current_value = '$(MAKEFILE_VAR)' }

如果你需要在 makefile perl 块中的变量,这是通过 Perl 变量实现的
$makefile 如下:

perl { $current_value = $makefile->expand_variable('MAKE_VAR') }

函数总是获取作为第二个参数 $_[1] 传入的 makefile 对象:

sub f_f { $current_value = $_[1]->expand_variable('MAKE_VAR') }

命令应该在规则操作中调用,其中 makefile 对象是
可通过“$Mpp::Subs::rule->{MAKEFILE}”访问:

sub c_cmd { $current_value = $Mpp::Subs::rule->{MAKEFILE}->expand_variable('MAKE_VAR') }

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


免费服务器和工作站

下载 Windows 和 Linux 应用程序

  • 1
    深层清洁
    深层清洁
    核对所有构建的 Kotlin 脚本
    来自 Gradle/Android 项目的缓存。
    当 Gradle 或 IDE 允许您时很有用
    向下。 该脚本已经过测试
    macOS,但是...
    下载深度清理
  • 2
    Eclipse Checkstyle 插件
    Eclipse Checkstyle 插件
    Eclipse Checkstyle 插件
    集成了 Checkstyle Java 代码
    审计员进入 Eclipse IDE。 这
    插件提供实时反馈
    用户关于viol...
    下载 Eclipse Checkstyle 插件
  • 3
    AstrOrz播放器
    AstrOrz播放器
    AstrOrz Player 是一款免费的媒体播放器
    软件,部分基于 WMP 和 VLC。 这
    播放器采用极简风格,带有
    十多个主题色,还可以
    B ...
    下载 AstrOrzPlayer
  • 4
    电影启动器
    电影启动器
    Kodi Movistar+ TV 是 XBMC/ 的 ADDON
    Kodi 许可分配器
    IPTV服务解码器
    Movistar Integrado en uno de los
    媒体中心马...
    下载 movistartv
  • 5
    代码::块
    代码::块
    Code::Blocks 是一个免费的、开源的、
    跨平台 C、C++ 和 Fortran IDE
    专为满足最苛刻的需求而打造
    它的用户。 它的设计非常
    扩展...
    下载代码::Blocks
  • 6
    之中
    之中
    中间或高级 Minecraft 界面
    和数据/结构跟踪是一种工具
    显示 Minecraft 的概览
    世界,而无需实际创造它。 它
    能够 ...
    下载烟雨
  • 更多 ”

Linux 命令

Ad