Makefile
预定义变量
AR
:归档维护程序的名称,默认值为ar
CC
:C编译器的名称,默认值为cc
CXX
:C++编译器的名称,默认值为g++
$@
:目标的完整名称
$<
:第一个依赖文件的名称
$^
:所有的依赖文件
模式匹配
%.o: %.c
$(CC) -c $^ -o $@
函数
$(wildcard PATTERN...)
# 功能:获取指定目录下指定类型的文件列表
# 参数:PATTERN指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
# 返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
# 示例:
$(wildcard *.c ./sub/*.c)
# 返回值格式:a.c b.c c.c d.c e.c f.c
$(patsubst <pattern>,<replacement>,<text>)
# 功能:查找<text>中的单词(单词以“空格"、“Tab"或“回车"“换行"分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换
# <pattern>可以包括通配符`%`,表示任意长度的字串。如果<replacement>中也包含`%`,那么,<replacement>中的这个`%`将是<pattern>中的那个`%`所代表的字串。(可以用`\`来转义,以`\%`来表示真实含义的`%`字符)
# 返回:函数返回被替换过后的字符串
# 示例:
$(patsubst %.c, %.o, x.c bar.c)
# 返回值格式:x.o bar.o
# 伪目标 .PHONY:目标
# 目标 ...: 依赖 ...
# 命令
# ...
# shell pwd
make_dir:=$(shell pwd) # := 的意思是将$(shell pwd) 表示为make_dir,类似于宏定义
make_dir2:=$(pwd)
all:
@echo $(make_dir) # 有输出
@echo $(make_dir2) # 无输出
# lastword && MAKEFILE_LIST
# MAKEFILE_LIST的变量, 它是个列表变量, 在每次make读入一个make文件时, 都把它添加到最后一项,gnu make 有效。
# lastword 返回names中的最后一个字符串,names以空格进行分隔 $(lastword foo bar lose) 返回 lose
parent_dir_fname:=$(shell pwd)/$(lastword $(MAKEFILE_LIST))
all:
@echo $(parent_dir_fname)
# dirname
# dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个/后无字符,dirname 命令使用倒数第二个/,并忽略其后的所有字符。dirname 和 basename 通常在 shell 内部命令替换使用,以指定一个与指定输入文件名略有差异的输出文件名。
dir2:=$(shell pwd)/$(lastword $(MAKEFILE_LIST))
name:=$(lastword $(MAKEFILE_LIST))
dir=$(shell dirname $(dir2))
all:
@echo $(dir)
@echo $(dir2)
@echo $(name)