第三章、函数

1. 函数

函数是指实现了某些功能的指令或命令,通常一个函数有一个名称,这个名称代表这个指令或命令的序列。

Makefile 允许编写者自己定义函数和调用函数。Makefile 中已经定义了很多预置的函数供使用。

Makefile 函数调用的语法:

$(函数名 实际调用参数1,实际调用参数2,...)
# 或者
${函数名 实际调用参数1,实际调用参数2,...}

说明:

  1. 语法中 ${}$() 的调用方式没有区别。在嵌套调用时可以使用不同的括号来区分调用的语法边界。
  2. 函数名实际调用参数间要添加至少一个空格用于区分语法边界。
  3. 如果实际调用参数有两个或两个以上,则需要使用英文的逗号(,)来进行分隔。
  4. 函数的实际调用参数由函数定义者规定,给出多余的实际调用参数会被忽略。

1.1 wildcard 函数

wildcard 函数 用于使用 星号(*)通配符搜索文件名,并返回找到的文件路径的列表。

调用格式:

$(wildcard pattern)

说明:

示例:

改写之前的示例。让程序能搜索到所有的 .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 文件。