您的位置:首页 > 其它

GNU make中文手册v3.8笔记

2010-10-20 17:24 295 查看
记录一些要点。

Make --help
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
-B, --always-make Unconditionally make all targets.
-C DIRECTORY, --directory=DIRECTORY
Change to DIRECTORY before doing anything.
-d Print lots of debugging information.
--debug[=FLAGS] Print various types of debugging information.
-e, --environment-overrides
Environment variables override makefiles.
-f FILE, --file=FILE, --makefile=FILE
Read FILE as a makefile.
-h, --help Print this message and exit.
-i, --ignore-errors Ignore errors from commands.
-I DIRECTORY, --include-dir=DIRECTORY
Search DIRECTORY for included makefiles.
-j
, --jobs[=N] Allow N jobs at once; infinite jobs with no arg.
-k, --keep-going Keep going when some targets can't be made.
-l
, --load-average[=N], --max-load[=N]
Don't start multiple jobs unless load is below N.
-n, --just-print, --dry-run, --recon
Don't actually run any commands; just print them.
-o FILE, --old-file=FILE, --assume-old=FILE
Consider FILE to be very old and don't remake it.
-p, --print-data-base Print make's internal database.
-q, --question Run no commands; exit status says if up to date.
-r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
-s, --silent, --quiet Don't echo commands.
-S, --no-keep-going, --stop
Turns off -k.
-t, --touch Touch targets instead of remaking them.
-v, --version Print the version number of make and exit.
-w, --print-directory Print the current directory.
--no-print-directory Turn off -w, even if it was turned on implicitly.
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
Consider FILE to be infinitely new.
--warn-undefined-variables Warn when an undefined variable is referenced.
一、 概述

链接:ld工具,ELF格式

静态库: 文档文件Archive file,多个.o文件的集合,ar工具

共享库:多个.o文件的集合,具备可执行条件。libdl.so提供支持。

二、 GNU make介绍

.PHONY:clean
clean :
-rm edit $(objects)
加- 来忽略执行错误。
通过.PHONY特殊目标clean目标声明为伪目标。

三、 Makefile总述

包含五个部分:显式规则,隐含规则,变量定义,指示符,注释

搜索顺序:GNUmakefile makefile Makefile

包含其他makefile文件:include -include

变量: MAKEFILES,MAKEFILE_LIST, .VARIABLES

变量取值: = ?= := += define endef

条件语句: ifdef ifeq ifndef ifneq

总结:make的执行过程如下:
1. 依次读取变量“MAKEFILES”定义的makefile文件列表
2. 读取工作目录下的makefile文件(根据命名的查找顺序“GNUmakefile”, “makefile”,“Makefile”,首先找到那个就读取那个)
3. 依次读取工作目录makefile文件中使用指示符“include”包含的文件
4. 查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)
5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
8. 执行“终极目标”所在的规则
说明:
执行一个规则的过程是这样的:
对于一个存在的规则(明确规则和隐含规则)首先,make程序将比较目标文件和所有的依赖文件的时间戳。如果目标的时间戳比所有依赖文件的时间戳更新(依赖文件在上一次执行make之后没有被修改),那么什么也不做。否则(依赖文件中的某一个或者全部在上一次执行make后已经被修改过),规则所定义的重建目标的命令将会被执行。这就是make工作的基础,也是其执行规制所定义命令的依据。

四、 Makefile规则
文件名使用通配符: * ?[…]

函数wildcard: $(wildcard *.c)
$(patsubst %.c,%.o,$(wildcard *.c))

目录搜索:
一般搜索:VPATH=src:../headers
选择性搜索: vpath 可以使用%来匹配一个或多个字符。

五、 规则的命令
有一些shell命令行组成

命令的回显 @echo

命令执行:

命令执行的错误: - make忽略命令执行失败

Make的递归执行:
subsystem:
cd subdir && $(MAKE)

subsystem:
$(MAKE) -C subdir

变量和递归: export 将变量传递给子make
unexport

六、 Makefile中的变量
变量的引用: $(foo) ${foo}

七、 Makefile的条件执行
……
libs_for_gcc = -lgnu
normal_libs =
……
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
……

ifneq
ifdef
ifndef

八、 make的内嵌函数
函数的调用语法:$(FUNCTION ARGUMENTS) ${FUNCTION ARGUMENTS}

文本处理函数:
$(subst FROM,TO,TEXT) //字符串替换函数
$(patsubst PATTERN,REPLACEMENT,TEXT) //模式替换函数
$(strip STRINT) //去空格函数
$(findstring FIND,IN) //查找字符串函数
$(filter PATTERN…,TEXT) //过滤函数
$(filter-out PATTERN...,TEXT) //反过滤函数
$(sort LIST) //排序函数
$(word N,TEXT) //取单词函数
$(wordlist S,E,TEXT) //取字串函数
$(words TEXT) //统计单词数目函数
$(firstword NAMES…) //取首单词函数

文件名处理函数:
$(dir NAMES…) //取目录函数
$(notdir NAMES…) //取文件名函数
$(suffix NAMES…) //取后缀函数
$(basename NAMES…) //取前缀函数
$(addsuffix SUFFIX,NAMES…) //加后缀函数
$(addprefix PREFIX,NAMES…) //加前缀函数
$(join LIST1,LIST2) //单词连接函数
$(wildcard PATTERN) //获取匹配模式文件名函数

$(foreach VAR,LIST,TEXT)

$(if CONDITION,THEN-PART[,ELSE-PART])

$(call VARIABLE,PARAM,PARAM,...)

$(value VARIABLE)

eval函数

$(origin VARIABLE)

shell函数

make的控制函数:

$(error TEXT…)

$(warning TEXT…)

九、 执行make

指定makefile: make –f

指定终极目标:部分标准的伪目标和空目标命名:
all clean mostlyclean distclean realclean clobber install print tar shar dist TAGS check test

十、 make的隐含规则
隐含变量
代表命令的变量:
AR AS CC CXX CO CPP FC GET LEX PC YACC YACCR MAKEINFO TEX TEXI2DVI WEAVE CWEAVE TANGLE CTANGLE RM
命令参数的变量:
ARFLAGS ASFLAGS CFLAGS CXXFLAGS COFLAGS CPPFLAGS FFLAGS GFLAGS LDFLAGS LFLAGS PFLAGS RFLAGS YFLAGS

模式匹配 :%

自动化变量:
$@ $% $< $? $^ $+ $* $(@D) $(@F) $(*D) $(*F) $(%D) $(%F) $(
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: