Linux makefile的一些语法

一、定义变量
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 = valueVARIABLE_NAME := value 定义变量,通过 $(VARIABLE_NAME) 引用变量。
  • ​注释​ :以 # 开头的行是注释,用于解释代码的作用。
  • ​特殊变量​make 提供了一些自动变量(如 $@$<$^)和预定义变量(如 SHELLMAKEFLAGS)。
  • ​条件语句​ :使用 ifeqelse 进行条件判断。
  • ​函数​makefile 支持一些内置函数,用于字符串操作、文件操作等。
相关推荐
大白的编程日记.23 分钟前
【Linux学习笔记】信号的深入理解之软件条件产生信号
linux·笔记·学习
buyutang_31 分钟前
C/C++ Linux系统编程:线程控制详解,从线程创建到线程终止
linux·c语言·c++·学习
云的牧人44 分钟前
Ubuntu 22 redis集群搭建
linux·运维·ubuntu
siriuuus1 小时前
Linux 磁盘扩容及分区相关操作实践
linux·运维·服务器
To_再飞行1 小时前
K8s 存储配置资源
linux·云原生·容器·kubernetes
小猪写代码1 小时前
Ubuntu 文件权限管理
linux·ubuntu
jz_ddk2 小时前
[Linux] Linux标准块设备驱动详解:从原理到实现
linux·运维·服务器·驱动开发
Gss7772 小时前
ansible变量+管理机密
linux·运维·ansible
误入运维泥潭2 小时前
Ansible自动化运维:从入门到精通
linux·ansible·module
半梦半醒*2 小时前
ansible阶段练习题
linux·运维·自动化·ansible·负载均衡·运维开发