以前看 <跟我一起学makefile>看得云里雾里的 今天空闲时间快速看了 gnu-make-doc-zh_CN-1.3.pdf
果然power的东东,从139页到141页打印了下来,空了再看回 <跟我一起学makefile>看看,之前因为不会写makefile所以学了一下 CMake

TARGET:PREREQUISITES...
[tab] command

objects = main.o kdb.o ....
edit: $(objects)
[tab] cc -o edit $(objects)

.PHONY:clean ==>伪规则
clean:
[tab] rm $(objects)  

-rm xxx ==> -后面加命令代表忽略执行错误

include foo*.mk $(bar)
-include   跟前面提到的-rm类似

p21
变量MAKEFILE_LIST
p24
foo:
frobnicate >foo
%:force
   @$(MAKE) -f Makefile $@
force:;

2.9.1变量取值 p25
IMMEDIATE = DEFERRED
IMMEDIATE ?= DEFERRED
IMMEDIATE := DEFERRED
IMMEDIATE += DEFERRED

define IMMEDIATE
    DEFERRED
Endef


规则语法
TARGETS : PREREQIOSTES; COMMAND
    COMMAND

因为"$"有特殊的含义所以要用到 $时可以 $$来代替

print: *.c
    lpr -p $?
    touch print
自动环境变量 "$?" 用在这里表示依赖文件

p31页 函数wildcard
objects := $(patsubst %.c, %.o,$(wildcard *.c))
foo: $(objects)
    cc -o foo $(objects)

p32页
3.5.1 一般搜索(变量VPATH) make可识别一个特殊变量"VPATH"
通过变量“VPATH”可以指定依赖文件的搜索路径
VPATH=src:../headers
选择性搜索(关键字vpath)

自动变量 "$^"代表所有的是通过目录搜索得到的依赖文件的完整路径名
(目录+一般文件名)列表
"$@" 代表规则的目标
foo.o : foo.c
    cc -c $(CLFLAGS) $^ -o $@

VPATH=src:../headers
foo.o:foo.c defs.h hack.h
    cc -c $(CFLAGS) $< -o $@

"$<" 代夫规则中通过目录搜索到的依赖文件列表第一个依赖文件

-l库名
foo:foo.c lcurses
    cc $^ -o $@

SUBDIRS=foo bar baz
subdirs:
    for dir in $(SUBDIRS); do \
        $(MAKE) -C $$dir; \ #$$dir ==> ${dir}
    done

p40页
强制目标(没有命令或依赖的规则)
clean: FORCE
    rm $(objects)
FORCE:

.SUFFIXES 特殊目标"SUFFIXES"的所有依赖 后缀
.DEFAULT
.PRECIOUS

3.13双冒号规则 p48页
4.1 命令回显
@echo 开始编译xxx模块

4.8 空命令 p65
target: ;

5.2.3如何定义一个空格 p70
nullstring :=
spcae := $(nullstring) #end of the line

5.3.1 变量的替换引用 p72
${VAR:A=B}
foo := a.o b.o c.o
bar := $(foo:.o=.c) #把所有.o换成 .c


%.o:CFLAGS += -O 所有的.o文件编译要用-O选项


6.1条件 p85
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

6.2.1.1关键字"ifeq"
ifeq(ARG1,ARG2)
ifeq'ARG1' 'ARG2'
ifeq "ARG1" "ARG2"
ifeq "ARG1" 'ARG2'
ifeq 'ARG1' "ARG2"

ifneq 不等于

7.1函数的调用语法 p90
$(FUNCTION ARGUMENTS)
${FUNCTION ARGUMENTS}

$(subst FROM,TO, TEXT) 字符串替换函数 把TEXT中的FROM字符替换为TO
$(subst ee,EE,feet on the street) 把文中的ee替换为EE

$(patsubst PATTERN,REPLACE,TEXT)
$(strip STRINT) 去除空格
$(findstring FIND,IN) 查找是否在中
$(sort LIST)
$(word N, TEXT)
$(dir NAMES...)
$(basename NAMES)
$(addsuffix SUFFIX,NAMES..) 加后缀函数
$(if CONDITION,THEN-PART[,ELSE-PART])
$(shell cat foo) 调用shell命令

ifdef ERROR1
$(error error is $(ERROR1))
endif

$(warning TEXT...)

make -t 命令来改变已存在的所有的目标文件的时间戳

P128页
模式规则
%可以匹配任何非空字符
s%.c 代表s开头的如 sabc.c

P130页自动化变量
$@