一、定义变量
1. 变量的基本语法
在 makefile
中,变量的定义和使用非常类似于编程语言中的变量。变量的定义格式(最好不要写空格)如下:
bash
VARIABLE_NAME=value
或者
bash
VARIABLE_NAME:=value
=
表示延迟赋值,变量的值在引用时才会被展开。:=
表示立即赋值,变量的值在定义时就会被展开。
2. 示例
bash
# 定义变量
CC=gcc
CFLAGS=-Wall -g
SRCS=main.c add.c sub.c
OBJS=$(SRCS:.c=.o)
# 使用变量
main: $(OBJS)
$(CC) $(CFLAGS) -o main $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
在这个示例中:
CC
定义了编译器为gcc
。CFLAGS
定义了编译选项为-Wall -g
。SRCS
定义了源文件列表。OBJS
使用模式替换将.c
文件列表转换为.o
文件列表。
3. 变量的引用
变量通过 $(VARIABLE_NAME)
或 ${VARIABLE_NAME}
的方式引用。例如,$(CC)
引用了 CC
变量的值。
二、注释
1. 注释的基本语法
在 makefile
中,注释以 #
开头,从 #
开始到行尾的内容都会被 make
忽略。
2. 示例
bash
# 这是一个注释,解释下面的规则
main: $(OBJS)
$(CC) $(CFLAGS) -o main $(OBJS) # 编译并链接生成可执行文件
# 定义编译器
CC = gcc # 使用 GCC 编译器
在这个示例中:
- 第一行的
# 这是一个注释,解释下面的规则
是一个注释,解释了main
目标的作用。 - 第三行的
# 编译并链接生成可执行文件
是一个注释,解释了$(CC) $(CFLAGS) -o main $(OBJS)
命令的作用。 - 第五行的
# 使用 GCC 编译器
是一个注释,解释了CC
变量的作用。
三、特殊变量
1. 自动变量
make
提供了一些自动变量,这些变量在规则的命令部分中非常有用:
$@
:表示目标文件。$<
:表示第一个依赖文件。$^
:表示所有依赖文件。$?
:表示比目标文件新的依赖文件。
2. 示例
bash
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
在这个示例中:
$<
表示第一个依赖文件(即.c
文件)。$@
表示目标文件(即.o
文件)。
3. 预定义变量
make
还提供了一些预定义变量,例如:
SHELL
:指定使用的 shell。MAKEFLAGS
:传递给make
的选项。
4. 示例
bash
SHELL = /bin/bash
MAKEFLAGS += -s # 静默模式
在这个示例中:
SHELL
变量指定了使用的 shell 为/bin/bash
。MAKEFLAGS
变量添加了-s
选项,使make
在静默模式下运行。
四、条件语句
1. 基本语法
makefile
支持条件语句,可以根据不同的条件执行不同的命令。条件语句的语法如下:
bash
ifeq (arg1, arg2)
# 如果 arg1 等于 arg2,执行这里的命令
else
# 如果 arg1 不等于 arg2,执行这里的命令
endif
2. 示例
bash
ifeq ($(DEBUG), 1)
CFLAGS += -g
else
CFLAGS += -O2
endif
在这个示例中:
- 如果
DEBUG
变量的值为1
,则添加-g
编译选项。 - 否则,添加
-O2
编译选项。
五、函数
1. 基本语法
makefile
支持一些内置函数,可以用于字符串操作、文件操作等。函数的语法如下:
bash
$(function_name, arguments)
2. 示例
bash
# 替换 .c 为 .o
OBJS = $(SRCS:.c=.o)
# 获取文件列表的长度
NUM_OBJS = $(words $(OBJS))
# 查找文件
SRC_DIR = src
HDR_DIR = include
SRCS = $(wildcard $(SRC_DIR)/*.c)
HDRS = $(wildcard $(HDR_DIR)/*.h)
在这个示例中:
$(SRCS:.c=.o)
将SRCS
变量中的.c
替换为.o
。$(words $(OBJS))
计算OBJS
变量中的文件数量。$(wildcard $(SRC_DIR)/*.c)
查找SRC_DIR
目录下的所有.c
文件。
六、总结
- 定义变量 :使用
VARIABLE_NAME = value
或VARIABLE_NAME := value
定义变量,通过$(VARIABLE_NAME)
引用变量。 - 注释 :以
#
开头的行是注释,用于解释代码的作用。 - 特殊变量 :
make
提供了一些自动变量(如$@
、$<
、$^
)和预定义变量(如SHELL
、MAKEFLAGS
)。 - 条件语句 :使用
ifeq
和else
进行条件判断。 - 函数 :
makefile
支持一些内置函数,用于字符串操作、文件操作等。