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 支持一些内置函数,用于字符串操作、文件操作等。
相关推荐
带电的小王4 分钟前
sherpa-ncnn:Linux(x86/ARM32/ARM64)构建sherpa-ncnn --语音转文本大模型
linux·语音识别·实时音视频·sherpa-ncnn
沧浪之水!19 分钟前
【Linux网络】:套接字之UDP
linux·网络·udp
BranH21 分钟前
Linux系统中命令设定临时IP
linux·运维·服务器
秋风起,再归来~39 分钟前
【Linux庖丁解牛】—进程优先级!
linux·运维·服务器
cosX+sinY1 小时前
ubuntu 20.04 编译运行lio-sam,并保存为pcd
linux·ubuntu·机器人
Lary_Rock2 小时前
Android 编译问题 prebuilts/clang/host/linux-x86
android·linux·运维
熬夜学编程的小王2 小时前
【Linux篇】理解信号:如何通过信号让程序听从操作系统的指令
linux·信号产生·软件条件产生信号
绵绵细雨中的乡音2 小时前
Linux进程学习【基本认知】
linux·运维·学习
Johny_Zhao2 小时前
MySQL 高可用集群搭建部署
linux·人工智能·mysql·信息安全·云计算·shell·yum源·系统运维·itsm
珹洺3 小时前
Linux操作系统从入门到实战(三)Linux基础指令(上)
linux·运维·服务器