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 支持一些内置函数,用于字符串操作、文件操作等。
相关推荐
愚润求学29 分钟前
Linux开发工具——apt
linux·服务器·开发语言
杰克逊的日记36 分钟前
CentOs系统部署DNS服务
linux·python·centos·dns
知立1 小时前
嵌入式Linux开发环境搭建,三种方式:虚拟机、物理机、WSL
linux·开发环境·嵌入式linux
the_nov1 小时前
25.Reactor
linux·c++
小王努力学编程2 小时前
【Linux系统编程】进程概念,进程状态
linux·运维·服务器·c++
aoxiang_ywj2 小时前
【Linux】内核驱动学习笔记(二)
linux·笔记·学习
liuliu03233 小时前
戴尔笔记本 ubuntu 22.04 开机后进入initramfs界面
linux·运维·ubuntu
熬夜苦读学习3 小时前
Linux进程信号
linux·c++·算法
to future_3 小时前
非阻塞IO,fcntl,多路转接,select,poll,epoll,reactor
linux·网络协议
榆榆欸3 小时前
14.主从Reactor+线程池模式,Connection对象引用计数的深入分析
linux·服务器·网络·c++·tcp/ip