gnumake中文手册v38学习780393736_完整内容摘要:

cd” 进入一个目录时, “ w” 选项会被自动打开。 主控 make 可以使用选项 “ s” ( “ slient” )来禁止此选项。 另外, make 的命令行选项 “ noprintdirectory” ,将禁止所有关于目录信息的打印。  变 量名是大小写敏感的。 变量 “foo” 、 “Foo” 和 “FOO” 指的是三个不同的变量。 Makefile 传统做法是变量名是全采用 大写的方式。 推荐的做法是在对于内部定义定义的一般 变量(例如:目标文件列表 objects)使用小写方式,而对于一些参数列表(例如:编译选项 CFLAGS)采用大写方式  当我们定义了一个变量之后,就可以在 Makefile 的很多地方使用这个变量。 变量的引用方式是: “$ ( VARIABLE_NAME) ” 或者“${ VARIABLE_NAME }” 来引用一个变量的定义。  注意: Makefile 中在对一些简单变量的引用,我们也可以不使用 “ () ”和 “{}” 来标记变量名,而直 接使用 “$x” 的格式 来实现,此种用法仅限于 变量名为单字符的情况。 另外自动化变量也使用这种格式。 对于一般多字符变量的引用必须使用括号了标记,否则 make 将把变量名的首 字母作为作为变量而不是整个字符串( “$PATH” 在 Makefile 中实际上是 “$(P)ATH” )。 这一点和 shell 中变量的引用方式不同。 shell 中变量的引用可以是 “${xx}” 或者 “$xx” 格式。 但在 Makefile 中多字符变量名的引用只能是 “$(xx)” 或者 “${xx}” 格 式。  一般在我们书写 Makefile 时,各部分变量引用的格式我们建议如下: 1. make 变量( Makefile 中定义的或者是 make 的环境变量)的引用使用“$(VAR)” 格式 ,无论 “VAR” 是单字符变量名还是多字符变量名。 2. 出现在 规则命令行中 shell 变量(一般为执行命令过程中的临时变量,它不属于 Makefile 变量,而是一个 shell 变量)引用使用 shell 的“$tmp” 格式。 3. 对 出现在命令行中的 make 变量我们同样使用 “$(CMDVAR)” 格式来引用。 例如: sample Makefile „„ SUBDIRS := src foo .PHONY : subdir Subdir : @for dir in $(SUBDIRS)。 do \ $(MAKE) – C $$dir || exit 1。 \ done „„  下边我们来看一个复杂一点的例子。 分析一下直接展开式变量定义( :=)的用法,这里也用到了 make 的 shell 函数和变量 “MAKELEVEL” (此变量在 make 的递归调用时代表 make 的调用深度)。 其中包括了对函数、条件表达式和系统变量 “MAKELEVEL” 的使用: ifeq (0,${MAKELEVEL}) curdir := $(shell pwd) whoami := $(shell whoami) hosttype := $(shell arch) MAKE := ${MAKE} hosttype=${hosttype} whoami=${whoami} endif 第一行是一个条件判断,如果是顶层 Makefile,就定义下列变量。 否则不定义任何变量。 第二、三、四、五行分别定义了一个变量,在进行变量定义时对引用到的其它变量和函数展开。 最后结 束定义。 利用直接展开式的特点我们可以书写这样一个规则: ${subdirs}: ${MAKE} curdir=${curdir}/$@ C $@ all 它实现了在不同子目录下变量 “cur_dir” 使用不同的值(为当前工作目录)。  在 复杂的 Makefile 中,推荐使用直接展开式变量。 因为这种风格变量的使用方式和大多数编程语言中的变量使用方式基本上相同。 它可以使一个比较复杂的 Makefile 在一定程度上具有可预测性。 而且这种变量允许我们利用之前所定义的值来重新定义它(比如使用某一个函数 来对它以前的值进行处理并重新赋 值),此方式在 Makefile 中经常用到。 尽量避免和减少递归式变量的使用。  “ 自动化变量 ” ,诸如 “$^” 等。 规则命令行中的自动化变量 “$^” 代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。 “$@” 代表规则的目标。 所以对于一个规则我们可以进行如下的描述: : cc c $(CFLAGS) $^ o $@  第六章: Makefile 中的变量 需要全部阅读 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  通常我们会使用它来判断一个变量的值是否为空(不是任何字符)。 参数值可能是通过引用变量或者函数得到的,因而在展开过程中可能造成参数值中包含空字符(空格等)。 一般在这种情况时我们使用 make 的 “strip”函数 来对它变量的值进行处理,去掉其中的空字符。 格式为: ifeq ($(strip $(foo)),) TEXTIFEMPTY endif  条件判断 o ifeq, ifneq o ifdef, ifndef 对于 “ifdef” 需要 说明的是: ifdef 只是测试一个变量是否有值,不会对变量进行替换展开来判断变量的值是否为空。 对于变量“VARIABLE NAME” ,除了 “VARIABLE NAME=” 这种情况和从未定义该变量以外,使用其它方式对它的定义都会使 “ifdef” 返回真。 就是说,即使我们通过其它方式(比如,定义它的值引用了 其它的变量)给它赋了一个空值, “ifdef” 也会返回真。  因此当我们需要判断一个变量的值是否为空的情况时,需要使用 “ifeq”(或者 “ifneq” )而不是 “ifdef”。  make 的内嵌函数 GNU make 函数的调用格式类似于变量的引用,以 “$” 开始表示一个引用。 语法格式如下: $(FUNCTION ARGUMENTS) 或者: ${FUNCTION ARGUMENTS} 对于函数调用的格式有以下几点说明: 调用语法格式中 “FUNCTION” 是需要调用的函数名,它应该是 make 内嵌的函数名。 对于 用户自己的函数需要通过 make 的 “call” 函数来间接调用。 函数处理参数时, 参数中如果存在对其它变量或者函数的引用,首先对这些引用进行展开得到参数的实际内容, 而后才对它们进行处理。  以下是 GNU make 内 嵌的文本(字符串)处理函数 o $(subst FROM,TO,TEXT) o $(patsubst PATTERN,REPLACEMENT,TEXT) o $(strip STRINT) “strip” 函数经常用在条件判断语句的表达式中,确保表达式比较的可靠和健壮。 o $(findstring FIND,IN) o $(filter PATTERN„,TEXT) o $(filterout PATTERN...,TEXT) o $(word N,TEXT) o $(wordlist S,E,TEXT) o $(words TEXT) o $(firstword NAMES„)  文件名处理函数 o $(suffix NAMES„) o $(basename NAMES„) o $(addsuffix SUFFIX,NAMES„) o $(addprefix PREFIX,NAMES„) o $(join LIST1,LIST2) o $(wildcard PATTERN) o $(foreach VAR,LIST,TEXT)  dirs := a b c d files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) ===  files := $(wildcard a/* b/* c/* d/*) o $(if CONDITION,THENPART[,ELSEPART])  SUBDIR += $(if $(SRC_DIR) $(SRC_DIR),/home/src) o eval函数 o shell 函数  函数 “shell” 所实现的功能和 shell 中的引用( ``)相同  函数的返回结果是此命令在 shell 中的执行结果。 make 仅仅对它的回返结果进行处理; make 将函数返回结果中的所有换行符( “ \n” )或者一对 “ \n\r” 替换为单 空格;并去掉末尾的回车符号( “ \n” )或者 “ \n\r”。  当引用 “shell” 函数的变量定义使用直接展开式定义时可以保证函数的展开是在 make 读入 Makefile 时完成。 后续对此变量的引用就不会有展开过程。 这样就可以避免规则命令行中的变量引用在命令行执行时展开的情况发生  内嵌变量 “CFLAGS” 代表了 gcc 编译器编译源文件的编译选项,我们就可以在 Makefile 中重新定义它,来改变编译源文件所要使用的参数。  sample Makefile CUR_DIR = $(shell pwd) INCS := $(CUR_DIR)/include CFLAGS := Wall – I$(INCS) EXEF := foo bar .PHONY : all clea。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。