跳到主要内容

Makefile 常用方法

info/warning

功能:

  • 用于打印调试信息。
  • info 打印内容,warning 打印内容并附加行号。

调试:

可以使用 make -n 来打印命令但不执行,从而帮助调试。

示例:

$(warning $(LANGUAGES))  # 29行
$(info $(LANGUAGES)) # 30行
$(warning xxx) # 31行
$ make -n
Makefile:29: zh wd
zh wd
Makefile:31: xxx

subst

功能:

执行文本替换:将文本中所有出现的 from 替换为 to

用法:

$(subst from,to,text)

示例:

$(subst ee,EE,feet on the street)

输出:fEEt on the strEEt


wildcard

功能:

通过通配符返回文件列表,类似于 Python 的 glob

用法:

$(wildcard pattern)

示例:

获取 po 目录下所有以 .po 结尾的文件:

$(warning $(wildcard po/*.po))
# Makefile:20: po/zh.po po/wd.po

patsubst

功能:

替换字符串,可以使用 % 通配符,支持模式替换。

用法:

$(patsubst pattern,replacement,text)

区别:

  • subst 仅支持完全匹配替换。
  • patsubst 支持模式匹配。

示例:

text := Hello, world!
result := $(subst world,Makefile,$(text))

all:
@echo $(result) # 输出: Hello, Makefile!
files := src/foo.c src/bar.c src/baz.c
objects := $(patsubst src/%.c,build/%.o,$(files))

all:
@echo $(objects) # 输出: build/foo.o build/bar.o build/baz.o

addsuffix

功能:

为每个文件名添加后缀。

用法:

$(addsuffix suffix, names...)

示例:

$(addsuffix .c,foo bar)

返回值:foo.c bar.c


basename

功能:

从文件名中提取前缀部分(即点号 . 之前的部分)。

用法:

$(basename names...)

示例:

$(basename src/foo.c src-1.0/bar.c /home/jack/.font.cache-1 hacks)

提取文件名和去掉后缀:

filepath := src/foo.c

# 提取文件名
filename := $(notdir $(filepath))

# 去掉后缀
name_without_ext := $(basename $(filename))

all:
@echo "Filename: $(filename)" # 输出: foo.c
@echo "Name without extension: $(name_without_ext)" # 输出: foo

firstword

功能:

从字符串中提取第一个单词。

用法:

$(firstword text)

示例:

words := foo bar baz
first := $(firstword $(words))

all:
@echo $(first) # 输出: foo

strip

功能:

去除字符串开头和结尾的空格。

用法:

$(strip text)

示例:

text :=   foo bar baz   
stripped := $(strip $(text))

all:
@echo "$(stripped)" # 输出: foo bar baz

word

功能:

提取字符串中的第 N 个单词(单词以空格分隔)。

用法:

$(word N,text)

示例:

words := foo bar baz
second_word := $(word 2,$(words))

all:
@echo $(second_word) # 输出: bar