第三章、函数
1. 函数
函数是指实现了某些功能的指令或命令,通常一个函数有一个名称,这个名称代表这个指令或命令的序列。
Makefile 允许编写者自己定义函数和调用函数。Makefile 中已经定义了很多预置的函数供使用。
Makefile 函数调用的语法:
$(函数名 实际调用参数1,实际调用参数2,...)
# 或者
${函数名 实际调用参数1,实际调用参数2,...}
说明:
- 语法中
${}和$()的调用方式没有区别。在嵌套调用时可以使用不同的括号来区分调用的语法边界。 - 函数名和实际调用参数间要添加至少一个空格用于区分语法边界。
- 如果实际调用参数有两个或两个以上,则需要使用英文的逗号(
,)来进行分隔。 - 函数的实际调用参数由函数定义者规定,给出多余的实际调用参数会被忽略。
1.1 wildcard 函数
wildcard 函数 用于使用 星号(*)通配符搜索文件名,并返回找到的文件路径的列表。
调用格式:
$(wildcard pattern…)
说明:
- pattern... 通常是含有星号(
*)通配符的表达式。如:$(wildcard *.c)是搜索本地所有.c为后缀的文件并返回路径。$(wildcard *.c *.h)是搜索本地所有.c和.h为后缀的文件并返回路径。
示例:
改写之前的示例。让程序能搜索到所有的 .c 结尾的文件。让其作为变量 SOURCES 的值,改写后的 Makefile 如下:
.PHONY: all clean
# 调用 wildcard 函数动态获取所有的 .c 文件路径
SOURCES := $(wildcard *.c)
HEADERS := ${wildcard *.h} # 获取所有的 .h 文件路径
OBJECTS := file1.o file2.o main.o
TARGET := myapp
CC = gcc
CFLAGS = -g -Wall
all: $(TARGET)
$(TARGET) : $(OBJECTS)
gcc -o $@ $^
%.o : %.c $(HEADERS)
gcc -o $@ -c $<
clean:
rm $(OBJECTS)
使用 make 编译结果如下:
weimingze@mzstudio:~/myapp$ make
gcc -o file1.o -c file1.c
gcc -o file2.o -c file2.c
gcc -o main.o -c main.c
gcc -o myapp file1.o file2.o main.o
从运行结果可见使用 SOURCES := $(wildcard *.c) 代替前的 SOURCES := file1.c file2.c main.c 的效果是一样的。但使用函数时,我们可以动态的增加 .c 文件而不需要重新编写 Makefile 文件。
实验:
尝试使用 wildcard 函数修改自己的 Makefile 文件。