1.make自动寻找makefile或者Makefile文件
或者make -f mymake.mk
make -I /home/danae/...... #include 会在这个目录下寻找
2.第一个目标文件作为最终生成文件
3. .PHONY:clean #伪目标
clean:
-rm edi $(objects) #忽略错误
4.命令必须以<TAB>开头,以@开头,不打印命令,直接执行
@echo $(DIR)
5. 包含其他的makefile文件
-include foo.make a.mk b.mk c.mk #如果在指定目录下没有找到,仍然会执行下面的命令
6.vpath %.c foo:bar
vapth % blish #.c结尾的文件现在foo目录,然后bar,然后blish目录寻找
7.自动化变量
$@:目标集
$<:依赖目标集
需要理解:
objects = foo.o
bar.o
$(objects):%.o:%.c # $(filter %.o, $(objects)):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
8.自动生成依赖关系:根据.c文件中的include“”,找到依赖关系,在.d文件中保存。
例如:
gcc -M main.c # cc-MM main.c 不包含标准库头文件
输出main.o:main.c defs.h
9.关于命令执行
cd /usr/local; pwd #在一行写
10.总控makefile,每个子目录下面还有一个makefile,通常要传输变量过去
用法:
subsystem:
BUILD_OPTIONS = "POCO_LIB_DIR=$(POCO_LIB_DIR)"
BUILD_OPTIONS +="COMMON_INC_DIR=$(COMMON_INC_DIR)"
$(MAKE) -C subdir $(BUILD_OPTIONS) #BUILD_OPTIONS中放变量,首先进入subdir目录下,再执行make
11.对于相同的命令,用#define定义命令包
用法:
define run-yacc
yacc $(firstword $^) # $^代表foo.y?????????
mv y.tab.c $@
endef
调用命令 : $(run-yacc)
12.变量定义的三种方法区别
1.name = bar $(NAME)
2.NAME := bar $(NAME)
3.NAME?=bar
13.
变量值的替换
用法:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
14.判断ifeq
空格
用法:#根据不同的编译方式,使用不同的库
f
oo:$(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
15.自带函数的使用-字符串处理函数
1)subst-字符串替换
$(subst <from>,<to>,<text>)
$(subst ee, EE, feet on the street)
2)strip--去空格函数
$(strip <text>)
$(strip a b c )
3)findstring--在in中找find字符串
$(findstring <find>,<in>)
$(findstring a, a b) #返回a
$(findstring a, b c) #返回空
4)filter--过滤
$(filter <pattern>,<text>)
sources := foo.c bar.c baz.s ugh.h
foo : $(sources) #格式 : 目标项:依赖项
cc $(filter %.c %.s $(sources)) -o foo
5)sort--会去掉相同单词
$(sort foo bar lose)
6)word--去第几个单词
$(word <n>,<text>)
$(word 2, a b c) #返回b
7)wordlist
$(wordlist 2, 5,a b c d e f g h) #返回b c d e
8)words-统计单词的个数
$(words,a b c d e f g h) #返回
8
16.
自带函数的使用-文件名操作函数
1)dir--路径
$(dir /home/danae/a.c b.cpp) -->/home/danae ./
2)notdir--文件名
$(notdir /home/danae/a.c b.cpp) -->a.c b.c
3)suffix--文件名后缀
$(suffix /home/danae/a.c b.cpp) -->.c .cpp
4)basename--除去后缀
$(basename /home/danae/a.c b.cpp) -->/home/danae/a b
5)addsuffix--加后缀
$(addsuffix .c /home/danae/a b) -->/home/danae/a.c /home/danae/b.c
6)addprefix--加前缀路径
$(addprefix /home/danae/ a.c b.cpp) -->/home/danae/a.c /home/danae/b.cpp
7)join--联合字符串
$(join /home/danae/ ./ a.c b.cpp d.p) -->/home/danae/a.c ./b.cpp d.p
#多对多
17.foreach循环
18.if函数
19.call函数
20.origin函数
21.shell函数
files := $(shell echo *.c)
22.编译C隐含规则
23.编译C++隐含规则
24.命令的变量
CC:cc
CXX:g++
CPP:$(CC) -E
25.命令参数的变量
26.自动化变量
$@:
$%:
$^:
$<: