Makefile

Makefile

Posted by Kenshin on May 11, 2023
本文字符数:英文164字 | 中文1543字

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)