以前看 <跟我一起学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页自动化变量
$@
果然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页自动化变量
$@
转载于:https://blog.51cto.com/axlrose/1288970