规则
目标targets: 依赖prerequisites
【TAB】 命令command # 注释行 命令行必需以[Tab]键开始 , 反斜线之后不能有空格
目标
all: getPageInfo // 在Makefile中第一个目标是终极目标。
.PHONY: all clean // 没有依赖的目标称为“伪目标”。避免当有一个“clean”文件时,目标“clean”所在规则的命令无法执行。
命令
cd xxx; command // 每行的命令在同一个shell环境中执行,命令用分号分隔 or \
-rm edit $(objects) // 在命令行之前使用“-”,意思是忽略命令“rm”的执行错误。
@echo 'Building target: $@' // 命令前面有 @ 的作用: 不回显此命令
依赖
如果出现“-lNAME”格式的依赖时,表示需要搜索的依赖文件名为“libNAME.so”和“libNAME.a”,这是由变量“.LIBPATTERNS”指定的。
自动环境变量
“$@” 目标 ; $< 依赖集
“$^” 代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
“$?” 在这里表示依赖文件列表中被改变过的所有文件。
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
赋值符号
“=” // 定义的变量称之为“递归展开”式变量,其值可以在后面定义
RM := rm -rf // 直接展开式变量, 不能引用后面的定义
FOO ?= bar // 前面没有赋值,才赋值
C_SRCS += ./src/main.c // += 追加赋值
AA = $(EE) // 后面定义
EE = ee
BB := $(DD) // 前面定义
DD ?= ok // AA is ee, EE is ee, BB is null, DD is ok
在makefile外部传入参数
make -f make_simple explain DD=outside // 等号左后不能空格。BB is outside, DD is outside
模式字符% : “%.h”表示所有以“.h”结尾的文件
转义字符
$ 转义 $$
# 转义 \#
可使用的通配符: * ? []
1. 可在规则中直接使用
2. 其他地方,通过wildcard使用:如变量定义, objects = $(wildcard *.o)
使用shell
home = $(shell pwd) // 获得当前路径
特殊函数
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foreach <var>, <list>, <do>
files := $(foreach n,$(names),$(n).o) // names := a b c d , $(files)的值是“a.o b.o c.o d.o”
call <express>, <param1>, <param2>
foo = $(call reverse,a,b) // reverse = $(1) $(2) , foo的值就是“a b”
eval <express>
$(eval exe:b.c a.c) // 按照make展开: cc b.c a.c -o exe
$(notdir src/foo.c hacks)返回值是“foo.c hacks”
$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。
$(addprefix src/,foo bar)返回值是“src/foo src/bar”。
objects := $(wildcard *.o) // 通配符,将展开;而 objects = *.o ,类似宏,不会展开
patsubst <patten>, <replace>, <text>
$(patsubst %.c,%.o, x.c.c bar.c) // x.c.o bar.o
subst <from>, <to>, <text>
$(subst ee,EE,feet on the street) // 返回结果是“fEEt on the strEEt”
filter <patten>, <text>
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。 // filter-out 反过滤,去掉符合patten的
OBJ=a.o b.o c.o d.o main.o
define MA
main:$(OBJ)
gcc -g -o main $$(OBJ)
endef
$(eval $(call MA) )
make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm omap3_evm_config
CROSS_COMPILE : 编译器所使用的交叉工具链的名称
ARCH : 目标处理器的架构
make -f Makefile_simple
make -C ./test // 进入test,执行子目录中的makefile
make -w // 打印出进入的工作目录
make加上“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误
make的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令
-include // sinclude
include foo.make *.mk $(bar) // include foo.make a.mk b.mk c.mk e.mk f.mk
cd /home/hchen; pwd // 分号 前后命令有依赖关系
gcc part......................
cc -M main.c // main.o : main.c defs.h 如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来
gcc -MM main.c // main.o: main.c defs.h
dump----------------
root char *p = "welcome"; p[0] = 'W'; ok ? why // not ok, just not print "core dumped", but generate core file
ding : can execute, printf "core dumped" ,but can't generate core file
root: not printf, but have core file
why sudo can't printf"core dumped"?
in command line , why can't change much times?
echo 1 > core_uses_pid
backtrace_symbols // gcc -g -rdynamic